电子商业网站建设步骤,免费查询个人名下公司,it运维服务管理体系,河南网站建设哪里有Kubernetes#xff08;k8s#xff09;之容器的探测一、探测类型及使用场景1.1、startupProbe#xff08;启动探测#xff09;1.2、readinessProbe#xff08;就绪探测#xff09;1.3、livenessProbe#xff08;存活探测#xff09;二、检查机制三、探测结果四、容器探测…
Kubernetesk8s之容器的探测一、探测类型及使用场景1.1、startupProbe启动探测1.2、readinessProbe就绪探测1.3、livenessProbe存活探测二、检查机制三、探测结果四、容器探测案例一、探测类型及使用场景
1.1、startupProbe启动探测
指示容器中的应用是否已经启动。如果提供了启动探针则所有其他探针都会被禁用直到此探针成功为止。探测成功之后启动探测停止。如果启动探测失败kubelet 将杀死容器而容器依其 重启策略进行重启。 如果容器没有提供启动探测则默认状态为 Success。
使用场景 容器需要较长时间才能启动就绪的 Pod 可以指定启动探针。那么可以避免设置一个超长时间间隔的存活探测。例如容器需要在启动期间加载大型数据、配置文件或执行迁移等
1.2、readinessProbe就绪探测
指示容器是否准备好为请求提供服务。如果就绪态探测失败 端点控制器将从与 Pod 匹配的所有服务的端点列表中删除该 Pod 的 IP 地址。 初始延迟之前的就绪态的状态值默认为 Failure。 如果容器不提供就绪态探针则默认状态为 Success。就绪探测失败时不会杀死容器进程只会将端点从service中移除使其收不到流量。
使用场景
仅在探测成功时才开始向 Pod 发送请求流量意味着pod只在探测成功之后才开始接受请求数据。如果应用程序对后端服务有严格的依赖性可以同时实现存活态和就绪态探针存活态探针检测通过后可以通过就绪态探针会额外检查每个所需的后端服务是否可用
1.3、livenessProbe存活探测
指示容器是否正在运行。如果存活态探测失败则 kubelet 会杀死容器 并且容器将根据其重启策略决定未来。如果容器不提供存活探针 则默认状态为 Success。
使用场景
如果希望容器在探测失败时被杀死并重新启动并指定 restartPolicy 为 “Always” 或OnFailure。如果容器中的进程能够在遇到问题或不健康的情况下自行崩溃可以不需要指定存活探针。kubelet 将根据 Pod 的 restartPolicy 自动执行修复操作。
二、检查机制
1exec。在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。 2httpGet。对容器的 IP 地址上指定端口和路径执行 HTTP GET 请求。如果响应的状态码大于等于 200 且小于400则诊断被认为是成功的。 3tcpSocket。对容器的 IP 地址上的指定端口执行 TCP 检查。如果端口打开则诊断被认为是成功的。 4grpc。使用 gRPC 执行一个远程过程调用。 目标应该实现 gRPC健康检查。 如果响应的状态是 “SERVING”则认为诊断成功。 gRPC 探针是一个 alpha 特性只有在你启用了 “GRPCContainerProbe” 特性时才能使用。
三、探测结果
1Success成功容器通过了诊断。 2Failure失败容器未通过诊断。 3Unknown未知诊断失败因此不会采取任何行动。
四、容器探测案例
apiVersion: v1
kind: Pod
metadata:name: myhello-podnamespace: defaultlabels:name: myhello-podenv: dev
spec:restartPolicy: AlwaysinitContainers:- name: init-myserviceimage: busybox# 查找命名空间下myservice服务如果存在则执行成功如果不存在则一直查找command: [sh, -c, until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done]- name: init-mydbimage: busybox# 查找命名空间下mydb服务如果存在则执行成功如果不存在则一直查找command: [sh, -c, until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done]containers:- name: myhelloimage: nongtengfei/hello:curlimagePullPolicy: IfNotPresentports:- containerPort: 80command: [./app]args: [--param1k8s-p1, --param2k8s-p2]resources:limits:cpu: 200mmemory: 500Mirequests:cpu: 100mmemory: 200Mienv: # 注入到容器的环境变量- name: env1value: k8s-env1- name: env2value: k8s-env2lifecycle:postStart:exec:command: [/bin/sh, -c,echo post start command exec /tmp/data]preStop:exec:command: [/bin/sh, -c,echo pre stop command exec /tmp/data]startupProbe:exec:command: [/bin/sh, -c,statuscodecurl -o /dev/null -s -w % {http_code} http://localhost/healthz; [ $$statuscode -le 400 ] || exit 1]# 指定初始化时间即探针在容器启动之后的延迟时长initialDelaySeconds: 5# 探测周期即每隔多长时间探测一次periodSeconds: 5# 最小连续失败次数即连续失败多少次表示探测失败failureThreshold: 3# 最小连续成功次数即连续探测成功多少次表示探测成功liveness 和 startup 必须为1successThreshold: 1# 探测超时时间timeoutSeconds: 1readinessProbe:httpGet:path: /healthport: 80initialDelaySeconds: 5periodSeconds: 5failureThreshold: 3successThreshold: 1timeoutSeconds: 1livenessProbe:httpGet:path: /healthport: 80initialDelaySeconds: 5periodSeconds: 5failureThreshold: 3successThreshold: 1timeoutSeconds: 1- name: myredis #容器的名称image: redis #容器对应的 Docker ImageimagePullPolicy: IfNotPresentports:- containerPort: 6379resources:limits:cpu: 200mmemory: 500Mirequests:cpu: 100mmemory: 200MilivenessProbe:tcpSocket:port: 6379initialDelaySeconds: 5periodSeconds: 5failureThreshold: 3successThreshold: 1timeoutSeconds: 1