kubernetes Deployment 学习
kubernetes-Deployment 学习
虽然ReplicaSet可以确保在任何给定时间运行的Pod副本达到指定的数量,但是Deployment(部署)是一个更高级的概念,它管理ReplicaSet并为Pod和ReplicaSet提供声明性更新以及许多其他有用的功能,所以建议在实际使用中,使用Deployment代替ReplicaSet。
如果在Deployment对象中描述了所需的状态,Deployment控制器就会以可控制的速率将实际状态更改为期望状态。也可以在Deployment中创建新的ReplicaSet,或者删除现有的Deployment并使用新的Deployment部署所用的资源。
创建Deployment
创建一个Deployment文件,并命名为dc-nginx.yaml,用于部署三个Nginx Pod
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80Copy to clipboardErrorCopied
示例解析:
- nginx-deployment:Deployment的名称。
- replicas: 创建Pod的副本数。
- selector:定义Deployment如何找到要管理的Pod,与template的label(标签)对应。
- template字段包含以下字段:
- app: nginx使用label(标签)标记Pod
- spec:表示Pod运行一个名字为nginx的容器。
- image:运行此Pod使用的镜像
- Port:容器用于发送和接收流量的端口
使用kubectl create创建此Deployment
[root@instance-gvpb80ao yaml]# kubectl create -f deployment.yaml
deployment.apps/nginx-deployment createdCopy to clipboardErrorCopied
查看Deployment
[root@instance-gvpb80ao yaml]# kubectl get -f deployment.yaml
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 1/3 3 1 6sCopy to clipboardErrorCopied
查看部署信息
[root@instance-gvpb80ao yaml]# kubectl describe deployments.apps nginx-deployment
Name: nginx-deployment
Namespace: default
CreationTimestamp: Fri, 18 Sep 2020 23:04:12 +0800
Labels: app=nginx
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=nginx
Replicas: 3 desired | 3 updated | 3 total | 3 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: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-deployment-7848d4b86f (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 2m2s deployment-controller Scaled up replica set nginx-deployment-7848d4b86f to 3 Copy to clipboardErrorCopied
查看Deployment创建的ReplicaSet
[root@instance-gvpb80ao yaml]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-7848d4b86f 3 3 3 4m7sCopy to clipboardErrorCopied
更新
一般对应用程序升级或者版本迭代时,会通过Deployment对Pod进行滚动更新。
设置镜像
[root@instance-gvpb80ao yaml]# kubectl set image deployment nginx-deployment nginx=nginx:1.18.0
deployment.apps/nginx-deployment image updatedCopy to clipboardErrorCopied
修改镜像
[root@instance-gvpb80ao yaml]# kubectl edit deployments.apps nginx-deployment
deployment.apps/nginx-deployment editedCopy to clipboardErrorCopied
查看更新状态
[root@instance-gvpb80ao yaml]# kubectl set image deployment nginx-deployment nginx=nginx:1.16.0
deployment.apps/nginx-deployment image updated
[root@instance-gvpb80ao yaml]# kubectl rollout status deployment nginx-deployment
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
deployment "nginx-deployment" successfully rolled outCopy to clipboardErrorCopied
查看Replication
[root@instance-gvpb80ao yaml]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-55d6b67f5b 0 0 0 2m42s
nginx-deployment-6b658bf589 0 0 0 5m12s
nginx-deployment-7848d4b86f 0 0 0 12m
nginx-deployment-dc8c8775 3 3 3 83sCopy to clipboardErrorCopied
查看Deployment部署状态
[root@instance-gvpb80ao yaml]# kubectl describe deployments.apps
Name: nginx-deployment
Namespace: default
CreationTimestamp: Fri, 18 Sep 2020 23:04:12 +0800
Labels: app=nginx
Annotations: deployment.kubernetes.io/revision: 4
Selector: app=nginx
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx:1.16.0
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-deployment-dc8c8775 (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 15m deployment-controller Scaled up replica set nginx-deployment-7848d4b86f to 3
Normal ScalingReplicaSet 8m22s deployment-controller Scaled up replica set nginx-deployment-6b658bf589 to 1
Normal ScalingReplicaSet 8m2s deployment-controller Scaled down replica set nginx-deployment-7848d4b86f to 2
Normal ScalingReplicaSet 8m2s deployment-controller Scaled up replica set nginx-deployment-6b658bf589 to 2
Normal ScalingReplicaSet 7m59s deployment-controller Scaled down replica set nginx-deployment-7848d4b86f to 1
Normal ScalingReplicaSet 7m59s deployment-controller Scaled up replica set nginx-deployment-6b658bf589 to 3
Normal ScalingReplicaSet 7m53s deployment-controller Scaled down replica set nginx-deployment-7848d4b86f to 0
Normal ScalingReplicaSet 5m52s deployment-controller Scaled up replica set nginx-deployment-55d6b67f5b to 1
Normal ScalingReplicaSet 5m19s deployment-controller Scaled down replica set nginx-deployment-6b658bf589 to 2
Normal ScalingReplicaSet 3m49s (x10 over 5m19s) deployment-controller (combined from similar events): Scaled down replica set nginx-deployment-55d6b67f5b to 0
Name: test
Namespace: default
CreationTimestamp: Wed, 16 Sep 2020 16:43:01 +0800
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=test
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=test
Containers:
nginx:
Image: nginx
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Progressing True NewReplicaSetAvailable
Available True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: test-5f6778868d (2/2 replicas created)
Events: <none>Copy to clipboardErrorCopied
在describe中可以看出,第一次创建时,它创建了一个名为nginx-deployment-7848d4b86f的ReplicaSet,并直接将其扩展为3个副本。更新部署时,它创建了一个新的ReplicaSet,命名为nginx-deployment-6b658bf589,并将其副本数扩展为1,然后将旧的ReplicaSet缩小为2,这样至少可以有2个Pod可用,最多创建了4个Pod。以此类推,使用相同的滚动更新策略向上和向下扩展新旧ReplicaSet,最终新的ReplicaSet可以拥有3个副本,并将旧的ReplicaSet缩小为0。
回滚
当新版本不稳定时,可以对其进行回滚操作,默认情况下,所有Deployment的rollout历史都保留在系统中,可以随时回滚。
构建历史
[root@instance-gvpb80ao yaml]# kubectl rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3 <none>
4 <none>
5 kubectl set image deployment nginx-deployment nginx=alvinos/django:v1 --record=true
6 kubectl set image deployment nginx-deployment nginx=alvinos/django:v2 --record=trueCopy to clipboardErrorCopied
--record
:将部署命令记录到历史。
回滚上一个版本
[root@instance-gvpb80ao yaml]# kubectl rollout undo deployment nginx-deployment
deployment.apps/nginx-deployment rolled back
[root@instance-gvpb80ao yaml]# kubectl describe deployments.apps nginx-deployment
Name: nginx-deployment
Namespace: default
CreationTimestamp: Fri, 18 Sep 2020 23:04:12 +0800
Labels: app=nginx
Annotations: deployment.kubernetes.io/revision: 7
kubernetes.io/change-cause: kubectl set image deployment nginx-deployment nginx=alvinos/django:v1 --record=true
Selector: app=nginx
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: alvinos/django:v1
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-deployment-6fff65f5cb (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 27m deployment-controller Scaled up replica set nginx-deployment-7848d4b86f to 3
Normal ScalingReplicaSet 19m deployment-controller Scaled up replica set nginx-deployment-6b658bf589 to 1
Normal ScalingReplicaSet 19m deployment-controller Scaled down replica set nginx-deployment-7848d4b86f to 2
Normal ScalingReplicaSet 19m deployment-controller Scaled up replica set nginx-deployment-6b658bf589 to 2
Normal ScalingReplicaSet 19m deployment-controller Scaled down replica set nginx-deployment-7848d4b86f to 1
Normal ScalingReplicaSet 19m deployment-controller Scaled up replica set nginx-deployment-6b658bf589 to 3
Normal ScalingReplicaSet 19m deployment-controller Scaled down replica set nginx-deployment-7848d4b86f to 0
Normal ScalingReplicaSet 17m deployment-controller Scaled up replica set nginx-deployment-55d6b67f5b to 1
Normal ScalingReplicaSet 16m deployment-controller Scaled down replica set nginx-deployment-6b658bf589 to 2
Normal ScalingReplicaSet 5m38s (x19 over 16m) deployment-controller (combined from similar events): Scaled up replica set nginx-deployment-8bb5777df to 3
Normal ScalingReplicaSet 47s deployment-controller Scaled up replica set nginx-deployment-6fff65f5cb to 1Copy to clipboardErrorCopied
我们可以看到回滚到了上一个版本。
回滚指定版本
[root@instance-gvpb80ao yaml]# kubectl rollout undo deployment nginx-deployment --to-revision=3
deployment.apps/nginx-deployment rolled backCopy to clipboardErrorCopied
使用--to-revision
参数回到指定版本。
扩容
当公司访问量变大,三个Pod已无法支撑业务时,可以对其进行扩展。
[root@instance-gvpb80ao yaml]# kubectl scale deployment nginx-deployment --replicas=5
deployment.apps/nginx-deployment scaled
[root@instance-gvpb80ao yaml]# kubectl get -f deployment.yaml
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 4/5 5 4 31m