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: namespace: workspace name: nginx-deployment # Deployment的名称。 labels: app: nginx spec: replicas: 3 # 创建pod的副本数 selector: # 定义Deployment如何找到要管理的东西Pod,与template的label(
标签)对应。 matchLabels: app: nginx # Pod的label标签 template: metadata: labels: app: nginx spec: # 表示Pod运行一个名字为nginx的容器 containers: - name: nginx image: nginx:1.7.9 # 运行此pod使用的镜像 ports: - containerPort: 80 # 容器用于发送和接收流量的端口
- 使用kubectlcreate创建此Deployment
[root@master01 yaml]# kubectl create -f dc-nginx.yaml deployment.apps/nginx-deployment created
- 使用kubectl get或者kubectl describe查看此Deployment
NAME READY UP-TO-DATE AVAILABLE AGE nginx-deployment 3/3 3 3 7m56s
- 查看此时Deployment rollout的状态:
[root@master01 yaml]# kubectl rollout status deployment/nginx-deployment -n workspace deployment "nginx-deployment" successfully rolled out
- 查看此Deployment创建的ReplicaSet
[root@master01 yaml]# kubectl get rs -n workspace NAME DESIRED CURRENT READY AGE nginx-deployment-5d5967564 3 3 3 12m
- 查看此Deployment创建的Pod
[root@master01 yaml]# kubectl get po -n workspace --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-deployment-5d59d67564-8cqb4 1/1 Running 0 14m app=nginx,pod-template-hash=5d59d67564
nginx-deployment-5d59d67564-gltz8 1/1 Running 0 14m app=nginx,pod-template-hash=5d59d67564
nginx-deployment-5d59d67564-p7trc 1/1 Running 0 14m app=nginx,pod-template-hash=5d59d67564
更新Deployment
-
一般对应用程序升级或者版本迭代时,会通过Deployment对Pod进行滚动更新。
-
将nginx Pod的image版本更新到1.9.1
[root@master01 yaml]# kubectl set image deployment nginx-deployment nginx=nginx:1.9.1 -n workspace --record
deployment.apps/nginx-deployment image updated
- 当然可以直接编辑Deployment, 效果相同
[root@master01 yaml]# kubectl edit deploy -n workspace nginx-deployment
- 查看Deployment的更新状态
[root@master01 yaml]# kubectl describe deployments.apps -n workspace nginx-deployment
Name: nginx-deployment
Namespace: workspace
CreationTimestamp: Fri, 20 May 2022 08:43:48 +0800
Labels: app=nginx
Annotations: deployment.kubernetes.io/revision: 2
kubernetes.io/change-cause: kubectl set image deployment nginx-deployment nginx=nginx:1.9.1 --namespace=workspace --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: nginx:1.9.1
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-5bfdf46dc6 (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 4d13h deployment-controller Scaled up replica set nginx-deployment-f7ccf9478 to 3
Warning ReplicaSetCreateError 2m10s deployment-controller Failed to create new replica set "nginx-deployment-5bfdf46dc6": Unauthorized
Normal ScalingReplicaSet 2m10s deployment-controller Scaled up replica set nginx-deployment-5bfdf46dc6 to 1
Normal ScalingReplicaSet 108s deployment-controller Scaled down replica set nginx-deployment-f7ccf9478 to 2
Normal ScalingReplicaSet 107s deployment-controller Scaled up replica set nginx-deployment-5bfdf46dc6 to 2
Normal ScalingReplicaSet 61s deployment-controller Scaled down replica set nginx-deployment-f7ccf9478 to 1
Normal ScalingReplicaSet 61s deployment-controller Scaled up replica set nginx-deployment-5bfdf46dc6 to 3
Normal ScalingReplicaSet 37s deployment-controller Scaled down replica set nginx-deployment-f7ccf9478 to 0
- 查看Deployment更新历史
[root@master01 ~]# kubectl rollout history -n workspace deployment/nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 <none>
2 kubectl set image deployment nginx-deployment nginx=nginx:1.9.1 --namespace=workspace --record=true
3 kubectl set image deployment nginx-deployment nginx=nginx:1.9.1 --namespace=workspace --record=true
4 kubectl set image deployment nginx-deployment nginx=nginx:1.9.1 --namespace=workspace --record=true
5 kubectl set image deployment nginx-deployment nginx=nginx:1.10.3 --namespace=workspace --record=true
- 查看Deployment某次更新的详细信息,使用–revision指定版本号
[root@master01 ~]# kubectl rollout history -n workspace deployment/nginx-deployment --revision=2
deployment.apps/nginx-deployment with revision #2
Pod Template:
Labels: app=nginx
pod-template-hash=69c44dfb78
Annotations: kubernetes.io/change-cause: kubectl set image deployment nginx-deployment nginx=nginx:1.9.1 --namespace=workspace --record=true
Containers:
nginx:
Image: nginx:1.9.1
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
更新回滚
- 使用–to-revision参数回到指定版本
[root@master01 ~]# kubectl rollout undo -n workspace deployment/nginx-deployment --to-revision=2
deployment.apps/nginx-deployment rolled back
- 查看更新历史, revision 2 更改为了最新的7
[root@master01 ~]# kubectl rollout history -n workspace deployment/nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 <none>
3 kubectl set image deployment nginx-deployment nginx=nginx:1.9.1 --namespace=workspace --record=true
4 kubectl set image deployment nginx-deployment nginx=nginx:1.9.1 --namespace=workspace --record=true
5 kubectl set image deployment nginx-deployment nginx=nginx:1.10.3 --namespace=workspace --record=true
6 kubectl set image deployment nginx-deployment nginx=nginx:1.10.4 --namespace=workspace --record=true
7 kubectl set image deployment nginx-deployment nginx=nginx:1.9.1 --namespace=workspace --record=true
- 查看Pod的镜像版本
[root@master01 ~]# kubectl describe po -n workspace nginx-deployment-69c44dfb78-zv9vl | grep Image
Image: nginx:1.9.1
Image ID: docker-pullable://nginx@sha256:2f68b99bc0d6d25d0c56876b924ec20418544ff28e1fb89a4c27679a40da811b
扩展Deployment
- 当公司访问量变大,三个Pod已无法支撑业务时,可以对其进行扩展。
[root@master01 ~]# kubectl scale -n workspace deployment/nginx-deployment --replicas=5
deployment.apps/nginx-deployment scaled
[root@master01 ~]# kubectl get po -n workspace
NAME READY STATUS RESTARTS AGE
nginx-deployment-69c44dfb78-pjkwb 1/1 Running 0 6m3s
nginx-deployment-69c44dfb78-shw9d 1/1 Running 0 33s
nginx-deployment-69c44dfb78-tgsmn 1/1 Running 0 33s
nginx-deployment-69c44dfb78-v4mxp 1/1 Running 0 6m5s
nginx-deployment-69c44dfb78-zv9vl 1/1 Running 0 6m1s
暂停和恢复Deployment更新
- Deployment支持暂停更新,用于对Deployment进行多次修改操作。
[root@master01 ~]# kubectl rollout pause deployment/nginx-deployment -n workspace
deployment.apps/nginx-deployment paused
[root@master01 ~]# kubectl set image -n workspace deployment/nginx-deployment nginx=nginx:1.11.1
deployment.apps/nginx-deployment image updated
[root@master01 ~]# kubectl set resources -n workspace deployment/nginx-deployment -c=nginx --limits=cpu=500m,memory=1Gi --requests=cpu=100m,memory=64Mi
deployment.apps/nginx-deployment resource requirements updated
[root@master01 ~]# kubectl rollout history deployment/nginx-deployment -n workspace
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 <none>
3 kubectl set image deployment nginx-deployment nginx=nginx:1.9.1 --namespace=workspace --record=true
4 kubectl set image deployment nginx-deployment nginx=nginx:1.9.1 --namespace=workspace --record=true
5 kubectl set image deployment nginx-deployment nginx=nginx:1.10.3 --namespace=workspace --record=true
6 kubectl set image deployment nginx-deployment nginx=nginx:1.10.4 --namespace=workspace --record=true
7 kubectl set image deployment nginx-deployment nginx=nginx:1.9.1 --namespace=workspace --record=true
[root@master01 ~]# kubectl rollout resume deployment/nginx-deployment -n workspace
deployment.apps/nginx-deployment resumed
[root@master01 ~]# kubectl get rs -n workspace
NAME DESIRED CURRENT READY AGE
nginx-deployment-55dcddcb7 0 0 0 16m
nginx-deployment-5c6ccdb5db 0 0 0 24m
nginx-deployment-5d59d67564 0 0 0 8h
nginx-deployment-645d9d5cd7 0 0 0 31m
nginx-deployment-69c44dfb78 0 0 0 8h
nginx-deployment-6f7f5f76dc 5 5 5 65s
nginx-deployment-87f7bfb9 0 0 0 29m
[root@master01 ~]# kubectl describe deploy nginx-deployment -n workspace | grep Image
Image: nginx:1.11.1
更新Deployment的注意事项
- 清理策略:
- 在默认情况下,revision保留10个旧的ReplicaSet,其余的将在后台进行垃圾回收,可以在.spec.revisionHistoryLimit设置保留ReplicaSet的个数。当设置为0时,不保留历史记录。
- 更新策略:
- .spec.strategy.type==Recreate,表示重建,先删掉旧的Pod再创建新的Pod。
- .spec.strategy.type==RollingUpdate,表示滚动更新,可以指定maxUnavailable和maxSurge来控制滚动更新过程。
- .spec.strategy.rollingUpdate.maxUnavailable,指定在回滚更新时最大不可用的Pod数量,可选字段,默认为25%,可以设置为数字或百分比,如果maxSurge为0,则该值不能为0。
- .spec.strategy.rollingUpdate.maxSurge可以超过期望值的最大Pod数,可选字段,默认为25%,可以设置成数字或百分比,如果maxUnavailable为0,则该值不能为0。