ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

k8s deployment控制器:滚动升级 平滑过渡 零停机

2021-10-29 18:33:43  阅读:286  来源: 互联网

标签:web 停机 master deployment Pod k8s root


1. 滚动升级

  • 滚动升级架构图
    image

  • 滚动升级注释:

    ​ K8s对Pod升级的默认策略,通过使用新版本Pod逐步更新旧版本Pod,实现零停机发布,用户无感知。

  • 滚动升级更新策略:

    [root@k8s-master deployment]# vim web.yaml 
    [root@k8s-master deployment]# cat web.yaml 
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web
      namespace: default
      annotations:       # 记录回滚参数
        kubernetes.io/change-cause: "web.v1-nginx-1.19"   #记录到revision中的内容,记录版本号
    spec:
      replicas: 9 # Pod副本预期数量
      revisionHistoryLimit: 10 # RS历史版本保存数量
      selector:
        matchLabels:
          app: web
      strategy:
        rollingUpdate:
          maxSurge: 25%             # 滚动更新过程最大pod副本数
          maxUnavailable: 25%       # 滚动更新过程中最大不可用pod副本数,
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: web # Pod副本的标签
        spec:
          containers:
          - name: web
            image: nginx:1.19
            readinessProbe:          # 存活检查,如果失败,将杀死容器,来重启
              httpGet:
                port: 80
                path: /index.html
              initialDelaySeconds: 10 #启动容器后多少秒健康检查
              periodSeconds: 10 #以后间隔多少秒检查一次
    
            livenessProbe:   # 就绪检查,失败就会剔除 service 
              httpGet:
                port: 80
                path: /index.html
    
    
    • 注释
      1. maxSurge:滚动更新过程中最大Pod副本数,确保在更新时启动的Pod数量比期望(replicas)Pod数量最大多出25%
      2. maxUnavailable:滚动更新过程中最大不可用Pod副本数,确保在更新时最大25%Pod数量不可用,即确保75%Pod数量是可用状态。

2. 滚动升级操作

kubectl apply -f xxx.yaml
kubectl set image deployment/web nginx=nginx:1.16
kubectl edit deployment/web

3. 案例

3.1 编写deployment的web.yaml文件
[root@k8s-master deployment]# vim web.yaml 
[root@k8s-master deployment]# cat web.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  namespace: default
  annotations:       # 记录回滚参数
    kubernetes.io/change-cause: "web.v1-nginx-1.19"   #记录到revision中的内容,记录版本号
spec:
  replicas: 9 # Pod副本预期数量
  revisionHistoryLimit: 10 # RS历史版本保存数量
  selector:
    matchLabels:
      app: web
  strategy:
    rollingUpdate:
      maxSurge: 25%             # 滚动更新过程最大pod副本数
      maxUnavailable: 25%       # 滚动更新过程中最大不可用pod副本数,
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: web # Pod副本的标签
    spec:
      containers:
      - name: web
        image: nginx:1.16
        readinessProbe:          # 存活检查,如果失败,将杀死容器,来重启
          httpGet:
            port: 80
            path: /index.html
          initialDelaySeconds: 10 #启动容器后多少秒健康检查
          periodSeconds: 10 #以后间隔多少秒检查一次

        livenessProbe:   # 就绪检查,失败就会剔除 service 
          httpGet:
            port: 80
            path: /index.html


3.2 启动服务
[root@k8s-master deployment]# kubectl apply -f web.yaml 
deployment.apps/web created
3.3 查看服务
[root@k8s-master deployment]# kubectl get pods
NAME                   READY   STATUS    RESTARTS   AGE
web-548b65b8c6-4k8n7   1/1     Running   0          2m24s
web-548b65b8c6-7wvhj   1/1     Running   0          2m24s
web-548b65b8c6-vpmpg   1/1     Running   0          2m24s
[root@k8s-master deployment]# kubectl get pods -o wide
NAME                   READY   STATUS    RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
web-548b65b8c6-4k8n7   1/1     Running   0          2m56s   10.244.36.96     k8s-node1   <none>           <none>
web-548b65b8c6-7wvhj   1/1     Running   0          2m56s   10.244.169.159   k8s-node2   <none>           <none>
web-548b65b8c6-vpmpg   1/1     Running   0          2m56s   10.244.36.95     k8s-node1   <none>           <none>
3.4 deployment端口暴露
[root@k8s-master deployment]# kubectl expose deployment web --port=80 --target-port=80 --type=NodePort
service/web exposed
3.5 查询服务是否端口暴露
[root@k8s-master deployment]# kubectl get service 
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        6d
probe-demo   ClusterIP   10.104.161.168   <none>        80/TCP         2d
web          NodePort    10.98.32.199     <none>        80:30082/TCP   14s
3.6 curl请求测试
[root@k8s-master deployment]# curl -I http://192.168.0.202:30082
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Tue, 01 Dec 2020 08:28:06 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 13 Aug 2019 10:05:00 GMT
Connection: keep-alive
ETag: "5d528b4c-264"
Accept-Ranges: bytes

3.7 修改deployment的web.yaml文件实现滚动更新
[root@k8s-master deployment]# vim web.yaml [root@k8s-master deployment]# cat web.yaml apiVersion: apps/v1kind: Deploymentmetadata:  name: web  namespace: default  annotations:       # 记录回滚参数    kubernetes.io/change-cause: "web.v1-nginx-1.19"   #记录到revision中的内容,记录版本号spec:  replicas: 9 # Pod副本预期数量  revisionHistoryLimit: 10 # RS历史版本保存数量  selector:    matchLabels:      app: web  strategy:    rollingUpdate:      maxSurge: 25%             # 滚动更新过程最大pod副本数      maxUnavailable: 25%       # 滚动更新过程中最大不可用pod副本数,    type: RollingUpdate  template:    metadata:      labels:        app: web # Pod副本的标签    spec:      containers:      - name: web        image: nginx:1.18        readinessProbe:          # 存活检查,如果失败,将杀死容器,来重启          httpGet:            port: 80            path: /index.html          initialDelaySeconds: 10 #启动容器后多少秒健康检查          periodSeconds: 10 #以后间隔多少秒检查一次        livenessProbe:   # 就绪检查,失败就会剔除 service           httpGet:            port: 80            path: /index.html
3.8 执行配置文件更新
[root@k8s-master deployment]# kubectl apply -f web.yaml deployment.apps/web configured
3.9 查看pod服务
[root@k8s-master deployment]# kubectl get podsNAME                   READY   STATUS              RESTARTS   AGEweb-65798c9f74-2r266   0/1     Terminating         0          39mweb-65798c9f74-5hl4p   1/1     Running             0          39mweb-65798c9f74-5qhgg   1/1     Running             0          39mweb-79c4bc4bd-9j4pw    0/1     ContainerCreating   0          3sweb-79c4bc4bd-pbz5m    1/1     Running             0          30s
3.10 curl 请求是否nginx是1.18版本
[root@k8s-master deployment]# curl -I http://192.168.0.202:30082HTTP/1.1 200 OKServer: nginx/1.18.0Date: Tue, 01 Dec 2020 08:31:09 GMTContent-Type: text/htmlContent-Length: 612Last-Modified: Tue, 21 Apr 2020 14:09:01 GMTConnection: keep-aliveETag: "5e9efe7d-264"Accept-Ranges: bytes

标签:web,停机,master,deployment,Pod,k8s,root
来源: https://www.cnblogs.com/scajy/p/15481782.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有