分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 网页技术

Kubernetes 系列(一):Deployment 扩容

发布时间:2023-09-06 02:34责任编辑:苏小强关键词:暂无标签

(1)首先我们创建一个nginx的Deployment,采用官方的yaml:

kubectl create -f https://kubernetes.io/docs/user-guide/nginx-deployment.yaml --record

创建完成后查看下状态:

kubectl get deploymentskubectl get rskubectl get pods

OK,现在我们有了一个3各Pod的deployment。

我们使用以下命令进行扩容:

kubectl scale deployment nginx-deployment --replicas 10

假设您的集群中启用了horizontal pod autoscaling,您可以给 Deployment 设置一个 autoscaler,基于当前 Pod的 CPU 利用率选择最少和最多的 Pod 数。

kubectl autoscale deployment nginx-deployment --min=10 --max=15 --cpu-percent=80

通过Kubectl get pods查看最新状态:

比例扩容

RollingUpdate Deployment 支持同时运行一个应用的多个版本。或者 autoscaler 扩 容 RollingUpdate Deployment 的时候,正在中途的 rollout(进行中或者已经暂停的),为了降低风险,Deployment controller 将会平衡已存在的活动中的 ReplicaSet(有 Pod 的 ReplicaSet)和新加入的 replica。这被称为比例扩容。

例如,您正在运行中含有10个 replica 的 Deployment。maxSurge=3,maxUnavailable=2。

$ kubectl get deployNAME ????????????????DESIRED ??CURRENT ??UP-TO-DATE ??AVAILABLE ??AGEnginx-deployment ????10 ???????10 ???????10 ??????????10 ?????????50s

您更新了一个镜像,而在集群内部无法解析。

kubectl set image deploy/nginx-deployment nginx=nginx:sometagdeployment "nginx-deployment" image updated

镜像更新启动了一个包含ReplicaSet nginx-deployment-1989198191的新的rollout,但是它被阻塞了,因为我们上面提到的maxUnavailable。

kubectl get rsNAME ?????????????????????????DESIRED ??CURRENT ??READY ????AGEnginx-deployment-1989198191 ??5 ????????5 ????????0 ????????9snginx-deployment-618515232 ???8 ????????8 ????????8 ????????1m

然后发起了一个新的Deployment扩容请求。autoscaler将Deployment的repllica数目增加到了15个。Deployment controller需要判断在哪里增加这5个新的replica。如果我们没有谁用比例扩容,所有的5个replica都会加到一个新的ReplicaSet中。如果使用比例扩容,新添加的replica将传播到所有的ReplicaSet中。大的部分加入replica数最多的ReplicaSet中,小的部分加入到replica数少的ReplciaSet中。0个replica的ReplicaSet不会被扩容。

在我们上面的例子中,3个replica将添加到旧的ReplicaSet中,2个replica将添加到新的ReplicaSet中。rollout进程最终会将所有的replica移动到新的ReplicaSet中,假设新的replica成为健康状态。

kubectl get deployNAME ????????????????DESIRED ??CURRENT ??UP-TO-DATE ??AVAILABLE ??AGEnginx-deployment ????15 ???????18 ???????7 ???????????8 ??????????7mkubectl get rsNAME ?????????????????????????DESIRED ??CURRENT ??READY ????AGEnginx-deployment-1989198191 ??7 ????????7 ????????0 ????????7mnginx-deployment-618515232 ???11 ???????11 ???????11 ???????7m


检查 Deployment 升级的历史记录

因为我们创建 Deployment 的时候使用了--recored参数可以记录命令,我们可以很方便的查看每次 revision 的变化。

首先,检查下 Deployment 的 revision:

PS G:\k8s-for-docker\k8s-for-docker-desktop> kubectl rollout history deployment/nginx-deploymentdeployments "nginx-deployment"REVISION ?CHANGE-CAUSE1 ????????kubectl.exe create --filename=https://kubernetes.io/docs/user-guide/nginx-deployment.yaml --record=true2 ????????kubectl.exe scale deployment nginx-deployment --replicas=103 ????????kubectl.exe set image deploy/nginx-deployment nginx=nginx:sometag

我们还可以查看版本的具体信息:

PS G:\k8s-for-docker\k8s-for-docker-desktop> kubectl rollout history deployment/nginx-deployment --revision=2deployments "nginx-deployment" with revision #2Pod Template: ?Labels: ??????app=nginx ???????pod-template-hash=703038527 ?Annotations: ?kubernetes.io/change-cause=kubectl.exe scale deployment nginx-deployment --replicas=10 ?Containers: ??nginx: ???Image: ?????nginx:1.9.1 ???Port: ??????80/TCP ???Host Port: ?0/TCP ???Environment: ???????<none> ???Mounts: ????<none> ?Volumes: ?????<none>

回退到历史版本

我们可以看到包括创建在内一共有3各版本,我们可以指定回退到某个版本,比如回退到2版本:

kubectl rollout undo deployment/nginx-deployment --to-revision=2

查看回滚状态:

kubectl get deployNAME ??????????????DESIRED ??CURRENT ??UP-TO-DATE ??AVAILABLE ??AGEnginx-deployment ??10 ???????10 ???????10 ??????????10 ?????????3h
kubectl rollout history deployment/nginx-deploymentdeployments "nginx-deployment"REVISION ?CHANGE-CAUSE1 ????????kubectl.exe create --filename=https://kubernetes.io/docs/user-guide/nginx-deployment.yaml --record=true3 ????????kubectl.exe set image deploy/nginx-deployment nginx=nginx:sometag4 ????????kubectl.exe scale deployment nginx-deployment --replicas=10

可以看到版本历史记录里多了一个4版本,10个副本的历史记录。

暂停和恢复Deployment

您可以在发出一次或多次更新前暂停一个 Deployment,然后再恢复它。这样您就能多次暂停和恢复 Deployment,在此期间进行一些修复工作,而不会发出不必要的 rollout。

例如使用刚刚创建 Deployment:

kubectl get deployNAME ??????????????DESIRED ??CURRENT ??UP-TO-DATE ??AVAILABLE ??AGEnginx-deployment ??10 ???????10 ???????10 ??????????10 ?????????3h

使用以下命令暂停 Deployment:

kubectl rollout pause deployment/nginx-deploymentdeployment.apps "nginx-deployment" paused

然后更新 Deplyment中的镜像,最后,恢复这个 Deployment,观察完成更新的 ReplicaSet 已经创建出来了:

kubectl rollout resume deploy nginx

Deployment 状态

Deployment 在生命周期中有多种状态。在创建一个新的 ReplicaSet 的时候它可以是 progressing 状态, complete 状态,或者 fail to progress 状态。

进行中的 Deployment

Kubernetes 将执行过下列任务之一的 Deployment 标记为 progressing 状态:

  • Deployment 正在创建新的ReplicaSet过程中。
  • Deployment 正在扩容一个已有的 ReplicaSet。
  • Deployment 正在缩容一个已有的 ReplicaSet。
  • 有新的可用的 pod 出现。

您可以使用kubectl rollout status命令监控 Deployment 的进度。

kubectl rollout status deployment/nginx-deploymentdeployment "nginx-deployment" successfully rolled outPS G:\k8s-for-docker\k8s-for-docker-desktop> echo $?True

完成的 Deployment

Kubernetes 将包括以下特性的 Deployment 标记为 complete 状态:Deployment 最小可用。最小可用意味着 Deployment 的可用 replica 个数等于或者超过 Deployment 策略中的期望个数。所有与该 Deployment 相关的replica都被更新到了您指定版本,也就说更新完成。该 Deployment 中没有旧的 Pod 存在。

您可以用kubectl rollout status命令查看 Deployment 是否完成。如果 rollout 成功完成,kubectl rollout status将返回一个0值的 Exit Code。

失败的 Deployment

您的 Deployment 在尝试部署新的 ReplicaSet 的时候可能卡住,用于也不会完成。这可能是因为以下几个因素引起的:

  • (1)无效的引用
  • (2)不可读的 probe failure
  • (3)镜像拉取错误
  • (4)权限不够
  • (5)范围限制
  • (6)程序运行时配置错误

Kubernetes 系列(一):Deployment 扩容

原文地址:https://www.cnblogs.com/weiBlog/p/10463736.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved