• k8s Pod简介与探针实现零宕机发布


    目录

    一、Pod简介

    Pod的退出流程

    1、什么是Pod

    2、定义一个Pod

    二、探针、零宕机发布

    1、Pod探针

    2、Pod探针的检测方式

    3、探针检查参数配置

    4、startupProbe

    5、liveness

    6、readiness

    7、Pod 优雅关闭


    一、Pod简介

    Pod的退出流程

    • 管理员 执行的删除操作

    • Pod 的状态为 terminating

    • EndPoint 会删除 对应的 Pod-IP

    • 执行Prestop的指令

    1、什么是Pod

    Pod是Kubernetes中最小的单元,它由一组、一个或多个容器组成,每个Pod还包含了一个Pause容器,Pause容器是Pod的父容器,主要负责僵尸进程的回收管理,通过Pause容器可以使同一个Pod里面的多个容器共享存储、网络、PID、IPC等。

    通过Pod的概念能够方便 管理容器,因为容器不只一种,有多种容器

    副本的概念,便捷的扩容与伸缩,资源的管理,Pod使容器之间的通信更为密切(通过Pause镜像),减少端口的资源浪费

    2、Pod基础参数解析

    1. apiVersion: v1 # 必选,API的版本号
    2. kind: Pod # 必选,类型Pod
    3. metadata: # 必选,元数据
    4. name: nginx # 必选,符合RFC 1035规范的Pod名称
    5. # namespace: default # 可选,Pod所在的命名空间,不指定默认为default,可以使用-n 指定namespace
    6. labels: # 可选,标签选择器,一般用于过滤和区分Pod,根据业务自定义
    7. app: nginx
    8. role: frontend # 可以写多个
    9. annotations: # 可选,注释列表,可以写多个
    10. app: nginx1.21 #可以注释一些 Nginx版本
    11. spec: # 必选,用于定义容器的详细信息
    12. # initContainers: # 初始化容器,在容器启动之前执行的一些初始化操作
    13. # - command:
    14. # - sh
    15. # - -c
    16. # - echo "I am InitContainer for init some configuration"
    17. # image: busybox
    18. # imagePullPolicy: IfNotPresent
    19. # name: init-container
    20. containers: # 必选,容器列表
    21. - name: nginx # 必选,符合RFC 1035规范的容器名称
    22. image: nginx:1.15.2 # 必选,容器所用的镜像的地址
    23. imagePullPolicy: IfNotPresent # 可选,镜像拉取策略, IfNotPresent: 如果宿主机有这个镜像,那就不需要拉取了. Always: 总是拉取, Never: 不管是否存储都不拉去
    24. command: # 可选,容器启动执行的命令 ENTRYPOINT, arg --> cmd
    25. - nginx
    26. - -g
    27. - "daemon off;"
    28. workingDir: /usr/share/nginx/html # 可选,容器的工作目录
    29. # volumeMounts: # 可选,存储卷配置,可以配置多个
    30. # - name: webroot # 存储卷名称
    31. # mountPath: /usr/share/nginx/html # 挂载目录
    32. # readOnly: true # 只读
    33. ports: # 可选,容器需要暴露的端口号列表
    34. - name: http # 端口名称
    35. containerPort: 80 # 端口号
    36. protocol: TCP # 端口协议,默认TCP
    37. env: # 可选,环境变量配置列表
    38. - name: TZ # 变量名
    39. value: Asia/Shanghai # 变量的值
    40. - name: LANG
    41. value: en_US.utf8
    42. # resources: # 可选,资源限制和资源请求限制
    43. # limits: # 最大限制设置
    44. # cpu: 1000m
    45. # memory: 1024Mi
    46. # requests: # 启动所需的资源
    47. # cpu: 100m
    48. # memory: 512Mi
    49. # startupProbe: # 可选,检测容器内进程是否完成启动。注意三种检查方式同时只能使用一种。
    50. # httpGet: # httpGet检测方式,生产环境建议使用httpGet实现接口级健康检查,健康检查由应用程序提供。
    51. # path: /api/successStart # 检查路径
    52. # port: 80
    53. # readinessProbe: # 可选,健康检查。注意三种检查方式同时只能使用一种。
    54. # httpGet: # httpGet检测方式,生产环境建议使用httpGet实现接口级健康检查,健康检查由应用程序提供。
    55. # path: / # 检查路径
    56. # port: 80 # 监控端口
    57. # livenessProbe: # 可选,健康检查
    58. #exec: # 执行容器命令检测方式
    59. #command:
    60. #- cat
    61. #- /health
    62. #httpGet: # httpGet检测方式
    63. # path: /_health # 检查路径
    64. # port: 8080
    65. # httpHeaders: # 检查的请求头
    66. # - name: end-user
    67. # value: Jason
    68. # tcpSocket: # 端口检测方式
    69. # port: 80
    70. # initialDelaySeconds: 60 # 初始化时间
    71. # timeoutSeconds: 2 # 超时时间
    72. # periodSeconds: 5 # 检测间隔
    73. # successThreshold: 1 # 检查成功为2次表示就绪
    74. # failureThreshold: 2 # 检测失败1次表示未就绪
    75. # lifecycle:
    76. # postStart: # 容器创建完成后执行的指令, 可以是exec httpGet TCPSocket
    77. # exec:
    78. # command:
    79. # - sh
    80. # - -c
    81. # - 'mkdir /data/ '
    82. # preStop:
    83. # httpGet:
    84. # path: /
    85. # port: 80
    86. # exec:
    87. # command:
    88. # - sh
    89. # - -c
    90. # - sleep 9
    91. restartPolicy: Always # 可选,默认为Always,容器故障或者没有启动成功,那就自动该容器,Onfailure: 容器以不为0的状态终止,自动重启该容器, Never:无论何种状态,都不会重启
    92. #nodeSelector: # 可选,指定Node节点
    93. # region: subnet7
    94. # imagePullSecrets: # 可选,拉取镜像使用的secret,可以配置多个
    95. # - name: default-dockercfg-86258
    96. # hostNetwork: false # 可选,是否为主机模式,如是,会占用主机端口
    97. # volumes: # 共享存储卷列表
    98. # - name: webroot # 名称,与上述对应
    99. # emptyDir: {} # 挂载目录
    100. # #hostPath: # 挂载本机目录
    101. # # path: /etc/hosts
     
    

    二、探针、零宕机发布

    1、Pod探针

    🔺实现 零宕机 上线应用

    • StartupProbe:k8s1.16版本后新加的探测方式,用于判断容器内应用程序是否已经启动。如果配置了startupProbe,就会先禁止其他的探测,直到它成功为止,成功后将不在进行探测。

    • LivenessProbe:用于探测容器是否运行,如果探测失败,kubelet会根据配置的重启策略进行相应的处理。若没有配置该探针,默认就是success。

    • ReadinessProbe:一般用于探测容器内的程序是否健康,它的返回值如果为success,那么久代表这个容器已经完成启动,并且程序已经是可以接受流量的状态。

    2、Pod探针的检测方式

    • ExecAction:在容器内执行一个命令,如果返回值为0,则认为容器健康。

    1. livenessProbe:
    2. exec:
    3. command:
    4. - pgrep
    5. - nginx
    • TCPSocketAction:通过TCP连接检查容器内的端口是否是通的,如果是通的就认为容器健康。

    1. livenessProbe:
    2. tcpSocket:
    3. port: 80
    • HTTPGetAction:通过应用程序暴露的API地址来检查程序是否是正常的,如果状态码为200~400之间,则认为容器健康。

    1. linvenessProbe:
    2. httpGet:
    3. path: /index.html
    4. port: 80
    • 在公司,开发人员需要暴露该服务的两个健康检查API接口,如果测试两个API接口通,代表容器正常运行,不会去误停容器。

    3、探针检查参数配置

    探针的参数

    • initialDelaySeconds: 3

      • 容器的初始化时长,用于容器中的服务初始化时间较长的场景

      • 合理使用初始化时长,避免容器中的应用应初始化时长被探针检测失败

    • timeoutSeconds: 2

      • 超时时长,检测一个容器中的服务,超时2秒,认定检测失败

    • periodSeconds: 2

      • 当检测失败后,每隔 2 秒检测一次

    • successThreshold: 1

      • 检测成功的次数,检测1次成功认定该容器ready

    • failureThreshold: 2

      • 检测失败的次数,有两次检测失败,认定该容器 NotReady

    检测失败的重启时长

    • 容器初始化检测失败的时长,唯一的区别就是加上容器初始化时长

      • { ( timeoutSecounds + periodSeconds ) * failureThreshold } + initialDelaySeconds

      • { (2+2) * 2} + 3 = 11s

    • 容器启动之后检测的方式

      • ( timeoutSecounds + periodSeconds ) * failureThreshold

      • {(2+2) * 2 = 8s

    初始化时间,不建议设置太长,滚动发布受影响 ​ 
    # initialDelaySecond: 60   
    
    超时时间,命令去GET页面的超时时间 ​ 
    # timeoutSeconds: 2   
    
    检测间隔,每5秒检测一次 ​ 
    # periodSeconds: 5   
    
    检查成功为1次表示就绪,检测失败2次表示未就绪 ​ ​ 
    # successThreshold: 1 
    # failureThreshold: 2 
    
    检测失败的重启时间:(2+5)* 2 = 14 s 所以检测失败次数不建议设置太大
    

    Prestop:先去请求eureka接口,把自己的IP地址和端口号,进行下线,eureka从注册表中删除该应用的IP地址。然后容器进行sleep 90;kill pgrep java

    🔺注意:

    在生产环境中,一定要合理设置探针检查的参数

    假如一个Java程序的初始化时间为90s,我们没有合理设置探测参数,这样会造成,初始化时间没有给到,后面的检查又失败,失败后Pod又被kubelet干掉,又重启,重启之后又初始化,无限循环,这样对业务造成的影响非常大

    所以就有新的一种探针模式的增加 --> startupProbe

    4、startupProbe

    原理:在1.16+版本后,为了防止程序的初始化时间的过长,导致的Pod被检测失败与无限次的重启,设置startupProbe后,程序会在初始化时,先进行startupProbe的检测,检测期间会将其他的两种检测方式进行禁用。只执行一次,自动退出。

    4.1、进行测试

    1. [root@k8s-master01 k8s-day01]# vim pod-Probe.yaml
    2. apiVersion: v1 # 必选,API的版本号
    3. kind: Pod # 必选,类型Pod
    4. metadata: # 必选,元数据
    5. name: nginx # 必选,符合RFC 1035规范的Pod名称
    6. # namespace: default # 可选,Pod所在的命名空间,不指定默认为default,可以使用-n 指定namespace
    7. labels: # 可选,标签选择器,一般用于过滤和区分Pod,根据业务自定义
    8. app: nginx
    9. role: frontend # 可以写多个
    10. annotations: # 可选,注释列表,可以写多个
    11. app: nginx1.19 #可以注释一些 Nginx版本
    12. spec: # 必选,用于定义容器的详细信息
    13. nodeSelector:
    14. kubernetes.io/hostname: k8s-node01
    15. containers: # 必选,容器列表
    16. - name: nginx # 必选,符合RFC 1035规范的容器名称
    17. image: daocloud.io/library/nginx:latest # 必选,容器所用的镜像的地址
    18. imagePullPolicy: IfNotPresent # 可选,镜像拉取策略, IfNotPresent: 如果宿主机有这个镜像,那就不需要拉取了. Always: 总是拉取, Never: 不管是否存储都不拉去
    19. command: # 可选,容器启动执行的命令 ENTRYPOINT, arg --> cmd
    20. - nginx
    21. - -g
    22. - "daemon off;"
    23. workingDir: /usr/share/nginx/html # 可选,容器的工作目录
    24. ports: # 可选,容器需要暴露的端口号列表
    25. - name: http # 端口名称
    26. containerPort: 80 # 端口号
    27. protocol: TCP # 端口协议,默认TCP
    28. env: # 可选,环境变量配置列表
    29. - name: TZ # 变量名
    30. value: Asia/Shanghai # 变量的值
    31. - name: LANG
    32. value: en_US.utf8
    33. startupProbe: # 可选,检测容器内进程是否完成启动。注意三种检查方式同时只能使用一种。
    34. httpGet: # httpGet检测方式,生产环境建议使用httpGet实现接口级健康检查,健康检查由应用程序提供。
    35. path: /api/successStart # 检查路径
    36. port: 80
    37. restartPolicy: Always # 可选,默认为Always,容器故障或者没有启动成功,那就自动该容器,Onfailure: 容器以不为0的状态终止,自动重启该容器, Never:无论何种状态,都不会重启
    1. [root@k8s-master01 k8s-day01]# kubectl apply -f pod-Probe.yaml
    2. pod/nginx created
    3. [root@k8s-master01 k8s-day01]# kubectl get pod
    4. NAME READY STATUS RESTARTS AGE
    5. nginx 0/1 Running 0 9s
    6. [root@k8s-master01 k8s-day01]# kubectl get pod
    7. NAME READY STATUS RESTARTS AGE
    8. nginx 0/1 Running 2 3m
    9. # 重启2次了
    10. #可以看,nginx的Pod并未ready,一直在重启

    4.2、解析报错信息

    1. [root@k8s-master01 k8s-day01]# kubectl describe pod nginx | grep -A10 "Events"
    2. Events:
    3. Type Reason Age From Message
    4. ---- ------ ---- ---- -------
    5. Normal Scheduled 7m38s default-scheduler Successfully assigned default/nginx to k8s-node01
    6. Normal Pulled 3m56s (x4 over 7m38s) kubelet Container image "daocloud.io/library/nginx:latest" already present on machine
    7. Normal Created 3m56s (x4 over 7m38s) kubelet Created container nginx
    8. Normal Started 3m55s (x4 over 7m38s) kubelet Started container nginx
    9. Warning Unhealthy 3m55s (x10 over 7m35s) kubelet Startup probe failed: HTTP probe failed with statuscode: 404 # 注意看这里,探针检测失败
    10. Normal Killing 2m35s (x4 over 6m32s) kubelet Container nginx failed startup probe, will be restarted

    🔺注意:从报错的信息看,HTTP probe 检测失败,主要是因为 "path: /api/successStart",nginx网站并没有/api/successStart该路径, 我们可以加入 TcpSocker 对nginx进行Tcp方面的探测

    4.3、进行优化,添加 TcpSocker

    1. [root@k8s-master01 k8s-day01]# vim pod-Probe.yaml
    2. #进行注释与添加
    3. startupProbe: # 可选,检测容器内进程是否完成启动。注意三种检查方式同时只能使用一种。
    4. # httpGet: # httpGet检测方式,生产环境建议使用httpGet实现接口级健康检查,健康检查由应用程序提供。
    5. # path: /api/successStart # 检查路径
    6. # port: 80
    7. tcpSocket:
    8. port: 80
    1. [root@k8s-master01 k8s-day01]# kubectl apply -f pod-Probe.yaml
    2. pod/nginx created
    3. [root@k8s-master01 k8s-day01]# kubectl get pod
    4. NAME READY STATUS RESTARTS AGE
    5. nginx 1/1 Running 0 2m14s
    6. [root@k8s-master01 k8s-day01]# kubectl describe pod nginx | grep -A10 "^Event"
    7. Events:
    8. Type Reason Age From Message
    9. ---- ------ ---- ---- -------
    10. Normal Scheduled 3m24s default-scheduler Successfully assigned default/nginx to k8s-node01
    11. Normal Pulled 3m24s kubelet Container image "daocloud.io/library/nginx:latest" already present on machine
    12. Normal Created 3m24s kubelet Created container nginx
    13. Normal Started 3m24s kubelet Started container nginx

    🔺:可以看到,Pod已经重新恢复,主要是 tcpSocket 检测 80端口 成功,nginx默认80端口

    5、liveness

    🔺注意:一定要使用接口级的健康检查 /path /index.html.........,尽量少使用命令去检查 pgrep nginx

    1. apiVersion: v1 # 必选,API的版本号
    2. kind: Pod # 必选,类型Pod
    3. metadata: # 必选,元数据
    4. name: nginx # 必选,符合RFC 1035规范的Pod名称
    5. # namespace: default # 可选,Pod所在的命名空间,不指定默认为default,可以使用-n 指定namespace
    6. labels: # 可选,标签选择器,一般用于过滤和区分Pod,根据业务自定义
    7. app: nginx
    8. role: frontend # 可以写多个
    9. annotations: # 可选,注释列表,可以写多个
    10. app: nginx1.21 #可以注释一些 Nginx版本
    11. spec: # 必选,用于定义容器的详细信息
    12. nodeSelector:
    13. kubernetes.io/hostname: k8s-node01
    14. containers: # 必选,容器列表
    15. - name: nginx # 必选,符合RFC 1035规范的容器名称
    16. image: daocloud.io/library/nginx:latest # 必选,容器所用的镜像的地址
    17. imagePullPolicy: IfNotPresent # 可选,镜像拉取策略, IfNotPresent: 如果宿主机有这个镜像,那就不需要拉取了. Always: 总是拉取, Never: 不管是否存储都不拉去
    18. command: # 可选,容器启动执行的命令 ENTRYPOINT, arg --> cmd
    19. - nginx
    20. - -g
    21. - "daemon off;"
    22. ports: # 可选,容器需要暴露的端口号列表
    23. - name: http # 端口名称
    24. containerPort: 80 # 端口号
    25. protocol: TCP # 端口协议,默认TCP
    26. env: # 可选,环境变量配置列表
    27. - name: TZ # 变量名
    28. value: Asia/Shanghai # 变量的值
    29. - name: LANG
    30. value: en_US.utf8
    31. startupProbe: # 可选,检测容器内进程是否完成启动。注意三种检查方式同时只能使用一种。
    32. # httpGet: # httpGet检测方式,生产环境建议使用httpGet实现接口级健康检查,健康检查由应用程序提供。
    33. # path: /api/successStart # 检查路径
    34. # port: 80
    35. tcpSocket:
    36. port: 80
    37. readinessProbe: # 可选,健康检查。注意三种检查方式同时只能使用一种。
    38. httpGet: # httpGet检测方式,生产环境建议使用httpGet实现接口级健康检查,健康检查由应用程序提供。
    39. path: / # 检查路径
    40. port: 80 # 监控端口
    41. #-------------------------------------------------
    42. livenessProbe: # 可选,健康检查
    43. #exec: # 执行容器命令检测方式
    44. #command:
    45. #- cat
    46. #- /health
    47. httpGet: # httpGet检测方式
    48. path: /index.html # 检查路径
    49. port: 80
    50. # httpHeaders: # 检查的请求头
    51. # - name: end-user
    52. # value: Jason
    53. #-------------------------------------------------
    54. initialDelaySeconds: 3 # 初始化时间
    55. timeoutSeconds: 2 # 超时时间
    56. periodSeconds: 2 # 检测间隔
    57. successThreshold: 1 # 检查成功为2次表示就绪
    58. failureThreshold: 2 # 检测失败1次表示未就绪
    59. restartPolicy: Always

    6、readiness

    • readiness 美 /'rɛdɪnəs/ 英 /'redɪnəs/ n. 敏捷,迅速;准备就绪;愿意

    解析:自定义 监控项对容器启动时的监控,如果监测失败,不会去重启容器,不会停止容器

    只会 限制 服务的 进出流量,用户只能通过 Pod-IP进行访问,无法从Cluster-IP、NodePort-IP进行访问。

    1、报错演示

    1. [root@k8s-master01 k8s-day01]# vim pod-Probe.yaml
    2. apiVersion: v1 # 必选,API的版本号
    3. kind: Pod # 必选,类型Pod
    4. metadata: # 必选,元数据
    5. name: nginx # 必选,符合RFC 1035规范的Pod名称
    6. # namespace: default # 可选,Pod所在的命名空间,不指定默认为default,可以使用-n 指定namespace
    7. labels: # 可选,标签选择器,一般用于过滤和区分Pod,根据业务自定义
    8. app: nginx
    9. role: frontend # 可以写多个
    10. annotations: # 可选,注释列表,可以写多个
    11. app: nginx1.21 #可以注释一些 Nginx版本
    12. spec: # 必选,用于定义容器的详细信息
    13. nodeSelector:
    14. kubernetes.io/hostname: k8s-node01
    15. containers: # 必选,容器列表
    16. - name: nginx # 必选,符合RFC 1035规范的容器名称
    17. image: daocloud.io/library/nginx:latest # 必选,容器所用的镜像的地址
    18. imagePullPolicy: IfNotPresent # 可选,镜像拉取策略, IfNotPresent: 如果宿主机有这个镜像,那就不需要拉取了. Always: 总是拉取, Never: 不管是否存储都不拉去
    19. command: # 可选,容器启动执行的命令 ENTRYPOINT, arg --> cmd
    20. - nginx
    21. - -g
    22. - "daemon off;"
    23. workingDir: /usr/share/nginx/html # 可选,容器的工作目录
    24. ports: # 可选,容器需要暴露的端口号列表
    25. - name: http # 端口名称
    26. containerPort: 80 # 端口号
    27. protocol: TCP # 端口协议,默认TCP
    28. env: # 可选,环境变量配置列表
    29. - name: TZ # 变量名
    30. value: Asia/Shanghai # 变量的值
    31. - name: LANG
    32. value: en_US.utf8
    33. #"---------------------------------------------------------------------------"
    34. readinessProbe: # 可选,健康检查。注意三种检查方式同时只能使用一种。
    35. httpGet: # httpGet检测方式,生产环境建议使用httpGet实现接口级健康检查,健康检查由应用程序提供。
    36. path: /a.html # 检查路径,该路径不存在
    37. port: 80 # 监控端口
    38. #"---------------------------------------------------------------------------"
    39. initialDelaySeconds: 3 # 初始化时间
    40. timeoutSeconds: 2 # 超时时间
    41. periodSeconds: 2 # 检测间隔
    42. successThreshold: 1 # 检查成功为2次表示就绪
    43. failureThreshold: 2 # 检测失败1次表示未就绪
    44. preStop: #容器关闭之前执行的命令
    45. restartPolicy: Always
    46. [root@k8s-master01 k8s-day01]# vim nginx-svc.yaml
    47. apiVersion: v1
    48. kind: Service
    49. metadata:
    50. name: nginx-svc
    51. spec:
    52. type: NodePort
    53. ports:
    54. - name: http
    55. port: 80
    56. targetPort: 80 # 映射端口,nginx服务为80端口,如果mysql就3306
    57. nodePort: 30080 # 映射到外部的端口,可以在外部浏览器访问 Node-IP:30080
    58. - name: https # SSL
    59. port: 443
    60. targetPort: 443
    61. nodePort: 30443
    62. selector: # 上方的Nginx设置的 Labels
    63. app: nginx
    1. [root@k8s-master01 k8s-day01]# kubectl apply -f pod-Probe.yaml
    2. pod/nginx created
    3. [root@k8s-master01 k8s-day01]# kubectl get pod -o wide
    4. NAME READY STATUS RESTARTS AGE IP NODE
    5. nginx 0/1 Running 0 5m7s 172.17.125.11 k8s-node01
    6. [root@k8s-master01 k8s-day01]# kubectl apply -f nginx-svc.yaml
    7. service/nginx-svc configured
    8. [root@k8s-master01 k8s-day01]# kubectl get svc
    9. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    10. kubernetes ClusterIP 10.96.0.1 443/TCP 3d20h
    11. nginx-svc NodePort 10.106.106.114 80:30080/TCP,443:30443/TCP 3d15h
    12. # 10.106.106.114:80 -> 192.168.178.54:30080
    13. (部署Pod的Node-IP)
    
    查看报错日志信息:
    
    1. [root@k8s-master01 k8s-day01]# kubectl describe pod nginx | grep -A10 "Event"
    2. Events:
    3. Type Reason Age From Message
    4. ---- ------ ---- ---- -------
    5. Normal Scheduled 3m24s default-scheduler Successfully assigned default/nginx to k8s-node01
    6. Normal Pulled 3m24s kubelet Container image "daocloud.io/library/nginx:latest" already present on machine
    7. Normal Created 3m24s kubelet Created container nginx
    8. Normal Started 3m24s kubelet Started container nginx
    9. Warning Unhealthy 2m39s (x22 over 3m21s) kubelet Readiness probe failed: HTTP probe failed with statuscode: 404
    10. 2、使用容器内部进行访问,可以看到访问成功:
    11. [root@k8s-master01 k8s-day01]# kubectl exec -it nginx -- sh
    12. # curl -I localhost:80
    13. HTTP/1.1 200 OK
    14. Server: nginx/1.19.6
    15. Date: Thu, 11 Nov 2021 06:07:30 GMT
    16. # curl -I 172.17.125.11:80
    17. HTTP/1.1 200 OK
    18. Server: nginx/1.19.6
    19. Date: Thu, 11 Nov 2021 06:15:05 GMT
    20. 3、使用外部、集群IP进行访问进行访问,访问失败,进出流量限制:
    21. [root@k8s-master01 k8s-day01]# curl -I 10.106.106.114:80
    22. curl: (7) Failed connect to 10.106.106.114:80; Connection refused
    23. [root@k8s-master01 k8s-day01]# curl -I 192.168.178.54:30080
    24. curl: (7) Failed connect to 192.168.178.54:30080; Connection refused

    2、正确演示

    1. #找到并修改
    2. readinessProbe:
    3. httpGet:
    4. path: /index.html # 修改此处即可
    5. port: 80
    1. [root@k8s-master01 k8s-day01]# kubectl describe pod nginx | grep -A10 "Event"
    2. Events:
    3. Type Reason Age From Message
    4. ---- ------ ---- ---- -------
    5. Normal Scheduled 3m24s default-scheduler Successfully assigned default/nginx to k8s-node01
    6. Normal Pulled 3m24s kubelet Container image "daocloud.io/library/nginx:latest" already present on machine
    7. Normal Created 3m24s kubelet Created container nginx
    8. Normal Started 3m24s kubelet Started container nginx
    9. Warning Unhealthy 2m39s (x22 over 3m21s) kubelet Readiness probe failed: HTTP probe failed with statuscode: 404
    10. 2、使用容器内部进行访问,可以看到访问成功:
    11. [root@k8s-master01 k8s-day01]# kubectl exec -it nginx -- sh
    12. # curl -I localhost:80
    13. HTTP/1.1 200 OK
    14. Server: nginx/1.19.6
    15. Date: Thu, 11 Nov 2021 06:07:30 GMT
    16. # curl -I 172.17.125.11:80
    17. HTTP/1.1 200 OK
    18. Server: nginx/1.19.6
    19. Date: Thu, 11 Nov 2021 06:15:05 GMT
    20. 3、使用外部、集群IP进行访问进行访问,访问失败,进出流量限制:
    21. [root@k8s-master01 k8s-day01]# curl -I 10.106.106.114:80
    22. curl: (7) Failed connect to 10.106.106.114:80; Connection refused
    23. [root@k8s-master01 k8s-day01]# curl -I 192.168.178.54:80
    24. curl: (7) Failed connect to 192.168.178.54:80; Connection refused
    1. [root@k8s-master01 k8s-day01]# kubectl apply -f pod-Probe.yaml
    2. pod/nginx created
    3. [root@k8s-master01 k8s-day01]# kubectl get pod -o wide
    4. NAME READY STATUS RESTARTS AGE IP NODE
    5. nginx 1/1 Running 0 18s 172.17.125.12 k8s-node01
    6. 1、使用容器内部访问,访问成功:
    7. [root@k8s-master01 k8s-day01]# kubectl exec -it nginx -- sh
    8. # curl -I 172.17.125.12:80
    9. HTTP/1.1 200 OK
    10. Server: nginx/1.19.6
    11. Date: Thu, 11 Nov 2021 06:40:58 GMT
    12. 2、使用容器Cluster-IP、NodePort访问,成功:
    13. [root@k8s-master01 k8s-day01]# kubectl get svc
    14. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    15. kubernetes ClusterIP 10.96.0.1 443/TCP 3d20h
    16. nginx-svc NodePort 10.106.106.114 80:30080/TCP,443:30443/TCP 3d15h
    17. [root@k8s-master01 k8s-day01]# curl -I 10.106.106.114:80
    18. HTTP/1.1 200 OK
    19. Server: nginx/1.19.6
    20. Date: Thu, 11 Nov 2021 06:42:17 GMT
    21. [root@k8s-master01 k8s-day01]# curl -I 192.168.178.54:30080
    22. HTTP/1.1 200 OK
    23. Server: nginx/1.19.6
    24. Date: Thu, 11 Nov 2021 06:42:37 GMT

    7、Pod 优雅关闭

    🔺:零宕机下线应用

    • 合理使用 proStop,进行容器退出时执行的命令

    1、Pod优雅关闭

    模式:

    • postStart

      • 容器在启动之前做的一系列指定操作,比如 提前创建 目录、文件、执行脚本等。

    • preStop

      • 容器关闭之后,执行的命令

      • 通常我们会使用该参数进行 Pod 的优雅关闭,实现 零宕机 下线服务

    1. spec:
    2. terminationGracePeriods: 90s
    3. containers:
    4. lifecycle:
    5. preStop: #容器关闭之前执行的命令
    6. exec:
    7. command:
    8. - sh
    9. - -c
    10. - sleep 90;kill `pgrep nginx`
    • 可以看到下方的 yaml 配置 ,nginx 在退出时,执行了睡眠操作,保证容器中的服务 有足够的时间进行下线操作(处理服务关闭之前,接收的服务未进行处理,等待处理完成后,关闭服务,保证数据的完整性)

    🔺注意:

    • 我们往往会忽视一个参数,terminationGracePeriodSeconds (容器优雅的关闭的时间间隔)

    • 这参数默认为30秒,就算你不设置, terminationGracePeriodSeconds: 30

    再次注意:

    • 如果你想使 容器 进行 90s 的优雅关闭时长,那你的参数应该为 terminationGracePeriodSeconds: 90

      • 加入你设置的 sleep 时长为 90s ,你的参数为 terminationGracePeriodSeconds: 30,那肯定容器只等待30s左右就会关闭,你应该设置参数为 50s,才能保证 sleep 50 运行成功

    • 所以我们在进行容器优雅下线时,要合理使用 preStop 与 该参数

    2、效果演示

    1️⃣默认情况:terminationGracePeriodSeconds: 30

    1. apiVersion: v1 # 必选,API的版本号
    2. kind: Pod # 必选,类型Pod
    3. metadata: # 必选,元数据
    4. name: nginx # 必选,符合RFC 1035规范的Pod名称
    5. # namespace: default # 可选,Pod所在的命名空间,不指定默认为default,可以使用-n 指定namespace
    6. labels: # 可选,标签选择器,一般用于过滤和区分Pod,根据业务自定义
    7. app: nginx
    8. role: frontend # 可以写多个
    9. annotations: # 可选,注释列表,可以写多个
    10. app: nginx1.21 #可以注释一些 Nginx版本
    11. spec: # 必选,用于定义容器的详细信息
    12. nodeSelector:
    13. kubernetes.io/hostname: k8s-node01
    14. containers: # 必选,容器列表
    15. - name: nginx # 必选,符合RFC 1035规范的容器名称
    16. image: daocloud.io/library/nginx:latest # 必选,容器所用的镜像的地址
    17. imagePullPolicy: IfNotPresent # 可选,镜像拉取策略, IfNotPresent: 如果宿主机有这个镜像,那就不需要拉取了. Always: 总是拉取, Never: 不管是否存储都不拉去
    18. command: # 可选,容器启动执行的命令 ENTRYPOINT, arg --> cmd
    19. - nginx
    20. - -g
    21. - "daemon off;"
    22. workingDir: /usr/share/nginx/html # 可选,容器的工作目录
    23. ports: # 可选,容器需要暴露的端口号列表
    24. - name: http # 端口名称
    25. containerPort: 80 # 端口号
    26. protocol: TCP # 端口协议,默认TCP
    27. env: # 可选,环境变量配置列表
    28. - name: TZ # 变量名
    29. value: Asia/Shanghai # 变量的值
    30. - name: LANG
    31. value: en_US.utf8
    32. startupProbe: # 可选,检测容器内进程是否完成启动。注意三种检查方式同时只能使用一种。
    33. tcpSocket:
    34. port: 80
    35. readinessProbe: # 可选,健康检查。注意三种检查方式同时只能使用一种。
    36. httpGet: # httpGet检测方式,生产环境建议使用httpGet实现接口级健康检查,健康检查由应用程序提供。
    37. path: / # 检查路径
    38. port: 80 # 监控端口
    39. livenessProbe: # 可选,健康检查
    40. httpGet: # httpGet检测方式
    41. path: /index.html # 检查路径
    42. port: 80
    43. initialDelaySeconds: 3 # 初始化时间
    44. timeoutSeconds: 2 # 超时时间
    45. periodSeconds: 2 # 检测间隔
    46. successThreshold: 1 # 检查成功为2次表示就绪
    47. failureThreshold: 2 # 检测失败1次表示未就绪
    48. lifecycle:
    49. preStop: #容器关闭之前执行的命令
    50. exec:
    51. command:
    52. - sh
    53. - -c
    54. #"----------------------------------------------------------------------"
    55. - sleep 90;kill `pgrep nginx` #设置 90 秒关闭 容器
    56. #"----------------------------------------------------------------------"
    57. restartPolicy: Always
    1. [root@k8s-master01 k8s-day01]# kubectl apply -f pod-Probe.yaml
    2. pod/nginx created
    3. [root@k8s-master01 k8s-day01]# kubectl get pod
    4. NAME READY STATUS RESTARTS AGE
    5. nginx 1/1 Running 0 15s
    6. [root@k8s-master01 k8s-day01]# time kubectl delete -f pod-Probe.yaml
    7. pod "nginx" deleted
    8. real 0m36.076s
    9. user 0m0.051s
    10. sys 0m0.031s
    11. #这里可以看到,容器并没有 90 秒退出,默认的 terminationGracePeriodSeconds 为30s

    2️⃣修改:terminationGracePeriodSeconds: 90s

    1. spec: # 必选,用于定义容器的详细信 息
    2. nodeSelector:
    3. kubernetes.io/hostname: k8s-node01
    4. # "----------------------------------------------------------------------"
    5. terminationGracePeriodSeconds: 90 #添加此行,为 90s 进行优雅关闭容器
    6. # "-----------------------------------------------------------------------"
    1. [root@k8s-master01 k8s-day01]# kubectl apply -f pod-Probe.yaml
    2. pod/nginx created
    3. [root@k8s-master01 k8s-day01]# time kubectl delete -f pod-Probe.yaml
    4. pod "nginx" deleted
    5. real 1m32.343s #可以看到 关闭时长为 90s
    6. user 0m0.057s
    7. sys 0m0.022s
  • 相关阅读:
    【新版本来袭】ONLYOFFICE桌面编辑器8.1 —— 重塑办公效率与体验
    list部分接口模拟实现(c++)
    【Java数据结构与算法】LeetCode 0019. 删除链表的倒数第N个结点
    Mysql GTID
    Matlab进阶绘图第30期—冲击图
    按关键字搜索商品 (淘宝)
    算法之双指针
    一文解读ISO26262安全标准:概念阶段
    uniapp原生插件开发(Android)
    关于XXLJOB集群模式下调度失败的问题
  • 原文地址:https://blog.csdn.net/weixin_56903457/article/details/127841169