赞
踩
涉及文档:
Deployments 简介:
一个 Deployment 为 Pods 和 ReplicaSets 提供声明式的更新能力。
你负责描述 Deployment 中的 目标状态,而 Deployment 控制器(Controller) 以受控速率更改实际状态, 使其变为期望状态。
你可以定义 Deployment 以创建新的 ReplicaSet,或删除现有 Deployment, 并通过新的 Deployment 收放其资源。
以下是 Deployments 的典型用例:
检查 ReplicaSet 的上线状态,查看其是否成功。
Deployment 以受控速率将 Pod 从旧 ReplicaSet 迁移到新 ReplicaSet。`` 每个新的 ReplicaSet 都会更新 Deployment 的修订版本
。回滚到较早的 Deployment 版本
。 每次回滚都会更新 Deployment 的修订版本扩大 Deployment 规模以承担更多负载
。暂停 Deployment
以应用对 PodTemplateSpec 所作的多项修改, 然后恢复其执行以启动新的上线版本。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: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80
kubectl apply -f nginx-deployment.yaml
kubectl get deployments.apps
所显示的字段有:
Deployment的名称。
可用的副本数。
显示的模式是就绪个数/期望个数
。达到期望状态已经更新的副本数
。应用可供用户使用的副本数。
运行的时间
。 kubectl get rs
ReplicaSet 输出中包含以下字段:
ReplicaSet 的名称
应用的期望副本个数
,即在创建 Deployment 时所定义的值。 此为期望状态
运行状态中的副本个数
有多少副本可以为用户提供服务
运行的时间长度
注意 ReplicaSet 的名称始终被格式化为[Deployment名称]-[随机字符串]
。 其中的随机字符串是使用 pod-template-hash 作为种子随机生成
的。
说明: 仅当 Deployment Pod 模板(即 .spec.template)发生改变时,例如模板的标签或容器镜像被更新, 才会触发 Deployment 上线。
其他更新(如对 Deployment 执行扩缩容的操作)不会触发上线动作。
kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record
- -record : 标志将所执行的命令写入资源注 kubernetes.io/change-cause 中。
这对于以后的检查是有用的。例如 要查看针对每个 Deployment 修订版本所执行过的命令
。
或者使用
kubectl edit deployments.apps nginx-deployment
kubectl rollout status deployment nginx-deployment
输出类似于:
Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
或者
deployment "nginx-deployment" successfully rolled out
旧 ReplicaSet 缩容到0个副本完成了
Pod的更新操作kubectl get rs
Deployment 可确保在更新时仅关闭一定数量的 Pod。默认情况下,它确保至少所需 Pods 75% 处于运行状态(最大不可用比例为 25%)。
Deployment 还确保仅所创建 Pod 数量只可能比期望 Pods 数高一点点。 默认情况下,它可确保启动的 Pod 个数比期望个数最多多出 25%(最大峰值 25%)。
重点重点:如果仔细查看上述 Deployment, 此文件replicas我这边设置为3,可计算出最大不可用数量1、启动的 Pod 个数比期望个数最多多1个
,将看到它首先创建了一个新的 Pod,然后删除了一些旧的 Pods, 并创建了新的 Pods。它不会杀死老 Pods,直到有足够的数量新的 Pods 已经出现。 在足够数量的旧 Pods 被杀死前并没有创建新 Pods
。它确保至少 2 个 Pod 可用,同时 最多总共 4 个 Pod 可用
kubectl describe deployments.apps nginx-deployment
例如当 Deployment 不稳定时(例如进入反复崩溃状态)。 默认情况下,Deployment 的所有上线记录都保留在系统中,以便可以随时回滚 (你可以通过修改修订历史记录限制来更改这一约束)。
kubectl set image deployment nginx-deployment nginx=nginx:1.161 --record=true
kubectl get pod
说明: Deployment 控制器自动停止有问题的上线过程
,并停止对新的 ReplicaSet 扩容
。 这行为取决于所指定的 rollingUpdate
参数具体为 maxUnavailable默认情况下,Kubernetes 将此值设置为 25%。
kubectl describe deployment nginx-deployment
kubectl rollout history deployment nginx-deployment
假定现在你已决定撤消当前上线并回滚到以前的修订版本
kubectl rollout undo deployment nginx-deployment
kubectl rollout undo deployment nginx-deployment --to-revision=2
再次查看deployment nginx-deployment详细
kubectl scale deployment --replicas=5 nginx-deployment
kubectl scale deployment --replicas=3 nginx-deployment
具体可参考文档: kubernetes 自动扩容与缩容pod(metrics-server篇)
kubectl autoscale deployment.v1.apps/nginx-deployment --min=10 --max=15 --cpu-percent=80
详细查看文档: [Kubernetes Deployment 规约] (必读)(https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment/#writing-a-deployment-spec)
默认值是1
.spec.selector 必须匹配 .spec.template.metadata.labels
,否则请求会被 API 拒绝。RollingUpdate 是默认值
, 如果 .spec.strategy.type==Recreate
,在创建新 Pods 之前,所有现有的 Pods 会被杀死
, 常用就是RollingUpdate策略,.spec.strategy.type==RollingUpdate时,采取 滚动更新的方式更新 Pods
。你可以指定maxUnavailable 和 maxSurge
来控制滚动更新 过程。此值不能为 0。 默认值为 25%。
则此值不能为 0
。百分比值会通过向上取整转换为绝对数。此字段的默认值为 25%。
Type=Progressing、Status=False、 Reason=ProgressDeadlineExceeded
,默认为600秒
只有超出这个时间 Pod 才被视为可用。默认值为 0
保留的旧 ReplicaSet 数量
,默认情况下,系统保留 10 个旧 ReplicaSevim nginx-deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx #需要与.spec.selector标签一致(多标签时至少一个) spec: minReadySeconds: 60 #就绪时间,使Pod视为可用 progressDeadlineSeconds: 70 #进度期限秒数,报告会在资源状态 replicas: 3 #副本数 revisionHistoryLimit: 2 #保留历史记录个数 strategy: rollingUpdate: #策略默认RollingUpdate maxSurge: 3 #可以创建的超出 期望 Pod 个数的 Pod 数量。 maxUnavailable: 1 #最大不可用 selector: matchLabels: app: nginx #需要与.spec.template.metadata.labels标签一致(多标签时至少一个) template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: labels: app: nginx name: nginx-deployment spec: ports: - name: nginx port: 80 #k8s内部svc虚拟地址的访问端口 targetPort: 80 #Pod中服务对应的端口 nodePort: 30088 #对外暴露服务端口 selector: app: nginx type: NodePort
kubectl apply -f nginx-deployment.yaml
kubectl describe deployments.apps nginx-deployment
右边的图Conditions部分信息可以看到在65~66秒,由此可以得到minReadySeconds 只有超出这个时间 Pod 才被视为可用生效
,可以自行测试将minReadySeconds 取消或者设置为0,再次生成资源,就会观察到这个状态。
Deployment 尝试部署其最新的 ReplicaSet 受挫情况
1、动态更新一个不存在的镜像
kubectl set image deployment nginx-deployment nginx=nginx:1.20 --record
2、再次观察deployment详情
超过截止时间后
,Deployment 控制器将添加具有以下属性的 DeploymentCondition 到 Deployment 的 .status.conditions 中
:
kubectl get deployment nginx-deployment -o yaml
kubectl rollout undo deployment nginx-deployment
kubectl delete -f nginx-deployment.yaml && kubectl apply -f nginx-deployment.yaml
kubectl set image deployments nginx-deployment nginx=mirrorgooglecontainers/echoserver:1.10 --record && kubectl rollout pause deployment nginx-deployment
在此,可以完全显示突出 deployment 的滚动策略。 开始4个创建状态可解析出来,3个是允许超出POd预期个数,还有一个是自身本身的滚动更新出来的Pod。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。