我们知道 Kubernetes 支持两种创建资源的方式:命令和配置文件。在上文中我介绍了前者(点击查看),下面我接着介绍后者:通过配置文件创建资源。
二、运行 Deployment(使用配置文件)
1,基本用法
(1)首先我创建一个配置文件(nginx.yml),里面配置好所有资源的属性,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | apiVersion: extensions/v1beta1 # apiVersion 是当前配置格式的版本 kind: Deployment # kind 是要创建的资源类型,这里是 Deployment metadata: # metadata 是该资源的元数据,name 是必需的元数据项 name: nginx-deployment spec: # spec 部分是该 Deployment 的规格说明 replicas: 2 # replicas 指明副本数量,默认为 1 template: # template 定义 Pod 的模板,这是配置文件的重要部分 metadata: # metadata 定义 Pod 的元数据,至少要定义一个 label。label 的 key 和 value 可以任意指定。 labels: app: web_server spec: # pec 描述 Pod 的规格,此部分定义 Pod 中每一个容器的属性,name 和 image 是必需的。 containers: - name: nginx image: nginx:1.7.9 |
(2)然后通过 kubectl apply 命令进行创建即可。
注意:kubectl apply 不但能够创建 Kubernetes 资源,也能对资源进行更新,非常方便。
1 | kubectl apply -f nginx.yml |
(3)部署成功后,可以通过 kubectl get 查看 nginx-deployment 的各种资源:
1 2 3 | kubectl get deployment kubectl get replicaset kubectl get pod -o wide |
2,伸缩(Scale)
(1)伸缩是指在线增加或减少 Pod 的副本数。比如我们修改 nginx.yml 文件内容,将副本改成 3 个。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | apiVersion: extensions/v1beta1 # apiVersion 是当前配置格式的版本 kind: Deployment # kind 是要创建的资源类型,这里是 Deployment metadata: # metadata 是该资源的元数据,name 是必需的元数据项 name: nginx-deployment spec: # spec 部分是该 Deployment 的规格说明 replicas: 3 # replicas 指明副本数量,默认为 1 template: # template 定义 Pod 的模板,这是配置文件的重要部分 metadata: # metadata 定义 Pod 的元数据,至少要定义一个 label。label 的 key 和 value 可以任意指定。 labels: app: web_server spec: # pec 描述 Pod 的规格,此部分定义 Pod 中每一个容器的属性,name 和 image 是必需的。 containers: - name: nginx image: nginx:1.7.9 |
(2)再次执行 kubectl apply 命令,可以看到副本数变成了 3 个。
1 | kubectl apply -f nginx.yml |
3,用 label 控制 pod 的位置
默认情况下,scheduler 会将 pod 调度到所有可用的 Node,不过有些情况我们希望将 Pod 部署到指定的 Node,比如:
将有大量磁盘 I/O 的 Pod 部署到配置了 SSD 的 Node;
或者 Pod 需要 GPU,需要运行在配置了 GPU 的节点上。
Kubernetes 通过 label 来实现这个功能。label 是 key-value 对,各种资源都可以设置 label,灵活添加各种自定义属性。
(1)比如下面命令(master 节点上执行)会给 node2 节点打上一个 ssd 的标签(将其标注为配置了 SSD 的节点):
1 | kubectl label node node2 disktype=ssd |
(2)然后通过如下命令可以查看节点的 label。注意:除了 disktype,可以看到 Node 还有几个 Kubernetes 自己维护的 label。
1 | kubectl get node --show-labels |
(3)在 nginx.yml 文件中定义 nodeselector 为这个自定义标签,就可以指定 pod 在 node2 中运行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 2 template: metadata: labels: app: web_server spec: containers: - name: nginx image: nginx:1.7.9 nodeSelector: disktype: ssd |
(4)最后我们执行 kubectl apply 命令进行部署,可以看到两个副本都是运行在 node2 上。
1 | kubectl apply -f nginx.yml |
(5)如果要删除 label 也很简单。执行如下命令则可删除 node2 的 disktype 标注。
注意:删除标签后 Pod 并不会重新部署,所以 pod 依旧是在 node2 上。除非删除或注释掉配置文件中的 nodeSelector 配置,然后通过 kubectl apply 重新部署。
1 | kubectl label node node2 disktype- |
附:删除 Deployment
既然可以通过 yml 配置文件来运行 Deployment,当然也可以使用它来来删除对应的 Deployment。下面是一个简单的样例:
1 | kubectl delete -f nginx.yml |
原文链接:https://www.hangge.com/blog/cache/detail_2430.html