一起来学k8s 09.deployment

Deployment

学习了Replication ControllerReplica Set两种资源对象,RCRS的功能基本上是差不多的,唯一的区别就是RS支持集合的selector。我们也学习到了用RC/RS来控制Pod副本的数量,也实现了滚动升级Pod的功能。现在看上去似乎一切都比较完美的运行着,但是我们上节课最后也提到了现在我们推荐使用Deployment这种控制器了,而不是我们之前的RC或者RS,这是为什么呢?

没有对比就没有伤害对吧,我们来对比下二者之间的功能吧,首先RCKubernetes的一个核心概念,当我们把应用部署到集群之后,需要保证应用能够持续稳定的运行,RC就是这个保证的关键,主要功能如下:

  • 确保Pod数量:它会确保Kubernetes中有指定数量的Pod在运行,如果少于指定数量的PodRC就会创建新的,反之这会删除多余的,保证Pod的副本数量不变。
  • 确保Pod健康:当Pod不健康,比如运行出错了,总之无法提供正常服务时,RC也会杀死不健康的Pod,重新创建新的。
  • 弹性伸缩:在业务高峰或者低峰的时候,可以用过RC来动态的调整Pod数量来提供资源的利用率,当然我们也提到过如果使用HPA这种资源对象的话可以做到自动伸缩。
  • 滚动升级:滚动升级是一种平滑的升级方式,通过逐步替换的策略,保证整体系统的稳定性。

Deployment同样也是Kubernetes系统的一个核心概念,主要职责和RC一样的都是保证Pod的数量和健康,二者大部分功能都是完全一致的,我们可以看成是一个升级版的RC控制器,那Deployment又具备那些新特性呢?

  • RC的全部功能:Deployment具备上面描述的RC的全部功能
  • 事件和状态查看:可以查看Deployment的升级详细进度和状态
  • 回滚:当升级Pod的时候如果出现问题,可以使用回滚操作回滚到之前的任一版本
  • 版本记录:每一次对Deployment的操作,都能够保存下来,这也是保证可以回滚到任一版本的基础
  • 暂停和启动:对于每一次升级都能够随时暂停和启动

环境

192.168.48.101 master01
192.168.48.201 node01
192.168.48.202 node0

创建deployment

编写myapp-deploy.yaml

vim myapp-deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
  namespace: default
  labels:
    app: myapp
    type: deploy
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
      type: deploy
  template:
    metadata:
      name: myapp-pod
      labels:
        app: myapp
        type: deploy
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        ports:
        - name: http
          containerPort: 80

创建myapp-deploy.yaml

[root@master01 deploy_yaml]# kubectl apply -f myapp-deploy.yaml 
deployment.apps/myapp-deploy created

查看deployment

[root@master01 deploy_yaml]# kubectl get pod
NAME                            READY   STATUS    RESTARTS   AGE
demo-deploy-8675c97685-vhncn    1/1     Running   1          9d
demo-deploy-8675c97685-w7md2    1/1     Running   2          9d
demo-rc-l9c8r                   1/1     Running   1          22h
demo-rc-qvdd7                   1/1     Running   2          22h
myapp-deploy-8675c97685-hrwgq   1/1     Running   0          9s
myapp-deploy-8675c97685-qd2s7   1/1     Running   0          9s
myapp-rc3-6fqkj                 1/1     Running   1          21h
myapp-rc3-qtk2d                 1/1     Running   1          21h
myapp-rc3-wpxlj                 1/1     Running   1          21h
myapp-replicaset-9gm94          1/1     Running   1          21h
myapp-replicaset-h4g92          1/1     Running   1          21h
myapp-replicaset-l24ff          1/1     Running   3          21h
[root@master01 deploy_yaml]# kubectl get rs
NAME                      DESIRED   CURRENT   READY   AGE
demo-deploy-8675c97685    2         2         2       9d
myapp-deploy-8675c97685   2         2         2       14s
myapp-replicaset          3         3         3       21h
[root@master01 deploy_yaml]# kubectl get deployment
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
demo-deploy    2/2     2            2           9d
myapp-deploy   2/2     2            2           18s

增加扩展

直接编写yaml文件

vim myapp-deploy.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
  namespace: default
  labels:
    app: myapp
    type: deploy
spec:
  replicas: 5
  selector:
    matchLabels:
      app: myapp
      type: deploy
  template:
    metadata:
      name: myapp-pod
      labels:
        app: myapp
        type: deploy
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        ports:
        - name: http
          containerPort: 80
                                   
[root@master01 deploy_yaml]# kubectl apply -f myapp-deploy.yaml 
deployment.apps/myapp-deploy configured
[root@master01 deploy_yaml]# kubectl get deployment
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
demo-deploy    2/2     2            2           9d
myapp-deploy   5/5     5            5           3m40s
[root@master01 deploy_yaml]# kubectl get deployment -o wide
NAME           READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES                 SELECTOR
demo-deploy    2/2     2            2           9d      myapp        ikubernetes/myapp:v1   app=myapp,type=deploy
myapp-deploy   5/5     5            5           3m51s   myapp        ikubernetes/myapp:v1   app=myapp,type=deploy

打补丁方式

[root@master01 deploy_yaml]# kubectl patch deployment myapp-deploy -p '{"spec":{"replicas":3}}'
deployment.extensions/myapp-deploy patched
[root@master01 deploy_yaml]# kubectl get deployments
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
demo-deploy    2/2     2            2           9d
myapp-deploy   3/3     3            3           14m

滚动升级镜像

直接编写yaml文件,v1-v2

vim myapp-deploy.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
  namespace: default
  labels:
    app: myapp
    type: deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
      type: deploy
  template:
    metadata:
      name: myapp-pod
      labels:
        app: myapp
        type: deploy
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v2
        ports:
        - name: http
          containerPort: 80
                            
[root@master01 deploy_yaml]# kubectl apply -f myapp-deploy.yaml 
deployment.apps/myapp-deploy configured
[root@master01 deploy_yaml]# kubectl get rs
NAME                      DESIRED   CURRENT   READY   AGE
demo-deploy-8675c97685    2         2         2       9d
myapp-deploy-846955c66b   3         3         3       6s
myapp-deploy-8675c97685   0         0         0       19m
myapp-replicaset          3         3         3       22h
[root@master01 deploy_yaml]# kubectl get deployment
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
demo-deploy    2/2     2            2           9d
myapp-deploy   3/3     3            3           19m
[root@master01 deploy_yaml]# 

添加滚动升级策略 v2-v3

vim myapp-deploy.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
  namespace: default
  labels:
    app: myapp
    type: deploy
spec:
  replicas: 3
  minReadySeconds: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  selector:
    matchLabels:
      app: myapp
      type: deploy
  template:
    metadata:
      name: myapp-pod
      labels:
        app: myapp
        type: deploy
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v3
        ports:
        - name: http
          containerPort: 80


[root@master01 deploy_yaml]# kubectl apply -f myapp-deploy.yaml 
deployment.apps/myapp-deploy configured
[root@master01 deploy_yaml]# kubectl get rs
NAME                      DESIRED   CURRENT   READY   AGE
demo-deploy-8675c97685    2         2         2       9d
myapp-deploy-5f94c88667   3         3         3       10s
myapp-deploy-846955c66b   0         0         0       3m40s
myapp-deploy-8675c97685   0         0         0       22m
myapp-replicaset          3         3         3       22h
[root@master01 deploy_yaml]# kubectl get deployment
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
demo-deploy    2/2     2            2           9d
myapp-deploy   3/3     3            3           22m


  • minReadySeconds:
    • Kubernetes在等待设置的时间后才进行升级
    • 如果没有设置该值,Kubernetes会假设该容器启动起来后就提供服务了
    • 如果没有设置该值,在某些极端情况下可能会造成服务服务正常运行
  • maxSurge:
    • 升级过程中最多可以比原先设置多出的POD数量
    • 例如:maxSurage=1,replicas=5,则表示Kubernetes会先启动1一个新的Pod后才删掉一个旧的POD,整个升级过程中最多会有5+1个POD。
  • maxUnavaible:
    • 升级过程中最多有多少个POD处于无法提供服务的状态
    • maxSurge不为0时,该值也不能为0
    • 例如:maxUnavaible=1,则表示Kubernetes整个升级过程中最多会有1个POD处于无法服务的状态。

rollout升级

查看状态

[root@master01 deploy_yaml]# kubectl rollout status deployment myapp-deploy 
deployment "myapp-deploy" successfully rolled out


暂停升级,打开2个终端,一台设置升级,升级后一台立即暂停升级,v3-v1

[root@master01 deploy_yaml]# kubectl set image deployment myapp-deploy myapp=ikubernetes/myapp:v1
deployment.extensions/myapp-deploy image updated

[root@master01 ~]# kubectl rollout pause deployment myapp-deploy 
deployment.extensions/myapp-deploy paused


继续升级,打开2个终端,一台看rollout status 一台继续升级 ,v3-v1

[root@master01 deploy_yaml]# kubectl rollout status deployment myapp-deploy 
Waiting for deployment "myapp-deploy" rollout to finish: 2 out of 3 new replicas have been updated...

[root@master01 ~]# kubectl rollout resume deployment myapp-deploy 
deployment.extensions/myapp-deploy resumed

[root@master01 deploy_yaml]# kubectl rollout status deployment myapp-deploy 
Waiting for deployment "myapp-deploy" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment spec update to be observed...
Waiting for deployment spec update to be observed...
Waiting for deployment "myapp-deploy" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 2 of 3 updated replicas are available...
Waiting for deployment "myapp-deploy" rollout to finish: 2 of 3 updated replicas are available...
deployment "myapp-deploy" successfully rolled out


升级结束后,继续查看rs的状态

[root@master01 deploy_yaml]# kubectl get rs
NAME                      DESIRED   CURRENT   READY   AGE
demo-deploy-8675c97685    2         2         2       9d
myapp-deploy-5f94c88667   0         0         0       13m
myapp-deploy-846955c66b   0         0         0       16m
myapp-deploy-8675c97685   3         3         3       35m
myapp-replicaset          3         3         3       22h


查看Deployment的升级历史 v1-v2-v3-v1

[root@master01 deploy_yaml]# kubectl rollout history deployment myapp-deploy 
deployment.extensions/myapp-deploy 
REVISION  CHANGE-CAUSE
2         <none>
3         <none>
4         <none>


直接回退到当前版本的前一个版本 v1-v3

[root@master01 deploy_yaml]# kubectl rollout undo deployment myapp-deploy 
deployment.extensions/myapp-deploy rolled back
[root@master01 deploy_yaml]# kubectl get rs
NAME                      DESIRED   CURRENT   READY   AGE
demo-deploy-8675c97685    2         2         2       9d
myapp-deploy-5f94c88667   3         3         3       17m
myapp-deploy-846955c66b   0         0         0       21m
myapp-deploy-8675c97685   0         0         0       40m
myapp-replicaset          3         3         3       22h
[root@master01 deploy_yaml]# kubectl get deployment
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
demo-deploy    2/2     2            2           9d
myapp-deploy   3/3     3            2           40m

[root@master01 deploy_yaml]# kubectl describe deployment myapp-deploy 
Name:                   myapp-deploy
Namespace:              default
CreationTimestamp:      Tue, 09 Apr 2019 19:48:31 +0800
Labels:                 app=myapp
                        type=deploy
Annotations:            deployment.kubernetes.io/revision: 5
                        kubectl.kubernetes.io/last-applied-configuration:
                          {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app":"myapp","type":"deploy"},"name":"myapp-deploy","n...
Selector:               app=myapp,type=deploy
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        5
RollingUpdateStrategy:  1 max unavailable, 1 max surge
Pod Template:
  Labels:  app=myapp
           type=deploy
  Containers:
   myapp:
    Image:        ikubernetes/myapp:v3
    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:   myapp-deploy-5f94c88667 (3/3 replicas created)
Events:
  Type    Reason             Age                 From                   Message
  ----    ------             ----                ----                   -------
  Normal  ScalingReplicaSet  41m                 deployment-controller  Scaled up replica set myapp-deploy-8675c97685 to 2
  Normal  ScalingReplicaSet  37m                 deployment-controller  Scaled up replica set myapp-deploy-8675c97685 to 5
  Normal  ScalingReplicaSet  26m                 deployment-controller  Scaled down replica set myapp-deploy-8675c97685 to 3
  Normal  ScalingReplicaSet  22m                 deployment-controller  Scaled up replica set myapp-deploy-846955c66b to 1
  Normal  ScalingReplicaSet  22m                 deployment-controller  Scaled up replica set myapp-deploy-846955c66b to 2
  Normal  ScalingReplicaSet  22m                 deployment-controller  Scaled down replica set myapp-deploy-8675c97685 to 1
  Normal  ScalingReplicaSet  22m                 deployment-controller  Scaled up replica set myapp-deploy-846955c66b to 3
  Normal  ScalingReplicaSet  22m                 deployment-controller  Scaled down replica set myapp-deploy-8675c97685 to 0
  Normal  ScalingReplicaSet  18m                 deployment-controller  Scaled down replica set myapp-deploy-846955c66b to 2
  Normal  ScalingReplicaSet  18m                 deployment-controller  Scaled up replica set myapp-deploy-5f94c88667 to 1
  Normal  ScalingReplicaSet  70s (x2 over 22m)   deployment-controller  Scaled down replica set myapp-deploy-8675c97685 to 2
  Normal  ScalingReplicaSet  63s (x13 over 18m)  deployment-controller  (combined from similar events): Scaled up replica set myapp-deploy-5f94c88667 to 3


可以用revision回退到指定的版本 v3-v2

[root@master01 deploy_yaml]# kubectl rollout undo deployment myapp-deploy --to-revision=2
deployment.extensions/myapp-deploy rolled back
[root@master01 deploy_yaml]# kubectl get rs
NAME                      DESIRED   CURRENT   READY   AGE
demo-deploy-8675c97685    2         2         2       9d
myapp-deploy-5f94c88667   0         0         0       21m
myapp-deploy-846955c66b   3         3         3       24m
myapp-deploy-8675c97685   0         0         0       43m
myapp-replicaset          3         3         3       22h
[root@master01 deploy_yaml]# kubectl describe deployment myapp-deploy 
Name:                   myapp-deploy
Namespace:              default
CreationTimestamp:      Tue, 09 Apr 2019 19:48:31 +0800
Labels:                 app=myapp
                        type=deploy
Annotations:            deployment.kubernetes.io/revision: 6
                        kubectl.kubernetes.io/last-applied-configuration:
                          {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app":"myapp","type":"deploy"},"name":"myapp-deploy","n...
Selector:               app=myapp,type=deploy
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        5
RollingUpdateStrategy:  1 max unavailable, 1 max surge
Pod Template:
  Labels:  app=myapp
           type=deploy
  Containers:
   myapp:
    Image:        ikubernetes/myapp:v2
    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:   myapp-deploy-846955c66b (3/3 replicas created)
Events:
  Type    Reason             Age                  From                   Message
  ----    ------             ----                 ----                   -------
  Normal  ScalingReplicaSet  43m                  deployment-controller  Scaled up replica set myapp-deploy-8675c97685 to 2
  Normal  ScalingReplicaSet  40m                  deployment-controller  Scaled up replica set myapp-deploy-8675c97685 to 5
  Normal  ScalingReplicaSet  29m                  deployment-controller  Scaled down replica set myapp-deploy-8675c97685 to 3
  Normal  ScalingReplicaSet  24m                  deployment-controller  Scaled up replica set myapp-deploy-846955c66b to 1
  Normal  ScalingReplicaSet  24m                  deployment-controller  Scaled down replica set myapp-deploy-8675c97685 to 1
  Normal  ScalingReplicaSet  24m                  deployment-controller  Scaled up replica set myapp-deploy-846955c66b to 3
  Normal  ScalingReplicaSet  24m                  deployment-controller  Scaled down replica set myapp-deploy-8675c97685 to 0
  Normal  ScalingReplicaSet  21m                  deployment-controller  Scaled up replica set myapp-deploy-5f94c88667 to 1
  Normal  ScalingReplicaSet  21m                  deployment-controller  Scaled down replica set myapp-deploy-846955c66b to 2
  Normal  ScalingReplicaSet  3m42s (x2 over 24m)  deployment-controller  Scaled down replica set myapp-deploy-8675c97685 to 2
  Normal  ScalingReplicaSet  39s (x2 over 24m)    deployment-controller  Scaled up replica set myapp-deploy-846955c66b to 2
  Normal  ScalingReplicaSet  39s                  deployment-controller  Scaled down replica set myapp-deploy-5f94c88667 to 2
  Normal  ScalingReplicaSet  32s (x16 over 21m)   deployment-controller  (combined from similar events): Scaled up replica set myapp-deploy-846955c66b to 3
  Normal  ScalingReplicaSet  30s                  deployment-controller  Scaled down replica set myapp-deploy-5f94c88667 to 0


在执行Deployment升级的时候最好带上record参数,便于我们查看历史版本信息 v2-v1

vim myapp-deploy.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
  namespace: default
  labels:
    app: myapp
    type: deploy
spec:
  replicas: 2
  minReadySeconds: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  selector:
    matchLabels:
      app: myapp
      type: deploy
  template:
    metadata:
      name: myapp-pod
      labels:
        app: myapp
        type: deploy
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        ports:
        - name: http
          containerPort: 80


[root@master01 deploy_yaml]# kubectl apply -f myapp-deploy.yaml --record=true
deployment.apps/myapp-deploy configured
[root@master01 deploy_yaml]# kubectl rollout history deployment myapp-deploy 
deployment.extensions/myapp-deploy 
REVISION  CHANGE-CAUSE
5         <none>
6         <none>
7         kubectl apply --filename=myapp-deploy.yaml --record=true


默认情况下,所有通过kubectl xxxx --record都会被kubernetes记录到etcd进行持久化,这无疑会占用资源,最重要的是,时间久了,当你kubectl get rs时,会有成百上千的垃圾RS返回给你,那时你可能就眼花缭乱了。

上生产时,我们最好通过设置Deployment的.spec.revisionHistoryLimit来限制最大保留的revision number,比如15个版本,回滚的时候一般只会回滚到最近的几个版本就足够了。其实rollout history中记录的revision都和ReplicaSets一一对应。如果手动delete某个ReplicaSet,对应的rollout history就会被删除,也就是还说你无法回滚到这个revison了。

roolout historyReplicaSet的对应关系,可以在kubectl describe rs $RSNAME返回的revision字段中得到,这里的revision就对应着roolout history返回的revison

使用下面的命令查看单个revison的信息

[root@master01 deploy_yaml]# kubectl rollout history deployment myapp-deploy 
deployment.extensions/myapp-deploy 
REVISION  CHANGE-CAUSE
5         <none>
6         <none>
7         kubectl apply --filename=myapp-deploy.yaml --record=true

[root@master01 deploy_yaml]# kubectl rollout history deployment myapp-deploy --revision=7
deployment.extensions/myapp-deploy with revision #7
Pod Template:
  Labels:	app=myapp
	pod-template-hash=8675c97685
	type=deploy
  Annotations:	kubernetes.io/change-cause: kubectl apply --filename=myapp-deploy.yaml --record=true
  Containers:
   myapp:
    Image:	ikubernetes/myapp:v1
    Port:	80/TCP
    Host Port:	0/TCP
    Environment:	<none>
    Mounts:	<none>
  Volumes:	<none>


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值