kubernetes之滚动更新

滚动更新:

[root@master rolingup]# vim   httpd-deploy.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd-deploy
  labels:
    run: apache
spec:
  replicas: 3
  selector:
    matchLabels:
      run: apache
  template:
  metadata:
    labels:
      run: apache
  spec:
  	containers:
     - name: httpd
       image: httpd:2.2
     ports:
     - containerPort: 80

执行文件
查看:

[root@master 1]# kubectl get deployments.apps -o wide 
NAME           READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES         SELECTOR
httpd-deploy   3/3     2            3           20s   httpd        httpd:2.4      run=apache
查看pod:
[root@master 1]# kubectl get pod -o wide 
NAME                            READY   STATUS              RESTARTS   AGE     IP             NODE     NOMINATED 	NODE   READINESS GATES
httpd-deploy-6cbfc784b4-5sjdp   1/1     Running             1          30s   10.244.4.157   node2    <none>           	<none>
httpd-deploy-6cbfc784b4-hgccs   1/1     Running             1          30s   10.244.0.21    master   <none>           <none>
httpd-deploy-6cbfc784b4-qn6k8   1/1     Running             1          30s   10.244.3.128   no

可以看到pod都起来了 也可以看到使用的镜像是httpd2.2
接下来滚动更新
编写httpd-deploy.yml文件
把镜像换成httpd2.4的:
在这里插入图片描述
执行文件
查看:

[root@master 1]# kubectl get deployments.apps -o wide 
NAME           READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES         SELECTOR
httpd-deploy   3/3     2            3           3d10h   httpd        httpd:2.4      run=apache
可以看到镜像变成2.4了完成了升级

回滚:
创键3个yml文件准备测试:

[root@master 2]# ls
httpd1.yml  httpd2.yml  httpd3.yml
[root@k8smaster 1]# vim   httpd1.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd-deploy
  labels:
    run: apache
spec:
  replicas: 3
  selector:
    matchLabels:
      run: apache
  template:
    metadata:
  labels:
    run: apache
spec:
  containers:
  - name: httpd
    image: httpd:2.4.37
    ports:
    - containerPort: 80

23 文件把image.httpd:2.4.37 改成 38 39
依次执行文件:

[root@master 2]# kubectl   apply   -f   httpd1.yml   --record
[root@master 2]# kubectl   get  deployments.apps httpd-deploy  -o wide

NAME           READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
httpd-deploy   3/3     3            3           69s   httpd        httpd:2.4.37   run=apache
在执行
[root@master rollout]# kubectl   apply   -f  httpd2.yml  --record 
查看:
[root@master rollout]# kubectl    get   deployments.apps    -o  wide
NAME           READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
httpd-deploy   3/3     3            3           4m    httpd        httpd:2.4.38   run=apache

执行
[root@master 2]# kubectl   apply   -f  httpd3.yml  --record
查看:
[root@master 2]# kubectl   get   deployments.apps  -o wide
NAME           READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES         SELECTOR
httpd-deploy   3/3     3            3           5m46s   httpd        httpd:2.4.39   run=apache

--record是把每次的更新写道revision中 这样就知道每条revision对应哪个文件方便回滚
查看revision:
[root@master 2]# kubectl    rollout history deployment httpd-deploy 

deployment.apps/httpd-deploy 
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=httpd1.yml --record=true
2         kubectl apply --filename=httpd2.yml --record=true
3         kubectl apply --filename=httpd3.yml --record=true

我们回滚到v1版本:

[root@master 2]# kubectl   rollout   undo  deployment httpd-deploy  --to-revision=1

–to-revision指定回滚到那条revision

再次查看一下:

[root@master 2]# kubectl   get   deployments.apps httpd-deploy   -o wide
NAME           READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
httpd-deploy   3/3     3            3           10m   httpd        httpd:2.4.37   run=apache
可以看到回到了 2.4.37那个版本

再次查看revision:

[root@master r2]# kubectl  rollout   history deployment httpd-deploy 
deployment.apps/httpd-deploy 
REVISION  CHANGE-CAUSE
2         kubectl apply --filename=httpd2.yml --record=true
3         kubectl apply --filename=httpd3.yml --record=true
4         kubectl apply --filename=httpd1.yml --record=true

会发现REVISION变了 从2-4了不是之前的1-3

健康检查:

[root@k8smaster health]# vim   health.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    aaaa: aaaaa
  name: health
spec:
  restartPolicy: OnFailure
  containers:
  - name: heal
    image: busybox
    args:
    - /bin/sh
    - -c
    - sleep 10; exit 1

实时查看pod的变化:

[root@master health]# watch kubectl get pod -o wide
会发现只running 10秒就退出了显示error

这种只可以查看进程是否错误,如网页丢失什么的这个就不管用了,这个就通过liveness来检查

Liveness:
[root@master health]# cp  health.yml    liveness.yml
编写liveness.yml文件
[root@k8smaster health]# vim  liveness.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    aaaa: liveness
  name: liveness
spec:
  restartPolicy: OnFailure
  containers:
  - name: liveness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/aaaaa;sleep 30;rm -f /tmp/aaaaa;sleep 600
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/aaaaa
      initialDelaySeconds: 10
      periodSeconds: 5

创键一个文件,休眠30秒,然后删除这个文件,休眠600秒
查看这个文件,启动10秒之后liveness探测这个文件,之后每隔5秒探测一下这个文件,探测失败几次就会重启pod

实时查看

[root@master health]# watch   kubectl   get  pod
在查看一下:
[root@master health]# kubectl    get pod
NAME       READY   STATUS    RESTARTS   AGE
liveness   1/1     Running   2          3m47s

可以看到已经重启2次了

Readiness:
[root@master health]# cp   liveness.yml    readiness.yml
[root@master health]# vim  readiness.yml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    aaaa: readiness
  name: readiness
spec:
  restartPolicy: OnFailure
  containers:
  - name: readiness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/aaaaa;sleep 30;rm -f /tmp/aaaaa;sleep 600
    readinessProbe:
      exec:
        command:
        - cat
        - /tmp/aaaaa
      initialDelaySeconds: 10
      periodSeconds: 5

执行文件
查看时

[root@master health]# kubectl    get   pod   -o wide
NAME        READY   STATUS    RESTARTS   AGE   IP            NODE       NOMINATED NODE   READINESS GATES
readiness   0/1     Running   0          66s   10.244.3.128   node1   <none>           <none>

一开始把ready标记为不可用
它是第15秒时第一次查看 是正确的有哪个文件 在标记为可用
30秒之后由于文件被删除了 readiness探测几次都探测不到 就又标记为不可用了
Liveness 是探测失败后重启pod
Readiness是探测失败后把pod标记为不可用

在 scale up 中使用健康检查:
在scale up中使用健康检查可以防止请求发送给没有ready的pod

[root@master health]# cp    /root/deployment/httpd-deploy.yml       health-httpd.yml
[root@master health]# cat    /root/deployment/httpd-ser.yml     >> health-httpd.yml

2个apiversion之间用—来分割

编写

 [root@master health]# vim    health-httpd.yml  文件
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd-deploy
  labels:
    run: apache
spec:
  replicas: 10
  selector:
    matchLabels:
      run: apache
  template:
    metadata:
      labels:
        run: apache
    spec:
      containers:
      - name: httpd
        image: httpd
        ports:
        - containerPort: 80
        readinessProbe:
          httpGet:
            scheme: HTTP
            path: /aa
            port: 80
          initialDelaySeconds: 10
          periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  name: httpd-ser
spec:
  type: NodePort
  selector:
    run: apache
  ports:
  - protocol: TCP
    nodePort: 30000
    port: 8000
    targetPort: 80
由于没有这个网页所以他会不接受service的请求 ,每隔五秒探测一次 直到有这个网页为止  即curl ip:80/aa  返回200-400之间即为成功

在这里插入图片描述
在滚动更新中使用健康检查:
我们来模拟滚动更新失败用健康检查来探测:

[root@master health]# cp    health-httpd.yml      heal-roll.yml
[root@master health]# vim  heal-roll.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd-deploy
  labels:
    run: apache
spec:
  replicas: 10
  selector:
    matchLabels:
      run: apache
  template:
    metadata:
      labels:
        run: apache
    spec:
      containers:
      - name: app
        image: busybox
        args:
        - /bin/sh
        - -c
        - sleep 10;touch  /tmp/aaaa; sleep 30000000
        readinessProbe:
          exec:
            command:
            - cat
            - /tmp/aaaa
          initialDelaySeconds: 10
          periodSeconds: 5

执行文件:

[root@master health]# kubectl   apply   -f   heal-roll.yml  --record 

查看:
[root@master health]# kubectl   get  deployments.apps httpd-deploy 
	NAME           READY   UP-TO-DATE   AVAILABLE   AGE
httpd-deploy   10/10   10           10          96s

在准备一个文件

[root@master health]# cp   heal-roll.yml      heal-roll1.yml

修改这个文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd-deploy
  labels:
    run: apache
spec:
  replicas: 10
  selector:
    matchLabels:
      run: apache
  template:
    metadata:
      labels:
        run: apache
    spec:
      containers:
      - name: app
        image: busybox
        args:
        - /bin/sh
        - -c
        - sleep 30000000
        readinessProbe:
          exec:
            command:
            - cat
            - /tmp/aaaa
          initialDelaySeconds: 10
          periodSeconds: 5

直接让他睡 不让他创建文件 后面又要查看文件所以会失败 执行文件查看

[root@master health]# kubectl  apply   -f   heal-roll1.yml   --record

查看:
	[root@master health]# kubectl    get   deployments.apps httpd-deploy 
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
httpd-deploy   8/10    5            8           5m47s

可以看到 更新完成的是5个 活动的是8个也就是旧副本是8个 总数是13个副本 由于我们手动设置的原因所以 那5个新副本是不可能ready的
那么为什么有8个旧副本 5个新副本呢

就是maxSurge和maxUnavailable (默认为25%)
maxSurge:
控制副本更新时超过DESIRED即副本的 READY总数 向上取整数
所以此次实例为 10+10*25%

maxUnavailable:
控制副本更新时不可用的个数 向下取整
所以此次实例为 10-10*25% 得出的结果为副本的可用个数

我们回滚到上一个版本:

[root@master health]# kubectl    rollout   undo   deployment httpd-deploy    --to-revision=1

查看一下:

[root@master health]# kubectl get deployments.apps httpd-deploy -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
httpd-deploy 10/10 10 10 17m app busybox run=apache

修改:手动设置更新几个副本和可用副本个数

[root@master health]# vim    heal-roll1.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd-deploy
  labels:
    run: apache
spec:
  strategy:
    rollingUpdate:
      maxSurge: 50%
      maxUnavailable: 35%
  replicas: 10
  selector:
    matchLabels:
      run: apache
  template:
    metadata:
      labels:
        run: apache
    spec:
      containers:
      - name: app
        image: busybox
        args:
        - /bin/sh
        - -c
        - sleep 30000000
        readinessProbe:
          exec:
            command:
            - cat
            - /tmp/aaaa
          initialDelaySeconds: 10
          periodSeconds: 5                                                  

查看:

[root@master health]# kubectl    get  deployments.apps -o  wide
NAME           READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES    SELECTOR
httpd-deploy   7/10    8            7           21m   app          busybox   run=apache

可以看到更新完成的有8个 7个可用的
即 10+1050%=15个总数
10-10
35%=7个可用(向下取整)
那么更新的就是 15-7=8个更新的

查看pod:

[root@k8smaster health]# kubectl   get  pod
NAME                            READY   STATUS        RESTARTS   AGE
httpd-deploy-7c7d96468f-8zcdx   1/1     Terminating   0          24m
httpd-deploy-7c7d96468f-9fbgb   1/1     Terminating   0          24m
httpd-deploy-7c7d96468f-bmng9   1/1     Terminating   0          24m
httpd-deploy-7c7d96468f-g8mb4   1/1     Terminating   0          24m
httpd-deploy-7c7d96468f-h6q4l   1/1     Terminating   0          24m
httpd-deploy-7c7d96468f-krtpf   1/1     Terminating   0          24m
httpd-deploy-7c7d96468f-qfp4n   1/1     Terminating   0          24m
httpd-deploy-d95cc4757-2qnd8    0/1     Terminating   0          2m31s
httpd-deploy-d95cc4757-87gvk    0/1     Terminating   0          2m31s
httpd-deploy-d95cc4757-cskz6    0/1     Terminating   0          2m31s
httpd-deploy-d95cc4757-mlzwg    0/1     Terminating   0          2m31s
httpd-deploy-d95cc4757-png62    0/1     Terminating   0          2m31s
httpd-deploy-d95cc4757-t8drl    0/1     Terminating   0          2m31s
httpd-deploy-d95cc4757-v9gt7    0/1     Terminating   0          2m31s
httpd-deploy-d95cc4757-xkvh5    0/1     Terminating   0          2m31s
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值