前面介绍了rs控制器,replicaSet ,了解到该控制器是用来维护集群中进行的pod数量的,但是往往在实际操作的时候,我们反而不会去直接使用rs,而是会使用更上层的控制器,deployment是一个非常重要的功能就是实现了pod的滚动更新,比如我们应用更新了,我们值需要更新我们的容器镜像,然后丢该deployment里面的pod模板镜像,那么deployment就会用滚动更新rolling update的方式升级现在的pod,这个能力是非常重要的,因为对于线上的服务我们需要做到不中断服务,所以滚动更新就成了必须的一个功能,而deployment这个能力的实现,依赖的就是rs这个资源对象,实际上我们可以通俗的理解就是每个deployment就对应集群中的一次部署。
deployment资源对象的格式和repliaSet几乎一直,如下资源对象就是一个常见的deployment资源类型
[root@master1 ~]# cat nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
[root@master1 ~]# kubectl describe pod nginx-deploy-845d4d9dff-9n4r7
Name: nginx-deploy-845d4d9dff-9n4r7
Namespace: default
Priority: 0
Node: node1/192.168.1.127
Start Time: Sat, 07 May 2022 04:23:43 -0400
Labels: app=nginx
pod-template-hash=845d4d9dff
Annotations: podpreset.admission.kubernetes.io/podpreset-time-preset: 236960
Status: Running
IP: 10.244.1.51
IPs:
IP: 10.244.1.51
Controlled By: ReplicaSet/nginx-deploy-845d4d9dff
Containers:
nginx:
Container ID: docker://8ef7456c346511df79d6ec14fde3484ec8b6bb85987d4555759132c114fa3a42
Image: nginx
Image ID: docker-pullable://nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Sat, 07 May 2022 04:23:46 -0400
Ready: True
Restart Count: 0
Environment:
Mounts:
/etc/localtime from localtime (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-sbhsk (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
localtime:
Type: HostPath (bare host directory volume)
Path: /etc/localtime
HostPathType:
default-token-sbhsk:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-sbhsk
Optional: false
QoS Class: BestEffort
Node-Selectors:
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 13m default-scheduler Successfully assigned default/nginx-deploy-845d4d9dff-9n4r7 to node1
Normal Pulled 13m kubelet Container image "nginx" already present on machine
Normal Created 13m kubelet Created container nginx
Normal Started 13m kubelet Started container nginx
我们仔细查看其中的。controlled By :replicaSet /nginx-deploy-
[root@master1 ~]# kubectl describe rs nginx-deploy-5d59d67564
Name: nginx-deploy-5d59d67564
Namespace: default
Selector: app=nginx,pod-template-hash=5d59d67564
Labels: app=nginx
pod-template-hash=5d59d67564
Annotations: deployment.kubernetes.io/desired-replicas: 4
deployment.kubernetes.io/max-replicas: 5
deployment.kubernetes.io/revision: 3
deployment.kubernetes.io/revision-history: 1
Controlled By: Deployment/nginx-deploy
Replicas: 0 current / 0 desired
Pods Status: 0 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=nginx
pod-template-hash=5d59d67564
Containers:
nginx:
Image: nginx:1.7.9
Port: 80/TCP
Host Port: 0/TCP
Environment:
Mounts:
Volumes:
Events:
我们查看rs的详细信息
kubectl describe rs ,里面有controlled By : deployment /nginx-deploy 。意思就是我们的pod依赖的控制器rs实际上被我们的deployment控制着,
[root@master1 ~]# kubectl describe rs nginx-deploy-845d4d9dff
Name: nginx-deploy-845d4d9dff
Namespace: default
Selector: app=nginx,pod-template-hash=845d4d9dff
Labels: app=nginx
pod-template-hash=845d4d9dff
Annotations: deployment.kubernetes.io/desired-replicas: 3
deployment.kubernetes.io/max-replicas: 4
deployment.kubernetes.io/revision: 5
Controlled By: Deployment/nginx-deploy
Replicas: 3 current / 3 desired
Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=nginx
pod-template-hash=845d4d9dff
Containers:
nginx:
Image: nginx
Port: 80/TCP
Host Port: 0/TCP
Environment:
Mounts:
Volumes:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 26m replicaset-controller Created pod: nginx-deploy-845d4d9dff-9n4r7
Normal SuccessfulCreate 26m replicaset-controller Created pod: nginx-deploy-845d4d9dff-sqn2r
Normal SuccessfulCreate 26m replicaset-controller Created pod: nginx-deploy-845d4d9dff-t9gw6
这个有个小插曲,因为之前使用过rs一度以为deployment会受replicas的影响,后来发现describe里有写。replicaSet作用和之前一样还是来保证pod的个数始终保存指定的数量,所以deployment中的容器restartPolicy=always,因为容器必须始终保证自己处于running状态,replicaSetcai
可以去明确调整pod的个数,deployment是通过管理replicaSet的数量和属性来实现水平扩展。收缩,以及滚动更新两个功能的。
水平伸缩
水平扩展收缩的功能比较简单,因为replicaSet就可以实现,所以deployment控制器只需要去修改它控制 的replicaSet的pod副本数量就可以了。比如我们吧pod的副本调整到4,deployment所对应的replicaSet就会自动创建一个新的pod出来,这样就水平扩展了
kubectl scale deploy nginx-deploy --replicas=4
kubectl scale deploy name -- replicase= #
[root@master1 ~]# kubectl describe rs nginx-deploy-845d4d9df
Name: nginx-deploy-845d4d9dff
Namespace: default
Selector: app=nginx,pod-template-hash=845d4d9dff
Labels: app=nginx
pod-template-hash=845d4d9dff
Annotations: deployment.kubernetes.io/desired-replicas: 2
deployment.kubernetes.io/max-replicas: 3
deployment.kubernetes.io/revision: 5
Controlled By: Deployment/nginx-deploy
Replicas: 2 current / 2 desired
Pods Status: 2 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=nginx
pod-template-hash=845d4d9dff
Containers:
nginx:
Image: nginx
Port: 80/TCP
Host Port: 0/TCP
Environment:
Mounts:
Volumes:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 8m32s replicaset-controller Created pod: nginx-deploy-845d4d9dff-thfnd
Normal SuccessfulDelete 4m29s replicaset-controller Deleted pod: nginx-deploy-845d4d9dff-t9gw6
Normal SuccessfulDelete 4m29s replicaset-controller Deleted pod: nginx-deploy-845d4d9dff-thfnd
可以看到replicaSet控制器增加了一个新的pod,同样的deployment资源对象的时间中也可以看到完成了扩容的操作
[root@master1 ~]# kubectl describe deploy nginx-deploy Name: nginx-deploy Namespace: default CreationTimestamp: Thu, 21 Apr 2022 23:11:17 -0400 Labels:Annotations: deployment.kubernetes.io/revision: 5 Selector: app=nginx Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: app=nginx Containers: nginx: Image: nginx Port: 80/TCP Host Port: 0/TCP Environment: Mounts: Volumes: Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable OldReplicaSets: NewReplicaSet: nginx-deploy-845d4d9dff (2/2 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 11m deployment-controller Scaled up replica set nginx-deploy-845d4d9dff to 4 Normal ScalingReplicaSet 7m51s deployment-controller Scaled down replica set nginx-deploy-845d4d9dff to 2
滚动更新
如果只是水平扩展收缩这两个功能,就完全没有必须要设计deployment这个资源对象了,deployment最突出的一个功能是支持滚动更新,下一篇再说



