一、Deployment创建 Pod的原理
-
使用kubectl通过kube-apiserver发送部署请求( 命令如下:kubectl apply-f deployment.yaml)
-
kube-apiserver将Deployment资源持久化到etcd
-
Deployment controller监听到创建了一个新的Deployment 资源后,将其从队列中拉出,根据deployment的描述创建一个ReplicaSet资源,并持久化回etcd
-
同时,当replicaset controller监听到创建了一个新的replicaset资源,将其从队列中拉出,根据描述创建pod资源
-
scheduler监测发现新的pod资源,根据调度规则将pod绑定到合适的Node节点,更改pod资源中的nodeName字段后写入 etcd 中
-
kubelet每隔 20s(可以自定义)向kube-apiserver通过NodeName 获取自身Node上所要运行的pod清单
-
通过容器运行时(譬如Docker)启动pod中的容器
二、创建Deployment的yaml文件
特别强调:该yaml文件未指定命名空间,创建的pod默认在default命名空间
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploytest
spec:
replicas: 1 #指定要运行的 Pod 副本数量为1,可更改
selector:
matchLabels:
app: nginx-deploytest
template:
metadata:
labels:
app: nginx-deploytest
spec:
containers:
- name: nginxtest
image: nginx:1.17.1
三、具体操作
[root@master ~]# touch nginx-deploytest.yaml
[root@master ~]# vi nginx-deploytest.yaml
You have new mail in /var/spool/mail/root
[root@master ~]# kubectl apply -f nginx-deploytest.yaml
deployment.apps/nginx-deploytest created
#查询一下当前namespace下的Pod控制器
[root@master ~]# kubectl get deploy -n default
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deploytest 1/1 1 1 23h
#修改资源
[root@master ~]# kubectl edit deployment nginx-deploytest
将以下字段spec.replicas修改为2,该参数是设定创建的pod的数目
spec:
progressDeadlineSeconds: 600
replicas: 2
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx-deploytest
# 查看Pod,且以下命令可以查看到pod所在node节点
[root@master ~]# kubectl get pods -owide
NAME READY STATUS RESTARTS AGE
nginx-deploytest-585f5788cb-n54qt 1/1 Running 0 29h
nginx-deploytest-585f5788cb-wxwwp 1/1 Running 0 2d22h
#查看当前namespace<default>下的Pods
[root@master ~]# kubectl get pods -n default
NAME READY STATUS RESTARTS AGE
nginx-deploytest-585f5788cb-n54qt 1/1 Running 0 30h
nginx-deploytest-585f5788cb-wxwwp 1/1 Running 0 2d22h
#删除pod节点:nginx-deploytest-585f5788cb-wxwwp
[root@master ~]# kubectl delete pod nginx-deploytest-585f5788cb-wxwwp -n default
pod "nginx-deploytest-585f5788cb-wxwwp" deleted
You have new mail in /var/spool/mail/root
# 再次查看pod节点,发现集群重新创建了一个pod
[root@master ~]# kubectl get pods -n default
NAME READY STATUS RESTARTS AGE
nginx-deploytest-585f5788cb-2sqws 1/1 Running 0 6s
nginx-deploytest-585f5788cb-n54qt 1/1 Running 0 30h
四、总结
采用pod控制器创建pod,删除pod后,pod控制器仍然会重新创建一个pod。 故而,这也是K8S集群使用pod控制器创建pod的重要原因。