Deployment副本无状态服务创建及水平扩展
目录
- deployment的创建
- deployment的升级
- deployment的回滚
- deployment的扩容和缩容
- deployment的更新暂停及恢复
- deployment的注意项
replace
(/r??ple?s/)替换、取代;在本文中是修改后的yaml文件替换旧的yaml文件rollout
(/ɑ??/)记录;在本文中是记录历史的deploy副本版本describe
(/d??skra?b/)描述;在本文中是说记录过程scale
(/ske?l/)缩放;在本文中是说缩放副本的个数pause
(/p??z/)暂停;在本文中是说暂停更新resume
(/r??zju?m/)恢复;在本文中是说从暂停恢复到正常状态RC(Replication Controller)和RS(ReplicaSet)
(几乎弃用)RC是复制控制器,确保Pod数量达到期望值,保证副本始终处于可用的状态。
(不建议单独使用)RS是RC的下一代,支持标签集。
无状态服务Deployment意思就是无状态的。。。用于部署无状态的服务。
类似网页访问之类的请求就是无状态的,每次请求都包含了需要的所有信息,每次请求都和上次没有关系。
Deployment是最常用的控制器。一般用于管理维护企业内部的无状态的微服务,比如configserver、zuul、springboot。可以管理多个副本的Pod实现无缝迁移、自动扩容缩容、自动灾难恢复、一键回滚等功能。
deployment的创建 可以通过命令创建一个Deployment:
kubectl create deployment nginx --image=nginx:1.20.2
可以将创建的副本生成yaml文件:
kubectl get deployment nginx -o yaml > nginx.yaml
然后可以修改yaml文件的参数,然后重新加载新的yaml文件:
kubectl replace -f nginx.yaml
也可以通过在线修改yaml文件,退出后直接生效:
kubectl edit deploy nginx
从yaml文件生成deployment:
apiVersion: v1items:- apiVersion: apps/v1kind: Deploymentmetadata:annotations:deployment.kubernetes.io/revision: "2"creationTimestamp: "2022-02-08T07:52:05Z"generation: 2labels:app: nginxname: nginxnamespace: defaultresourceVersion: "266395"uid: d4a3dbe9-5156-42cf-aaf5-3dfefccf4753spec:progressDeadlineSeconds: 600replicas: 1# 副本数revisionHistoryLimit: 10# 保留历史的版本selector:matchLabels:app: nginxstrategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:creationTimestamp: nulllabels:app: nginxspec:containers:- image: nginx:1.18.0imagePullPolicy: Alwaysname: nginxresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilednsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}terminationGracePeriodSeconds: 30status:availableReplicas: 1conditions:- lastTransitionTime: "2022-02-08T07:52:10Z"lastUpdateTime: "2022-02-08T07:52:10Z"message: Deployment has minimum availability.reason: MinimumReplicasAvailablestatus: "True"type: Available- lastTransitionTime: "2022-02-08T07:52:05Z"lastUpdateTime: "2022-02-08T07:55:54Z"message: ReplicaSet "nginx-86dddd6686" is progressing.reason: ReplicaSetUpdatedstatus: "True"type: ProgressingobservedGeneration: 2readyReplicas: 1replicas: 2unavailableReplicas: 1updatedReplicas: 1kind: Listmetadata:resourceVersion: ""selfLink: ""
deployment状态说明:
[root@k8s-master01 ~]# kubectl get deployments.apps -o wide NAMEREADYUP-TO-DATEAVAILABLEAGECONTAINERSIMAGESSELECTORmynginx1/1114d5hmynginxnginxk8s-app=mynginx
NAME:Deployment名称
READY:Pod的状态,已经达到Ready的个数
UP-TO-DATE:已经达到期望状态的副本数
AVAILABLE:已经可以使用的个数
AGE:程序运行的时间
CONTAINERS:容器的自定义名称
IMAGES:容器镜像名称
SELECTOR:管理的Pod标签
deployment的升级 查看创建nginx的deploy中镜像的版本:可以看到是1.18.0
[root@k8s-master01 ~]# kubectl get deploy -o yaml | grep image- image: nginx:1.18.0imagePullPolicy: Always
我们可以使用set命令更新镜像的版本:这里的set是设置的意思。
[root@k8s-master01 ~]# kubectl set image deploy nginx nginx=nginx:1.20.2 --record[root@k8s-master01 ~]# kubectl get deployments.apps nginx -o yaml | grep imagekubernetes.io/change-cause: kubectl set image deploy nginx nginx=1.18.1 --record=true- image: nginx:1.20.2imagePullPolicy: Always
可以使用下列命令查看升级过程:
[root@k8s-master01 ~]# kubectl rollout status deployment nginx[root@k8s-master01 ~]# kubectl describe deployments.apps nginx
升级过程大概为:创建deploy时,系统也会同时创建depoly的RS,更新deploy时,系统会增加一个新的RS,旧的RS会相应减少1,直到替换完成。
deployment的回滚 deployment的回滚可以回滚到上个版本,也可以回滚到指定指定版本,历史版本的数量由下面这个参数控制:
revisionHistoryLimit: 10
查看历史版本:可以看到副本发生了几次变化
[root@k8s-master01 ~]# kubectl rollout history deployment nginx deployment.apps/nginx REVISIONCHANGE-CAUSE8kubectl set image deploy nginx nginx=1.18.1 --record=true9kubectl set image deploy nginx nginx=nginx:1.20.2 --record=true
回滚到上一个版本:undo是撤销的意思(我的理解是撤销现在的版本回到之前的版本)
[root@k8s-master01 ~]# kubectl rollout undo deployment nginxdeployment.apps/nginx rolled back
查看已经由1.20.2回到了1.18.0版本:
[root@k8s-master01 ~]# kubectl get deployments.apps nginx -o yaml | grep imagekubernetes.io/change-cause: kubectl set image deploy nginx nginx=1.18.1 --record=true- image: nginx:1.18.0imagePullPolicy: Always
【Deployment副本无状态服务创建及水平扩展】如果多次发布,回滚到指定版本:
[root@k8s-master01 ~]# kubectl rollout history deployment nginx deployment.apps/nginx REVISIONCHANGE-CAUSE9kubectl set image deploy nginx nginx=nginx:1.20.2 --record=true10kubectl set image deploy nginx nginx=1.18.1 --record=true您在 /var/spool/mail/root 中有新邮件[root@k8s-master01 ~]# kubectl rollout history deployment nginx --revision=9deployment.apps/nginx with revision #9Pod Template:Labels: app=nginx pod-template-hash=67d5b4548cAnnotations: kubernetes.io/change-cause: kubectl set image deploy nginx nginx=nginx:1.20.2 --record=trueContainers:nginx:Image: nginx:1.20.2Port:Host Port: Environment: Mounts: Volumes: [root@k8s-master01 ~]# kubectl rollout undo deployment nginx --to-revision=9deployment.apps/nginx rolled back[root@k8s-master01 ~]# kubectl get deployments.apps nginx -o yaml | grep imagekubernetes.io/change-cause: kubectl set image deploy nginx nginx=nginx:1.20.2- image: nginx:1.20.2imagePullPolicy: Always
可以看到以上信息版本已经回滚到1.20.2版本;另外就算更新时候失败,新镜像拉取失败,旧的副本不会停止工作,会一直持续工作,直到升级成功。
deployment的扩容和缩容 使用命令扩容:将nginx副本由一个变成两个,注意扩容RS不会发生变化,因为Pod的本质没有发生改变。scale这个单词在这里是缩放的意思。
[root@k8s-master01 ~]# kubectl get deployments.apps NAMEREADYUP-TO-DATEAVAILABLEAGEnginx1/11117h[root@k8s-master01 ~]# kubectl scale --replicas=2 deployment nginx deployment.apps/nginx scaled[root@k8s-master01 ~]# kubectl get deployments.apps NAMEREADYUP-TO-DATEAVAILABLEAGEnginx2/22217h
deployment的更新暂停及恢复 更新暂停:这条命令的作用是将更新暂停后,你使用
kubectl set
命令修改Pod的配置后不会立刻生效,即使多次修改也只是积累起来不会马上生效。[root@k8s-master01 ~]# kubectl rollout pause deployment nginx
暂停恢复:解除之前的更新暂停功能,在暂停期间做过的修改将都会生效
[root@k8s-master01 ~]# kubectl rollout resume deployment nginx
deployment的注意项
- .spec.revisionHistoryLimit: 10:设置保留RS的旧的版本的个数,为0的话不保存
- .spec.minReadySeconds:可选,指定新创建的Pod在没有任何容器崩溃的情况下是为Ready的最小秒数,默认为0,就是一但创建就被视为可用
spec.strategy.type
:更新deploy的方式,默认是RollingUpdateRollingUpdate
:滚动更新,可以指定maxSurge和maxUnavailablemaxUnavailable
:指定在回滚或更新时最大不可用的Pod数量,默认25%,也可以设置数字;如果为0那么maxSurge就不能为0 。maxSurge
:可以超过期望值的的最大Pod数,可选,默认为25%。如果为0那maxUnavailable就不能为0 。Recreate
:重建,先删除旧的Pod,在创建新的Pod。以上就是Deployment副本无状态服务及水平扩展的详细内容,更多关于Deployment无状态服务扩展的资料请关注脚本之家其它相关文章!
推荐阅读
- 无缝融入 Kubernetes 生态 | 云原生网关支持 Ingress 资源
- Java基础~无间断巩固|java基础-宇宙第一YWM(入门java--基础框图)
- linux|archlinux开机无法联网问题,以及安装archlinuxcn和yay管理器
- python|Python爬虫之无法获取网页源码的解决方案详解
- OpenSceneGraph|OSG OIT 顺序无关透明绘制(PPLL_OIT, WB_OIT) 实现及注意事项
- html|浏览器打印解决input框内容无法获取值得问题 print()
- js|jsPlumb使用html2canvas无法识别svg
- 海量非结构化数据副本难保护,焱融科技携手英方推出联合解决方案
- 香港美国站群特价促销8xx
- 抖音微信登录服务器繁忙,抖音无法正常使用微信登录_抖音微信登陆失败解决方法_游戏吧...