Deployment
一、Deployment
1.1、什么是Deployment
- Deployment同样也是Kubernetes系统的一个核心概念,主要职责和RC、RS一样都是保证Pod的数目和健康,通过定义一个Deployment控制器会创建一个新的ReplicaSet控制器,通过ReplicaSet创建Pod,删除Deployment控制器,也会删除Deployment控制器下对应的ReplicaSet控制器和Pod资源。二则大部分功能都是完全同等的,我们可以看成是一个升级版的RC、RS控制器
1.2、Deployment功能
- 声明式更新:用户可以声明所需的应用状态,Deployment控制器负责将当前徐徐更为所需状态。
- 自动滚动更新:Deployment支持在更新应用时实行更新。使得应用的可用性持续,该过程会徐徐替换旧版本的Pod,确保在更新过程中不会有或少少有downtime。
- 回滚功能:如果新的应用版本出现题目,Deployment允许用户快速回滚到先前的稳定版本。
- 管理副本:Deployment控制器恶意维护指定数目的Pod副本,确保系统在任何时刻都有足够的副本在运行。
- 自愈能力:Deployment会监控Pod的状态,并自动重启失败的Pod,以保持设定的副本数。
- 版本控制:Deployment使用标签选择器来管理Pod,这使得用户可以很容器地跟踪和管理差别版本的应用。
1.3、Deployment用例场景
- 创建Deployment以将ReplicaSet上线。ReplicaSet在后台创建Pod。查抄ReplicaSet的上线状态,查察其是否成功。
- 通过更新Deployment的PodTemplateSpec,声明Pod的新状态。新的ReplicaSet会被创建,Deployment以受控速率将Pod从旧ReplicaSet迁移到新ReplicaSet。每个新的ReplicaSet都会更新Deployment的修订版本。
- 如果Deployment的当前状态不稳定,回滚到较早的Deployment版本。每次回滚都会更新Deployment的修订版本。
- 扩大Deployment规模以承担更多负载。
- 停息Deployment的上线以应用对PodTemplateSpec所作的多项修改,然后规复实在行以启动新的上线版本。
- 使用Deployment状态来判断上线过程是否出现停滞。
- 清理较久的不再必要的ReplicaSet。
二、Deployment示例
2.1、示例
- 下面的Deployment示例,其中创建了一个ReplicaSet,这个ReplicaSet负责启动三个nginxPod:
- [root@master ~]# vim nginx-deployment.yaml
复制代码- 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:
- restartPolicy: Always
- containers:
- - name: nginx
- image: nginx:1.14.2
- imagePullPolicy: IfNotPresent
- ports:
- - containerPort: 80
复制代码
- 在该例中:
- 创建名为nginx-deployment(由.metadata.name字段标明)的Deployment。该名称将成为后续创建ReplicaSet和Pod的名称底子
- 该Deployment创建一个ReplicaSet,它创建三个(由.spec.replicas字段标明)Pod副本。
- .spec.selector字段定义所创建的ReplicaSet如果查找要管理的Pod。在这里,你选择在Pod模板中定义的标签(app:nginx)。不过,更复杂的选择规则是也大概的,只要Pod模板本身满意所给规则即可。
- template字段包罗以下子字段:
- Pod被使用.metadata.labels字段打上app:nginx标签。
- Pod模板规约(即.template.spec字段)指示Pod运行一个nginx容器,该容器运行版本为1.14.2的nginxDocker Hub镜像。
- 创建一个容器并使用.spec.template.spec.containers.name字段将其命名为nginx
- 开始之前,请确保你的Kubernetes集群已经正常运行。按照以下步骤创建上述Deployment
- [root@master ~]# kubectl apply -f nginx-deployment.yaml
复制代码
- 运行kubectl get deployment查抄Deployment是否已经创建。如果仍在创建Deployment,则输出类似于:
- [root@master ~]# kubectl get deployment
- NAME READY UP-TO-DATE AVAILABLE AGE
- nginx-deployment 0/3 3 0 25s
- # 在检查集群中的Deployment时,所显示的字段有:
- NAME:列出了名称空间中Deployment的名称
- READY:显示应用程序的可用“副本”数。显示的模式是“就绪个数/期望个数”
- UP-TO-DATE:显示为了达到期望状态已经更新的副本数
- AVAILABLE:显示应用可供用户使用的副本数
- AGE:显示应用程序运行的时间
复制代码
- 请注意期望数副本数是根据.spec.replicas字段设置3
要想查察Deployment上线状态,运行kubectl rollout status deployment nginx-deployment
- [root@master ~]# kubectl rollout status deployment nginx-deployment
- deployment "nginx-deployment" successfully rolled out
复制代码 几秒种过再次运行kubectl get deployment输出类似于:
- [root@master ~]# kubectl get deployment
- NAME READY UP-TO-DATE AVAILABLE AGE
- nginx-deployment 3/3 3 3 71m
复制代码 要查察Deployment创建的ReplicaSet(rs),运行kubectl get rs。输出类似于
- [root@master ~]# kubectl get rs
- NAME DESIRED CURRENT READY AGE
- nginx-deployment-9456bbbf9 3 3 3 73m
- # ReplicaSet输出中包含以下字段:
- NAME:列出名称空间中ReplicaSet的名称
- DESIRED:显示应用的期望副本个数,即在创建Deployment时所定义的值。此为期望状态
- CURRENT:显示当前运行状态中的副本个数
- READY:显示应用中有多少副本可以为用户提供服务
- AGE:显示应用已经运行的时间长度
复制代码- # 注意:ReplicaSet的名称格式始终为[Deployment 名称]-[哈希]。该名称将成为所创建的Pod的名称基础。其中的 哈希字符串与ReplicaSet上的pod-template-hash标签一致
- # Deployment的名字
- [root@master ~]# kubectl get deployment
- NAME READY UP-TO-DATE AVAILABLE AGE
- nginx-deployment 3/3 3 3 77m
- # rs的名字
- [root@master ~]# kubectl get rs
- NAME DESIRED CURRENT READY AGE
- nginx-deployment-9456bbbf9 3 3 3 77m
复制代码 要查察每个Pod自动天生的标签,运行kubectl get pod --show-labels。输出类似于
- [root@master ~]# kubectl get pod
- --show-labels
- NAME READY STATUS RESTARTS AGE LABELS
- nginx-deployment-9456bbbf9-j855n 1/1 Running 0 78m app=nginx,pod-template-hash=9456bbbf9
- nginx-deployment-9456bbbf9-kzxkw 1/1 Running 0 78m app=nginx,pod-template-hash=9456bbbf9
- nginx-deployment-9456bbbf9-twsbk 1/1 Running 0 78m app=nginx,pod-template-hash=9456bbbf9
复制代码 2.2、说明
你必须在Deployment中指定得当的选择算符和Pod模板标签(在本例中为app:nginx)。标签大概选择算符不要与其他控制器(包括其他Deployment和StatefulSet)重叠。Kubernetes不会组织你如许做,但是如果多个控制器具有重叠的选择算符,它们大概会发生冲突实行难以预料的操作。
2.3、Pod-template-hash标签
注意:不要更改此标签
Deployment控制器将pod-template-hash标签添加到Deployment所创建或收留的每个ReplicaSet
此标签可确保Deployment的子ReplicaSet不重叠。标签是通过对ReplicaSet的podTemplate举行哈希处理。所天生的哈希值被添加到ReplicaSet选择算符、Pod模板标签,并存在于ReplicaSet大概拥有的任何现有Pod中
三、更新Deployment
说明:仅当Deployment Pod模板(即.spec.template)发生该表时,比方模板的标签或容器镜像被更新,才会触发Deployment上线。其他更新(如对Deployment实行扩缩容的操作)不会指出上线动作。
3.1、更新Nginx版本
再实行以下操作之前,可以先查察目前的nginx版本
- [root@master ~]# kubectl exec -it nginx-deployment-9456bbbf9-j855n -- nginx -v
- nginx version: nginx/1.14.2
复制代码 先来更新nginx Pod以使用nginx:1.16.1镜像,而不是nginx:1.14.2镜像
- [root@master ~]# kubectl set image deployment nginx-deployment nginx=nginx:1.16.1
复制代码 在这里,deployment nginx-deployment表明Deployment的名称,nginx表明必要举行更新的容器,而nginx:1.16.1则表示镜像的心版本
输出类似于:
- deployment.apps/nginx-deployment image updated
复制代码 大概,可以对Deployment实行edit操作并将.spec.template.spec.containers.image从nginx:1.14.2更改值nginx:latest最新版本
- [root@master ~]# kubectl edit deployment nginx-deployment
- spec:
- containers:
- - image: nginx:latest
- imagePullPolicy: IfNotPresent
- name: nginx
- ...
复制代码 3.2、查察上线状态
要查察上线状态,运行:
- [root@master ~]# kubectl rollout status deployment nginx-deployment
复制代码 输出类似于
- Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
复制代码 大概
- deployment "nginx-deployment" successfully rolled out
复制代码 获取关于已更新的Deployment的更多信息
- 在上线成功后,可以通过运行kubectl get deployment来查察Deployment:输出类似于:
- [root@master ~]# kubectl get deployment
- NAME READY UP-TO-DATE AVAILABLE AGE
- nginx-deployment 3/3 3 3 110m
复制代码
- 运行kubectl get rs以查察Deployment通过创建新的ReplicaSet并将其扩容到3个副本并将旧ReplicaSet缩容到0个副本完成了Pod的更新操作:
- [root@master ~]# kubectl get rs
- NAME DESIRED CURRENT READY AGE
- nginx-deployment-67dffbbbb 3 3 3 2m52s
- nginx-deployment-9456bbbf9 0 0 0 111m
复制代码
- 现在运行kubectl get pod应该显示新的Pod:
- [root@master ~]# kubectl get pod
- NAME READY STATUS RESTARTS AGE
- nginx-deployment-67dffbbbb-2dgln 1/1 Running 0 3m54s
- nginx-deployment-67dffbbbb-kmsbr 1/1 Running 0 3m55s
- nginx-deployment-67dffbbbb-sg672 1/1 Running 0 3m56s
复制代码 下次要更新这些Pod时,只必要再次更新Deployment模板即可。
Deployment可确保在更新时关闭肯定数目的Pod。默认情况下,它确保至少所需Pod的75%处于运行状态(最大不可用比例为25%)。
比方,如果仔细查察上述Deployment,将看到它起首创建了一个新的Pod,然后删除旧的Pod,并创建了新的Pod。它不会杀死旧Pod,直到足够数目的新Pod已经出现。在足够数目的旧Pod被杀死前并没有创建新的Pod。它确保至少3个Pod可用,同时最多总共4个Pod可用。当Deployment设置为4个副本时,Pod的个数会介于3和5之前。
- [root@master ~]# kubectl describe deployment
复制代码 输出类似于
- Name: nginx-deployment
- Namespace: default
- CreationTimestamp: Fri, 26 Jul 2024 15:42:14 +0800
- Labels: app=nginx
- Annotations: deployment.kubernetes.io/revision: 3
- 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:latest
- 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-67dffbbbb (3/3 replicas created)
- Events:
- Type Reason Age From Message
- ---- ------ ---- ---- -------
- Normal ScalingReplicaSet 22m deployment-controller Scaled up replica set nginx-deployment-ff6655784 to 1
- Normal ScalingReplicaSet 7m43s deployment-controller Scaled down replica set nginx-deployment-ff6655784 to 0
- Normal ScalingReplicaSet 7m43s deployment-controller Scaled up replica set nginx-deployment-67dffbbbb to 1
- Normal ScalingReplicaSet 7m42s deployment-controller Scaled down replica set nginx-deployment-9456bbbf9 to 2
- Normal ScalingReplicaSet 7m42s deployment-controller Scaled up replica set nginx-deployment-67dffbbbb to 2
- Normal ScalingReplicaSet 7m41s deployment-controller Scaled down replica set nginx-deployment-9456bbbf9 to 1
- Normal ScalingReplicaSet 7m41s deployment-controller Scaled up replica set nginx-deployment-67dffbbbb to 3
- Normal ScalingReplicaSet 7m39s deployment-controller Scaled down replica set nginx-deployment-9456bbbf9 to 0
复制代码 四、回滚Deployment
4.1、回滚前操作
偶然,你大概想要回滚Deployment;比方,当Deployment不稳定时(比方进入反复崩溃状态)。默认情况下,Deployment的全部上线记录都保留在系统中,以便可以随时回滚(你可以通过修改修订历史限定来更新这一越苏)
说明:Deployment被触发上线时,系统就会创建Deployment的新的修订版本。这意味着仅当Deployment的Pod模板(.spec.template)发生更改时,才会创建新的修订版本–比方,模板的标签或容器镜像发生变化。其他更新,如Deployment的扩缩容器操作不会创建Deployment修订版本。这是为了方便同时实行手动缩放或自动缩放,换言之,当你回滚到较早的修订版本时,只有Deployment的Pod模板部署会被回滚。
- 假设你在更新Deployment时犯了一个拼写错误,将镜像名称命名设置为nginx:1.161而不是nginx:1.16.1
- [root@master ~]# kubectl set image deployment nginx-deployment nginx=nginx:1.161
复制代码 输出类似于:
- deployment.apps/nginx-deployment image updated
复制代码
- 此上线进程会出现停滞,你可以通过查抄上线状态来验证:
- [root@master ~]# kubectl rollout status deployment nginx-deployment
复制代码 输出类似于
- Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
复制代码
- 按Ctrl-C制止上述上线状态观察
- 你可以看到旧的副本有3个,新的副本有1个
- [root@master ~]# kubectl get rs
- NAME DESIRED CURRENT READY AGE
- nginx-deployment-5b4685b9bd 1 1 0 3m56s
- nginx-deployment-67dffbbbb 3 3 3 20m
- nginx-deployment-9456bbbf9 0 0 0 128m
复制代码
- 查察所创建的Pod,你会注意到新ReplicaSet所创建的1个Pod卡顿在镜像拉取循环中
- [root@master ~]# kubectl get pod
复制代码 输出类似于:
- NAME READY STATUS RESTARTS AGE
- nginx-deployment-5b4685b9bd-lm4jj 0/1 ImagePullBackOff 0 5m21s
- nginx-deployment-67dffbbbb-2dgln 1/1 Running 0 21m
- nginx-deployment-67dffbbbb-kmsbr 1/1 Running 0 21m
- nginx-deployment-67dffbbbb-sg672 1/1 Running 0 21m
复制代码 说明:Deployment控制器自动制止有题目的上线过程,并制止对新的ReplicaSet扩容。这行为取决于所指定的rollingUpdate参数(具体为maxUnavailable)。默认情况下,Kubernetes将此值设置为25%
- [root@master ~]# kubectl describe deployment
复制代码 输出类似于:
- Name: nginx-deployment
- Namespace: default
- CreationTimestamp: Fri, 26 Jul 2024 15:42:14 +0800
- Labels: app=nginx
- Annotations: deployment.kubernetes.io/revision: 4
- Selector: app=nginx
- Replicas: 3 desired | 1 updated | 4 total | 3 available | 1 unavailable
- StrategyType: RollingUpdate
- MinReadySeconds: 0
- RollingUpdateStrategy: 25% max unavailable, 25% max surge
- Pod Template:
- Labels: app=nginx
- Containers:
- nginx:
- Image: nginx:1.161
- Port: 80/TCP
- Host Port: 0/TCP
- Environment: <none>
- Mounts: <none>
- Volumes: <none>
- Conditions:
- Type Status Reason
- ---- ------ ------
- Available True MinimumReplicasAvailable
- Progressing True ReplicaSetUpdated
- OldReplicaSets: nginx-deployment-67dffbbbb (3/3 replicas created)
- NewReplicaSet: nginx-deployment-5b4685b9bd (1/1 replicas created)
- Events:
- Type Reason Age From Message
- ---- ------ ---- ---- -------
- Normal ScalingReplicaSet 39m deployment-controller Scaled up replica set nginx-deployment-ff6655784 to 1
- Normal ScalingReplicaSet 24m deployment-controller Scaled down replica set nginx-deployment-ff6655784 to 0
- Normal ScalingReplicaSet 24m deployment-controller Scaled up replica set nginx-deployment-67dffbbbb to 1
- Normal ScalingReplicaSet 24m deployment-controller Scaled down replica set nginx-deployment-9456bbbf9 to 2
- Normal ScalingReplicaSet 24m deployment-controller Scaled up replica set nginx-deployment-67dffbbbb to 2
- Normal ScalingReplicaSet 24m deployment-controller Scaled down replica set nginx-deployment-9456bbbf9 to 1
- Normal ScalingReplicaSet 24m deployment-controller Scaled up replica set nginx-deployment-67dffbbbb to 3
- Normal ScalingReplicaSet 24m deployment-controller Scaled down replica set nginx-deployment-9456bbbf9 to 0
- Normal ScalingReplicaSet 7m44s deployment-controller Scaled up replica set nginx-deployment-5b4685b9bd to 1
复制代码 要办理此题目,必要回滚到以前稳定的Deployment版本
4.2、查抄Deployment上线历史
4.2.1、查察修订历史
- [root@master ~]# kubectl rollout history deployment nginx-deployment
复制代码 输出类似于:
- deployment.apps/nginx-deployment
- REVISION CHANGE-CAUSE
- 1 <none>
- 2 <none>
- 3 <none>
- 4 <none>
复制代码 CHANGE-CAUSE的内容是从Deployment的kubernetes.io/change-cause注解复制过来的。复制动作发生在修订版本创建时。
4.2.2、查察修订历史的具体信息
- [root@master ~]# kubectl rollout history deployment nginx-deployment
- --revision=2
复制代码 输出类似于:
- deployment.apps/nginx-deployment with revision #2
- Pod Template:
- Labels: app=nginx
- pod-template-hash=ff6655784
- Containers:
- nginx:
- Image: nginx:1.16.1
- Port: 80/TCP
- Host Port: 0/TCP
- Environment: <none>
- Mounts: <none>
- Volumes: <none>
复制代码 4.2.3、回滚到之前的修订版本
按照下面给出的步骤将Deployment从当前版本回滚到以前的版本(即版本2)
- 假定现在你已经决定撤销当前上线版本回滚到之前的修订版本:
- [root@master ~]# kubectl rollout undo deployment nginx-deployment --to-revision=2
复制代码 输出类似于:
- deployment.apps/nginx-deployment rolled back
复制代码
- 查抄回滚是否成功以及Deployment是否正在运行
- [root@master ~]# kubectl get deployment nginx-deployment
复制代码 输出类似于:
- NAME READY UP-TO-DATE AVAILABLE AGE
- nginx-deployment 3/3 3 3 3h43m
复制代码
- [root@master ~]# kubectl describe deployment
- nginx-deployment
复制代码 输出类似于:
- Name: nginx-deployment
- Namespace: default
- CreationTimestamp: Fri, 26 Jul 2024 15:42:14 +0800
- Labels: app=nginx
- Annotations: deployment.kubernetes.io/revision: 5
- 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.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-ff6655784 (3/3 replicas created)
- Events:
- Type Reason Age From Message
- ---- ------ ---- ---- -------
- Normal ScalingReplicaSet 131m deployment-controller Scaled up replica set nginx-deployment-ff6655784 to 1
- Normal ScalingReplicaSet 115m deployment-controller Scaled down replica set nginx-deployment-ff6655784 to 0
- Normal ScalingReplicaSet 115m deployment-controller Scaled up replica set nginx-deployment-67dffbbbb to 1
- Normal ScalingReplicaSet 115m deployment-controller Scaled down replica set nginx-deployment-9456bbbf9 to 2
- Normal ScalingReplicaSet 115m deployment-controller Scaled up replica set nginx-deployment-67dffbbbb to 2
- Normal ScalingReplicaSet 115m deployment-controller Scaled down replica set nginx-deployment-9456bbbf9 to 1
- Normal ScalingReplicaSet 115m deployment-controller Scaled up replica set nginx-deployment-67dffbbbb to 3
- Normal ScalingReplicaSet 115m deployment-controller Scaled down replica set nginx-deployment-9456bbbf9 to 0
- Normal ScalingReplicaSet 99m deployment-controller Scaled up replica set nginx-deployment-5b4685b9bd to 1
- Normal ScalingReplicaSet 3m55s deployment-controller Scaled down replica set nginx-deployment-5b4685b9bd to 0
- Normal ScalingReplicaSet 3m55s deployment-controller Scaled up replica set nginx-deployment-ff6655784 to 1
- Normal ScalingReplicaSet 3m10s deployment-controller Scaled down replica set nginx-deployment-67dffbbbb to 2
- Normal ScalingReplicaSet 3m10s deployment-controller Scaled up replica set nginx-deployment-ff6655784 to 2
- Normal ScalingReplicaSet 2m30s deployment-controller Scaled down replica set nginx-deployment-67dffbbbb to 1
- Normal ScalingReplicaSet 2m30s deployment-controller Scaled up replica set nginx-deployment-ff6655784 to 3
- Normal ScalingReplicaSet 2m28s deployment-controller Scaled down replica set nginx-deployment-67dffbbbb to 0
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |