

K8s 创建资源的两种方式-51CTO.COM
source link: https://os.51cto.com/article/707801.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

在 K8s 中,创建资源有两种方式:
- 直接使用 kubectl run 命令创建
- 使用 kubectl create/apply 命令从 YAML 文件创建
在本文中,我将通过示例解释这两种方法,以及它们分别应该在何时使用。
kubectl run
kubectl run 命令在 pod 中创建并运行特定的镜像。例如:
$ kubectl run nginx --image=nginx --port 80
pod/nginx created
$ kubectl get po nginx
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 25s
如果您对这个新 pod 执行 kubectl describe 命令,您将看到:
$ kubectl describe po nginx
Name: nginx
Namespace: default
Priority: 0
Node: ip-10-0-0-146.ec2.internal/10.0.0.146
Start Time: Sat, 09 Apr 2022 16:56:29 -0400
Labels: run=nginx
Annotations: kubernetes.io/psp: eks.privileged
Status: Running
IP: 10.0.0.69
IPs:
IP: 10.0.0.69
请注意,Labels 是 run=nginx。
您还可以在 run 命令中指定环境变量,例如:
$ kubectl run nginx --image=nginx --port 80 --env="DNS_DOMAIN=cluster" --env="POD_NAMESPACE=default"
如果您现在执行 kubectl describe nginx,就可以看到我们刚刚提供的新环境变量:
$ kubectl describe po nginx | grep "Env" -A2
Environment:
DNS_DOMAIN: cluster
POD_NAMESPACE: default
通常,kubectl run 命令用于一些简单、直观和快速的任务,它适用于 ad-hoc(点对点网络模式)的测试或实验。
kubectl kubectl create/apply
kubectl create/apply 命令基于给定的配置文件。该配置文件具有以下特点:
- 配置文件描述了应用程序最终将达到的 Whatstate。
- 配置文件提供创建资源的模板,可以重复部署。
- 部署可以像代码一样进行管理。
- 适用于正式的、跨环境的、大规模的部署。
- 需要熟悉配置文件的语法才能使用此方法。
让我们再看一个例子。我们将创建相同的 nginx pod,这一次,让我们通过 YAML 文件来完成:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
不用在意 Deployment 文件语法,我将在另一篇文章中讨论 K8s Deployment。
让我们使用 kubectl create 命令来创建资源:
$ kubectl create -f nginx-deployment.yaml
deployment.apps/nginx created
$ kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-k7tfl 1/1 Running 0 5s
$ kubectl delete -f nginx-deployment.yaml
deployment.apps "nginx" deleted
您还可以使用 kubectl apply 命令:
$ kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx created
$ kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-2fsxk 1/1 Running 0 17s
$ kubectl delete -f nginx-deployment.yaml
deployment.apps "nginx" deleted
可以看到,create 和 apply 命令都可以用来创建资源,但是二者有什么区别呢?
kubectl create 与 kubectl apply
让我们谈谈 create 和 apply 之间的区别。
create
此命令将告诉 K8s API 服务器,您要创建、删除或替换一个或多个资源。以更简化的方式,这意味着您可以从头开始创建一个全新的对象。或者,它通过定义需求对任何现有对象进行一些更改。
apply
此命令意味着通过在给定的 YAML 文件中声明您确切需要的内容来更改已经存在的对象。
为了演示,让我们使用 nginx Deployment 文件。首先,让我们创建资源:
$ kubectl create -f nginx-deployment.yaml
deployment.apps/nginx created
现在,假设我们要向 pod 添加一个 label,将 label 更新为:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
env: prod
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
env: prod
spec:
containers:
- name: nginx
image: nginx
如果再次运行 create 命令:
$ kubectl create -f nginx-deployment.yaml
Error from server (AlreadyExists): error when creating "nginx-deployment.yaml": deployments.apps "nginx" already exists
即使 YAML 文件略有不同,您也会收到 “nginx” 已存在的错误。
那如果你运行 kubectl apply 呢?让我们试一试:
$ kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx configured
现在让我们描述一下资源:
$ kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-595f565474-zkl4t 1/1 Running 0 3m39s
$ kubectl describe po nginx-595f565474-zkl4t
Name: nginx-595f565474-zkl4t
Namespace: default
Priority: 0
Node: ip-10-0-0-146.ec2.internal/10.0.0.146
Start Time: Sat, 09 Apr 2022 17:20:04 -0400
Labels: app=nginx
env=prod
pod-template-hash=595f565474
您可以看到应用了新的 labels 是 env=prod。
现在我们了解了 kubectl create 和 kubectl apply 之间的区别,您可能想知道应该使用哪一个?
在 kubectl create 命令中,我们指定了一个特定行为,也就是 create,因此它是一种更具命令式的方法。在 kubectl apply 命令中,我们指定系统的目标状态,而不指定一个特定的行为,因此它是更具声明性的方法。我们让系统决定采取什么行动。如果资源不存在,它将创建它,如果资源存在,则它将配置应用于现有资源。
简单来说,如果对单个文件运行一个操作来创建资源,create 和 apply 基本是相同的。但是,apply 允许您在一个目录中的多个文件上同时创建和修补。
我希望你喜欢这个小知识分享,我会在下一篇文章中见到你!
Recommend
-
77
相信大家都听说过Spring框架。 Spring从诞生到现在一直是流行的J2EE开发框架。 随着Spring的发展,它的功能越来越强大,随之而来的缺点也越来越明显,以至于发展到后来变得越来越臃肿,使用起来也非常的麻烦。
-
68
RDD转变为DataFrame的两种方法
-
23
该文章正在审核中 如有...
-
16
作者简介:熊学涛,北京世纪互联宽带数据中心有限公司网络运维中心,网络运维总监。近二十年运营商、互联网公司工作经验。在超大规模数据中心组网、运营商级广域网领域有着丰富的项目经验,毕业...
-
13
k8s 各个资源对象创建测试
-
6
创建后台任务的两种代码模式 后台任务是每个App都需要的一些行为,毕竟主线程是大爷,拖不起,伤不起,脏活累活都只能在不见天日的后台去做。 最简单的后台任务,可以说是直接开一个线程就可以了,或者说来个Service,再开个线程。但这些并不...
-
8
《IntelliJ IDEA 插件开发》第一节:两种方式创建插件工程持续坚持原创输出,点击蓝字关注我吧 作者:小傅哥博客:https://bugstack.cn ❝ 沉淀、分享、成长,让自己和他人都能有所收获!😜
-
7
两种不同的密码管理工具:Bitwarden vs 1Password-51CTO.COM 两种不同的密码管理工具:Bitwarden vs 1Password 译文 ...
-
11
一.系统环境 服务器版本 docker软件版本 CPU架构 CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 x86_64
-
7
VolumesEmptyDir类型的Volume在Pod分配到Node上时被创建,Kubernetes会在Node上自动分配一个目录,因此无需指定宿主机Node上对应的目录文件。这个目录的...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK