ToB企服应用市场:ToB评测及商务社交产业平台

标题: K8s Pod状态与容器探针 [打印本页]

作者: 缠丝猫    时间: 2023-6-1 01:43
标题: K8s Pod状态与容器探针
1、pod的调度流程及常见状态

1.1、pod的调度流程


Pod创建过程如上图所示,首先用户向apiserver发送创建pod的请求,apiserver收到用于创建pod请求后,对应会对该用户身份信息进行验证,该用户是否是合法的用户,是否具有创建pod的权限,如果能够通过apiserver的验证,则进行下一步,对用户提交的资源进行准入控制,所谓准入控制是指对用户提交的资源做格式,语法的验证,是否满足apiserver中定义的对应资源的api格式和语法;如果上述身份验证和准入控制能够顺利通过,接下来,apiserver才会把对应创建pod的信息存入etcd中,否者就直接拒绝用户创建pod;etcd将对应数据存放好以后,会返回给apiserver一个事件,即创建pod的相关信息已经存入etcd中了;apiserver收到etcd的资源信息存入完成事件后,会返回给用户一个pod创建完成的消息;随后,scheduler通过监视到apiserver上的资源变动事件,会对pod进行调度,调度规则就是先预选(预选就是把不符合pod运行的节点先踢出去,然后在剩下的节点中进行优选),然后再优选(优选就是在满足预选留下的节点中进行打分,得分高者负责运行pod);scheduler最后通过预选+优选的方式把pod调度到后端某个node节点上运行的结果返回给apiserver,由apiserver将最终调度信息存入etcd中,等待etcd将对应调度信息更新完毕后,再返回给apiserver一个pod状态信息更新完毕,apiserver再将对应状态返回给scheduler;随后负责运行pod的node节点上的kubelet通过监视apiserver的资源变动事件,会发现一个和自己相关的事件,此时对应节点上的kubelet会调用本地容器引擎,将对应pod在本地运行起来;当本地容器引擎将pod正常运行起来后,对应容器引擎会返回给本地kubelet一个pod运行完成的事件,随后再由kubelet将对应事件返回给apiserver,随后apiserver再将pod状态信息存入etcd中,etcd将更新pod状态信息完成的事件通过apiserver将对应事件返回给kubelet;如果此时用户查询pod状态,就能够正常通过apiserver在etcd中检索出来的pod状态;以上就是pod创建的一个大概过程;
1.2、pod的常见状态

2、pause容器及init容器

2.1、pause容器简介

Pause 容器,又叫 Infra 容器,是pod的基础容器,镜像体积只有几百KB左右,配置在kubelet中,主要的功能是一个pod中多个容器的网络通信。
Infra 容器被创建后会初始化 Network Namespace,之后其它容器就可以加入到 Infra 容器中共享Infra 容器的网络了,因此如果一个 Pod 中的两个容器 A 和 B,那么关系如下 :
2.2、Pause容器共享的Namespace

2.3、Pause容器Namespace验证

1、 运行pod,进入容器查看iflink编号

2、到pod所在宿主机验证网卡

2.4、pause容器配置示例

2.4.1、准备nginx配置文件,并配置动静分离
  1. error_log stderr;
  2. events { worker_connections 1024; }
  3. http {
  4.   access_log /dev/stdout;
  5.   server {
  6.     listen 80 default_server;
  7.     server_name www.mysite.com;
  8.     location / {
  9.       index index.html index.php;
  10.       root /usr/share/nginx/html;
  11.     }
  12.     location ~ \.php$ {
  13.     root /usr/share/nginx/html;
  14.     fastcgi_pass 127.0.0.1:9000;
  15.     fastcgi_index index.php;
  16.     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  17.     include fastcgi_params;
  18.     }
  19.   }
  20. }
复制代码
2.4.2、部署pause容器

2.4.2.1、下载pause镜像
  1. nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.8
复制代码

2.4.2.2、运行pause镜像为容器
  1. nerdctl run -d -p 80:80 --name pause-container-test registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.8
复制代码

2.4.3、准备测试web页面
  1. root@deploy:~# mkdir html
  2. root@deploy:~# cd html
  3. root@deploy:~/html# echo "<h1>pause container web test</h1>" >index.html
  4. root@deploy:~/html# cat >> index.php << EOF
  5. > <?php
  6. >      phpinfo();
  7. > ?>
  8. > EOF
  9. root@deploy:~/html# ll
  10. total 16
  11. drwxr-xr-x 2 root root 4096 May 26 00:03 ./
  12. drwxr-xr-x 9 root root 4096 May 26 00:02 ../
  13. -rw-r--r-- 1 root root   34 May 26 00:02 index.html
  14. -rw-r--r-- 1 root root   25 May 26 00:03 index.php
  15. root@deploy:~/html# cat index.html
  16. <h1>pause container web test</h1>
  17. root@deploy:~/html# cat index.php
  18. <?php
  19.      phpinfo();
  20. ?>
  21. root@deploy:~/html#
复制代码
2.4.4、部署nginx 容器,并使用pause容器网络
  1. nerdctl run -d --name nginx-container-test \
  2.             -v `pwd`/nginx.conf:/etc/nginx/nginx.conf \
  3.             -v `pwd`/html:/usr/share/nginx/html \
  4.             --net=container:pause-container-test \
  5.             nginx:1.20.2
复制代码

2.4.5、部署php容器,并使用pause容器网络
  1. nerdctl run -d --name php-container-test \
  2.             -v `pwd`/html:/usr/share/nginx/html \
  3.             --net=container:pause-container-test \
  4.             php:5.6.40-fpm
复制代码

2.4.6、pause容器验证

访问宿主机的80端口的index.php,看看是否能够访问到php页面?

2.5、init容器简介

2.5.1、init容器的作用

2.5.2、init容器的特点

2.5.3、init容器示例
  1. kind: Deployment
  2. #apiVersion: extensions/v1beta1
  3. apiVersion: apps/v1
  4. metadata:
  5.   labels:
  6.     app: myserver-myapp
  7.   name: myserver-myapp-deployment-name
  8.   namespace: myserver
  9. spec:
  10.   replicas: 1
  11.   selector:
  12.     matchLabels:
  13.       app: myserver-myapp-frontend
  14.   template:
  15.     metadata:
  16.       labels:
  17.         app: myserver-myapp-frontend
  18.     spec:
  19.       containers:
  20.         - name: myserver-myapp-container
  21.           image: nginx:1.20.0
  22.           #imagePullPolicy: Always
  23.           volumeMounts:
  24.           - mountPath: "/usr/share/nginx/html/myserver"
  25.             name: myserver-data
  26.           - name: tz-config
  27.             mountPath: /etc/localtime
  28.       initContainers:
  29.         - name: init-web-data
  30.           image: centos:7.9.2009
  31.           command: ['/bin/bash','-c',"for i in `seq 1 10`;do echo '<h1>'$i web page at $(date +%Y%m%d%H%M%S) '<h1>' >> /data/nginx/html/myserver/index.html;sleep 1;done"]
  32.           volumeMounts:
  33.           - mountPath: "/data/nginx/html/myserver"
  34.             name: myserver-data
  35.           - name: tz-config
  36.             mountPath: /etc/localtime
  37.         - name: change-data-owner
  38.           image: busybox:1.28
  39.           command: ['/bin/sh','-c',"/bin/chmod 644 /data/nginx/html/myserver/* -R"]
  40.           volumeMounts:
  41.           - mountPath: "/data/nginx/html/myserver"
  42.             name: myserver-data
  43.           - name: tz-config
  44.             mountPath: /etc/localtime
  45.       volumes:
  46.       - name: myserver-data
  47.         hostPath:
  48.           path: /tmp/data/html
  49.       - name: tz-config
  50.         hostPath:
  51.           path: /etc/localtime
  52. ---
  53. kind: Service
  54. apiVersion: v1
  55. metadata:
  56.   labels:
  57.     app: myserver-myapp-service
  58.   name: myserver-myapp-service-name
  59.   namespace: myserver
  60. spec:
  61.   type: NodePort
  62.   ports:
  63.   - name: http
  64.     port: 80
  65.     targetPort: 80
  66.     nodePort: 30080
  67.   selector:
  68.     app: myserver-myapp-frontend
复制代码
上述配置清单,主要利用两个初始化容器对nginx主容器生成数据和修改数据文件权限的操作;在spec.template.spec字段下用initcontainers来定义初始化容器相关内容;
应用配置清单

访问nginx服务,看看对应数据是否生成?

2.6、Health Check

health check是指对容器做健康状态检测;该检测主要确保容器里的某些服务是否处于健康状态;该检测是一个周期性的动作,即每隔几秒或指定时间周期内进行检测;
2.6.1、docker health check实现方式

2.6.1.1、在docker-compose实现健康状态检测
  1. version: '3.6'
  2. services:
  3.   nginx-service:
  4.     image: nginx:1.20.2
  5.     container_name: nginx-web1
  6.     expose:
  7.       - 80
  8.       - 443
  9.     ports:
  10.       - "80:80"
  11.       - "443:443"
  12.     restart: always
  13.     healthcheck: #添加服务健康状态检查
  14.       test: ["CMD", "curl", "-f", "http://localhost"]
  15.       interval: 5s #健康状态检查的间隔时间,默认为30s
  16.       timeout: 5s #单次检查的失败超时时间,默认为30s
  17.       retries: 3 #连续失败次数默认3次,当连续失败retries次数后将容器置为unhealthy状态
  18.       start_period: 60s #60s后每间隔interval的时间检查一次,连续retries次后才将容器置为unhealthy状态, 但是start_period时间内检查成功就认为是检查成功并装容器置于healthy状态
复制代码
应用配置清单
  1. docker-compose -f docker-compose-demo.yaml up -d
复制代码
验证容器健康状态

2.6.1.2、在dockerfile实现健康状态检测
  1. FROM nginx:1.20.2
  2. HEALTHCHECK --interval=5s --timeout=2s --retries=3 \
  3. CMD curl --silent --fail localhost:80 || exit 1
复制代码
生成镜像
  1. docker build -t mynginx:1.20.2 -f ./dockerfile .
复制代码
运行容器
  1. docker run -it -d -p 80:80 mynginx:1.20.2
复制代码
验证健康状态检测
  1. root@k8s-deploy:/compose# docker ps
  2. CONTAINER ID   IMAGE            COMMAND                  CREATED         STATUS                            PORTS                               NAMES
  3. c3af9bdd5a41   mynginx:1.20.2   "/docker-entrypoint.…"   4 seconds ago   Up 2 seconds (health: starting)   0.0.0.0:80->80/tcp, :::80->80/tcp   keen_brown
  4. root@k8s-deploy:/compose# docker ps
  5. CONTAINER ID   IMAGE            COMMAND                  CREATED         STATUS                   PORTS                               NAMES
  6. c3af9bdd5a41   mynginx:1.20.2   "/docker-entrypoint.…"   9 seconds ago   Up 8 seconds (healthy)   0.0.0.0:80->80/tcp, :::80->80/tcp   keen_brown
  7. root@k8s-deploy:/compose#
复制代码
在检测通过之前容器处于starting状态,检测通过(检测返回状态码为 0)之后为healthy状态,检测失败(检测返回状态码为 1)之后为unhealthy状态;
3、kubernetes pod生命周期

pod的生命周期( pod lifecycle),从pod start时候可以配置postStart检测,运行过程中可以配置livenessProbe和readinessProbe,最后在 stop前可以配置preStop操作。

3.1、探针简介

探针是由 kubelet 对容器执行的定期诊断,以保证Pod的状态始终处于运行状态,要执行诊断,kubelet 调用由容器实现的Handler(处理程序),也成为Hook(钩子),有三种类型的处理程序:
每次探测都将获得以下三种结果之一:
Pod 重启策略:Pod 一旦配置探针,在检测失败时候,会基于restartPolicy 对 Pod进行下一步操作:
3.2、探针类型

3.3、探针配置参数

探针有很多配置字段,可以使用这些字段精确的控制存活和就绪检测的行为,官方文档https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
3.3.1、探针http配置参数

HTTP 探测器可以在 httpGet 上配置额外的字段
3.4、探针示例

3.4.1、使用httpGet实现pod存活性探测
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: myserver-myapp-frontend-deployment
  5.   namespace: myserver
  6. spec:
  7.   replicas: 1
  8.   selector:
  9.     matchLabels: #rs or deployment
  10.       app: myserver-myapp-frontend-label
  11.     #matchExpressions:
  12.     #  - {key: app, operator: In, values: [myserver-myapp-frontend,ng-rs-81]}
  13.   template:
  14.     metadata:
  15.       labels:
  16.         app: myserver-myapp-frontend-label
  17.     spec:
  18.       containers:
  19.       - name: myserver-myapp-frontend-label
  20.         image: nginx:1.20.2
  21.         ports:
  22.         - containerPort: 80
  23.         readinessProbe:
  24.         livenessProbe:
  25.           httpGet:
  26.             #path: /monitor/monitor.html
  27.             path: /index.html
  28.             port: 80
  29.           initialDelaySeconds: 5
  30.           periodSeconds: 3
  31.           timeoutSeconds: 1
  32.           successThreshold: 1
  33.           failureThreshold: 3
  34. ---
  35. apiVersion: v1
  36. kind: Service
  37. metadata:
  38.   name: myserver-myapp-frontend-service
  39.   namespace: myserver
  40. spec:
  41.   ports:
  42.   - name: http
  43.     port: 81
  44.     targetPort: 80
  45.     nodePort: 40012
  46.     protocol: TCP
  47.   type: NodePort
  48.   selector:
  49.     app: myserver-myapp-frontend-label
复制代码
上述配置清单,主要描述了使用httpget探针对nginxpod进行存活性探测,探测方法就是对容器的80端口,路径为/index.html进行每隔3秒访问一次,探测超时等待1秒,如果连续3次访问失败,则该pod存活性探测失败;只要有一次访问成功,则该pod存活性探测成功;
3.4.2、使用tcpSocket实现pod存活性探测
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: myserver-myapp-frontend-deployment
  5.   namespace: myserver
  6. spec:
  7.   replicas: 1
  8.   selector:
  9.     matchLabels: #rs or deployment
  10.       app: myserver-myapp-frontend-label
  11.     #matchExpressions:
  12.     #  - {key: app, operator: In, values: [myserver-myapp-frontend,ng-rs-81]}
  13.   template:
  14.     metadata:
  15.       labels:
  16.         app: myserver-myapp-frontend-label
  17.     spec:
  18.       containers:
  19.       - name: myserver-myapp-frontend-label
  20.         image: nginx:1.20.2
  21.         ports:
  22.         - containerPort: 80
  23.         livenessProbe:
  24.         #readinessProbe:
  25.           tcpSocket:
  26.             port: 80
  27.             #port: 8080
  28.           initialDelaySeconds: 5
  29.           periodSeconds: 3
  30.           timeoutSeconds: 5
  31.           successThreshold: 1
  32.           failureThreshold: 3
  33. ---
  34. apiVersion: v1
  35. kind: Service
  36. metadata:
  37.   name: myserver-myapp-frontend-service
  38.   namespace: myserver
  39. spec:
  40.   ports:
  41.   - name: http
  42.     port: 81
  43.     targetPort: 80
  44.     nodePort: 40012
  45.     protocol: TCP
  46.   type: NodePort
  47.   selector:
  48.     app: myserver-myapp-frontend-label
复制代码
3.4.3、使用exec执行命令的方式实现pod存活性探测
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: myserver-myapp-redis-deployment
  5.   namespace: myserver
  6. spec:
  7.   replicas: 1
  8.   selector:
  9.     matchLabels: #rs or deployment
  10.       app: myserver-myapp-redis-label
  11.     #matchExpressions:
  12.     #  - {key: app, operator: In, values: [myserver-myapp-redis,ng-rs-81]}
  13.   template:
  14.     metadata:
  15.       labels:
  16.         app: myserver-myapp-redis-label
  17.     spec:
  18.       containers:
  19.       - name: myserver-myapp-redis-container
  20.         image: redis
  21.         ports:
  22.         - containerPort: 6379
  23.         livenessProbe:
  24.         #readinessProbe:
  25.           exec:
  26.             command:
  27.             #- /apps/redis/bin/redis-cli
  28.             - /usr/local/bin/redis-cli
  29.             - quit
  30.           initialDelaySeconds: 5
  31.           periodSeconds: 3
  32.           timeoutSeconds: 5
  33.           successThreshold: 1
  34.           failureThreshold: 3
  35.       
  36. ---
  37. apiVersion: v1
  38. kind: Service
  39. metadata:
  40.   name: myserver-myapp-redis-service
  41.   namespace: myserver
  42. spec:
  43.   ports:
  44.   - name: http
  45.     port: 6379
  46.     targetPort: 6379
  47.     nodePort: 40016
  48.     protocol: TCP
  49.   type: NodePort
  50.   selector:
  51.     app: myserver-myapp-redis-label
复制代码
3.4.4、启动探针示例
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: myserver-myapp-frontend-deployment
  5.   namespace: myserver
  6. spec:
  7.   replicas: 1
  8.   selector:
  9.     matchLabels: #rs or deployment
  10.       app: myserver-myapp-frontend-label
  11.     #matchExpressions:
  12.     #  - {key: app, operator: In, values: [myserver-myapp-frontend,ng-rs-81]}
  13.   template:
  14.     metadata:
  15.       labels:
  16.         app: myserver-myapp-frontend-label
  17.     spec:
  18.       containers:
  19.       - name: myserver-myapp-frontend-label
  20.         image: nginx:1.20.2
  21.         ports:
  22.         - containerPort: 80
  23.         startupProbe:
  24.           httpGet:
  25.             path: /index.html
  26.             port: 80
  27.           initialDelaySeconds: 5 #首次检测延迟5s
  28.           failureThreshold: 3  #从成功转为失败的次数
  29.           periodSeconds: 3 #探测间隔周期
  30. ---
  31. apiVersion: v1
  32. kind: Service
  33. metadata:
  34.   name: myserver-myapp-frontend-service
  35.   namespace: myserver
  36. spec:
  37.   ports:
  38.   - name: http
  39.     port: 81
  40.     targetPort: 80
  41.     nodePort: 40012
  42.     protocol: TCP
  43.   type: NodePort
  44.   selector:
  45.     app: myserver-myapp-frontend-label
复制代码
3.4.5、启动探针,存活探针,就绪探针示例
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: myserver-myapp-frontend-deployment
  5.   namespace: myserver
  6. spec:
  7.   replicas: 3
  8.   selector:
  9.     matchLabels: #rs or deployment
  10.       app: myserver-myapp-frontend-label
  11.     #matchExpressions:
  12.     #  - {key: app, operator: In, values: [myserver-myapp-frontend,ng-rs-81]}
  13.   template:
  14.     metadata:
  15.       labels:
  16.         app: myserver-myapp-frontend-label
  17.     spec:
  18.       terminationGracePeriodSeconds: 60
  19.       containers:
  20.       - name: myserver-myapp-frontend-label
  21.         image: nginx:1.20.2
  22.         ports:
  23.         - containerPort: 80
  24.         startupProbe:
  25.           httpGet:
  26.             path: /index.html
  27.             port: 80
  28.           initialDelaySeconds: 5 #首次检测延迟5s
  29.           failureThreshold: 3  #从成功转为失败的次数
  30.           periodSeconds: 3 #探测间隔周期
  31.         readinessProbe:
  32.           httpGet:
  33.             #path: /monitor/monitor.html
  34.             path: /index.html
  35.             port: 80
  36.           initialDelaySeconds: 5
  37.           periodSeconds: 3
  38.           timeoutSeconds: 5
  39.           successThreshold: 1
  40.           failureThreshold: 3
  41.         livenessProbe:
  42.           httpGet:
  43.             #path: /monitor/monitor.html
  44.             path: /index.html
  45.             port: 80
  46.           initialDelaySeconds: 5
  47.           periodSeconds: 3
  48.           timeoutSeconds: 5
  49.           successThreshold: 1
  50.           failureThreshold: 3
  51. ---
  52. apiVersion: v1
  53. kind: Service
  54. metadata:
  55.   name: myserver-myapp-frontend-service
  56.   namespace: myserver
  57. spec:
  58.   ports:
  59.   - name: http
  60.     port: 81
  61.     targetPort: 80
  62.     nodePort: 40012
  63.     protocol: TCP
  64.   type: NodePort
  65.   selector:
  66.     app: myserver-myapp-frontend-label
复制代码
3.5、postStart and preStop handlers简介


官方文档https://kubernetes.io/zh/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/
postStart 和 preStop handlers 处理函数
3.5.1、postStart and preStop handlers示例
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: myserver-myapp1-lifecycle
  5.   labels:
  6.     app: myserver-myapp1-lifecycle
  7.   namespace: myserver
  8. spec:
  9.   replicas: 1
  10.   selector:
  11.     matchLabels:
  12.       app: myserver-myapp1-lifecycle-label
  13.   template:
  14.     metadata:
  15.       labels:
  16.         app: myserver-myapp1-lifecycle-label
  17.     spec:
  18.       terminationGracePeriodSeconds: 60
  19.       containers:
  20.       - name: myserver-myapp1-lifecycle-label
  21.         image: tomcat:7.0.94-alpine
  22.         lifecycle:
  23.           postStart:
  24.             exec:
  25.              #command: 把自己注册到注册在中心
  26.               command: ["/bin/sh", "-c", "echo 'Hello from the postStart handler' >> /usr/local/tomcat/webapps/ROOT/index.html"]
  27.             #httpGet:
  28.             #  #path: /monitor/monitor.html
  29.             #  host: www.magedu.com
  30.             #  port: 80
  31.             #  scheme: HTTP
  32.             #  path: index.html
  33.           preStop:
  34.             exec:
  35.              #command: 把自己从注册中心移除
  36.               command:
  37.                 - /bin/bash
  38.                 - -c
  39.                 - 'sleep 10000000'
  40.               #command: ["/usr/local/tomcat/bin/catalina.sh","stop"]
  41.               #command: ['/bin/sh','-c','/path/preStop.sh']
  42.         ports:
  43.           - name: http
  44.             containerPort: 8080
  45. ---
  46. apiVersion: v1
  47. kind: Service
  48. metadata:
  49.   name: myserver-myapp1-lifecycle-service
  50.   namespace: myserver
  51. spec:
  52.   ports:
  53.   - name: http
  54.     port: 80
  55.     targetPort: 8080
  56.     nodePort: 30012
  57.     protocol: TCP
  58.   type: NodePort
  59.   selector:
  60.     app: myserver-myapp1-lifecycle-label
复制代码
3.6、Pod的终止流程


        出处:https://www.cnblogs.com/qiuhom-1874/        本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4