失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > @kubernetes(k8s)pod服务探针(健康检查)及回调钩子HOOK详解

@kubernetes(k8s)pod服务探针(健康检查)及回调钩子HOOK详解

时间:2019-05-02 07:45:14

相关推荐

@kubernetes(k8s)pod服务探针(健康检查)及回调钩子HOOK详解

文章目录

服务探针与回调hook(健康检查)一、存活性探针(LivenessProbe)1、存活型检查基本用法2、存活性探针三种使用方式【ExecAction】【TCPSocketAction】【HTTPGetAction】二、就绪型探针(ReadinessProbe)1、就绪型检查用法2、ReadinessProbe的使用(多种使用方式同上)3、多版本多资源(存活性与就绪型)平滑更新,平滑下线【基础参数】【多版本多资源更新的使用】三、回调Hook1、回调hook概述:2、回调hook常用的两种钩子函数3、回调hook的使用方式4、回调hook的基本用法4、回调hook的使用【PostStart】【PostStop】

服务探针与回调hook(健康检查)

分布式系统和微服务体系结构的挑战之一是自动检测不正常的应用程序,并将请求(request)重新路由到其他可用系统,恢复损坏的组件。健康检查是应对该挑战的一种可靠方法。使用 Kubernetes,可以通过探针配置运行状况检查,以确定每个 Pod 的状态

Kubernetes提供了健康检查服务,对于检测到故障服务会被及时自动下线,以及通过重启服务的方式使服务自动恢复

pod生命周期

一、存活性探针(LivenessProbe)

存活性探针用于判断容器是否存活,即Pod是否为running状态

如果LivenessProbe探针探测到容器不健康,则kubelet将kill掉容器,并根据容器的重启策略判断按照那种方式重启,

如果一个容器不包含LivenessProbe探针,则Kubelet认为容器的LivenessProbe探针的返回值永远成功

1、存活型检查基本用法

1)用于判断容器是否存活2)处理的方式:如果判断失败,则重启POD3)存活性检测使用exec,就绪性检测使用tcpSocket,httpGet#探针相关参数:delay=0s :容器启动多久开始探测timeout=1s :容器探测超时时间period=10s :探测的频率success=1 :探测成功多少次为成功failure=3:探测失败多少次为失败

2、存活性探针三种使用方式

ExecAction

TCPSocketAction

HTTPGetAction

【ExecAction】

通过执行一条命令,探测服务是否可以正常对外提供服务

#资源清单编写:[root@m01 /hzl]# cat LivenessProbe.yaml ---kind: DeploymentapiVersion: apps/v1metadata:name: test-deploymentspec:replicas: 1selector:matchLabels:app: deploymenttemplate:metadata:labels:app: deploymentspec:containers:- name: nginximage: alvinos/django:v1livenessProbe:exec:command:- "/bin/sh"- "-c"- "cat /root/test/manage.py" ---kind: ServiceapiVersion: v1metadata:name: test-svcnamespace: defaultspec:ports:- port: 80targetPort: 80name: httpselector:app: deployment#创建pod[root@m01 /hzl]# kubectl create -f LivenessProbe.yaml deployment.apps/test-deployment createdservice/test-svc created#查看详细信息[root@m01 /hzl]# kubectl describe deployments.apps test-deployment Name: test-deploymentNamespace: defaultCreationTimestamp:Sat, 07 Aug 12:14:10 +0800Labels: <none>Annotations: deployment.kubernetes.io/revision: 1Selector:app=deploymentReplicas:1 desired | 1 updated | 1 total | 1 available | 0 unavailableStrategyType: RollingUpdateMinReadySeconds: 0RollingUpdateStrategy: 25% max unavailable, 25% max surgePod Template:Labels: app=deploymentContainers:nginx:Image: alvinos/django:v1Port: <none>Host Port: <none> #使用exec执行的命令,判断是否存活(如果可以查看到manage文件,则表示表示探测成功,反则失败)Liveness:exec [/bin/sh -c cat /root/test/manage.py] delay=0s timeout=1s period=10s #success=········.....#查看pod状态[root@m01 /hzl]# kubectl get podNAME READY STATUS RESTARTS AGEnginx-6799fc88d8-xtg4p 1/1Running 095mtest-deployment-8475c54c94-vkrk4 1/1Running 015m

【TCPSocketAction】

通过ping某个端口的方式,探测服务是否可以正常对外提供服务

#资源清单编写:[root@m01 /hzl]# cat livenessProbe.yaml ---kind: DeploymentapiVersion: apps/v1metadata:name: deploymentspec:replicas: 1selector:matchLabels:app: deploymenttemplate:metadata:labels:app: deploymentspec:containers:- name: nginximage: alvinos/django:v1livenessProbe:tcpSocket:port: 80---kind: ServiceapiVersion: v1metadata:name: test-svcnamespace: defaultspec:ports:- port: 80targetPort: 80name: httpselector:app: deployment#创建pod及svc[root@m01 /hzl]# kubectl delete -f livenessProbe.yaml deployment.apps "deployment" deletedservice "test-svc" deleted#查看探测状态:探测成功[root@m01 /hzl]# kubectl get podNAME READY STATUS RESTARTS AGEdeployment-569f4b99ff-tskhs 1/1Running 03m4snginx-6799fc88d8-6c892 1/1Running 015mtest-deployment-8475c54c94-nkqx6 1/1Running 04m57s#查看详情:[root@m01 /hzl]# kubectl describe pod test-deployment-569f4b99ff-mwxms Name: test-deployment-569f4b99ff-mwxmsNamespace: defaultPriority:0Node: nod02/192.168.15.57Start Time: Sat, 07 Aug 12:59:11 +0800Labels: app=deploymentpod-template-hash=569f4b99ffAnnotations: <none>Status: RunningIP: 10.244.2.48IPs:IP: 10.244.2.48Controlled By: ReplicaSet/test-deployment-569f4b99ffContainers:nginx:Container ID: docker://716695d00c0fb4538a4fd722233a25948b1d4bfdc62385dcc465f4f9f103a756Image:alvinos/django:v1Image ID: docker-pullable://alvinos/django@sha256:fc5ffecb7d5038940006d5d7e9ea6414fc4ec0f2509501aebdc3280f1a559723Port: <none>Host Port:<none>State:RunningStarted:Sat, 07 Aug 12:59:32 +0800Ready:TrueRestart Count: 0#使用socket探测,探测成功Liveness: tcp-socket :80 delay=0s timeout=1s period=10s #success=1 #failure=3################################## 测试 #################################################测试(更改端口测试)[root@m01 /hzl]# vim livenessProbe.yaml ........livenessProbe:tcpSocket:port: 8080.........#重新更新pod,svc[root@m01 /hzl]# kubectl apply -f livenessProbe.yaml deployment.apps/test-deployment createdservice/test-svc created#查看pod[root@m01 /hzl]# kubectl get podNAMEREADY STATUS RESTARTS AGEdeployment-569f4b99ff-smpkt 1/1Running 08m8snginx-6799fc88d8-6c892 1/1Running 026mtest-deployment-86788587f-jbnwm 1/1Running 34m11s #探测不成功,已经重启3次#查看详情[root@m01 /hzl]# kubectl describe pod test-deployment-86788587f-jbnwm Name: test-deployment-86788587f-jbnwmNamespace: defaultPriority:0Node: nod02/192.168.15.57Start Time: Sat, 07 Aug 13:01:56 +0800Labels: app=deploymentpod-template-hash=86788587fAnnotations: <none>Status: RunningIP: 10.244.2.49IPs:IP: 10.244.2.49Controlled By: ReplicaSet/test-deployment-86788587fContainers:nginx:Container ID: docker://9bd364e54903ae56906b1e311b6c3e6ef723566220bfd47aea1f6ad64d705c5dImage:alvinos/django:v1Image ID: docker-pullable://alvinos/django@sha256:fc5ffecb7d5038940006d5d7e9ea6414fc4ec0f2509501aebdc3280f1a559723Port: <none>Host Port:<none>State:WaitingReason: CrashLoopBackOffLast State:TerminatedReason: ErrorExit Code: 137Started:Sat, 07 Aug 13:07:16 +0800Finished:Sat, 07 Aug 13:08:16 +0800Ready:False#探测不成功,重启策略已经进行3次Restart Count: 3Liveness: tcp-socket :8080 delay=0s timeout=1s period=10s #success=1 #failure=3

【HTTPGetAction】

通过访问某个URL的方式探测当前POD是否可以正常对外提供服务

#编写资源清单:[root@m01 /hzl]# vim livenessProbe.yaml ...............livenessProbe:httpGet:port: 80path: / ..............#创建pod[root@m01 /hzl]# kubectl apply -f livenessProbe.yaml deployment.apps/test-deployment createdservice/test-svc created#查看pod[root@m01 /hzl]# kubectl get podNAME READY STATUS RESTARTS AGEdeployment-569f4b99ff-smpkt 1/1Running 021mnginx-6799fc88d8-6c892 1/1Running 040mtest-deployment-59f6d99fdf-6hxpf 1/1Running 028stest-deployment-59f6d99fdf-r5kjs 1/1Terminating 34m19s#查看详情:[root@m01 /hzl]# kubectl describe pod test-deployment-59f6d99fdf-6hxpf Name: test-deployment-59f6d99fdf-6hxpfNamespace: defaultPriority:0Node: nod02/192.168.15.57Start Time: Sat, 07 Aug 13:18:57 +0800Labels: app=deploymentpod-template-hash=59f6d99fdfAnnotations: <none>Status: RunningIP: 10.244.2.51IPs:IP: 10.244.2.51Controlled By: ReplicaSet/test-deployment-59f6d99fdfContainers:nginx:Container ID: docker://58a289dab5fb4d902da23352c1257874b8d9ce87cda3f7e0b00feffa514f0405Image:alvinos/django:v1Image ID: docker-pullable://alvinos/django@sha256:fc5ffecb7d5038940006d5d7e9ea6414fc4ec0f2509501aebdc3280f1a559723Port: <none>Host Port:<none>State:RunningStarted:Sat, 07 Aug 13:19:17 +0800Ready:True#使用httpget方式,探测不成功,触发重启策略,已经重启3次Restart Count: 3Liveness: http-get http://:80/ delay=0s timeout=1s period=10s #success=1 #failure=3

二、就绪型探针(ReadinessProbe)

用于判断容器是否正常提供服务,即容器的Ready是否为True,是否可以接收请求,如果ReadinessProbe探测失败,则容器的Ready将设置为False,控制器将此Pod的Endpoint从对应的service的Endpoint列表中移除,从此不再将任何请求调度此Pod上,直到下次探测成功。(剔除此pod,不参与接收请求不会将流量转发给此Pod)

1、就绪型检查用法

1、用于判断容器是否正常提供服务2、处理方式:下线负载均衡3、存活性检查和就绪性检查是否可以同时存在呢?可以

2、ReadinessProbe的使用(多种使用方式同上)

#资源清单编写:[root@m01 /hzl]# cat ReadinessProbe.yaml ---kind: DeploymentapiVersion: apps/v1metadata:name: test-deploymentspec:replicas: 1selector:matchLabels:app: deploymenttemplate:metadata:labels:app: deploymentspec:containers:- name: nginximage: alvinos/django:v1livenessProbe:exec:command:- "/bin/sh"- "-c"- "cat /root/test/manage.py"readinessProbe:tcpSocket:port: 80 ---kind: ServiceapiVersion: v1metadata:name: test-svcnamespace: defaultspec:ports:- port: 80targetPort: 80name: httpselector:app: deployment#创建pod[root@m01 /hzl]# kubectl apply -f ReadinessProbe.yaml deployment.apps/test-deployment configuredservice/test-svc unchanged#查看pod[root@m01 /hzl]# kubectl get podNAME READY STATUS RESTARTS AGEdeployment-569f4b99ff-smpkt 1/1Running 044mnginx-6799fc88d8-6c892 1/1Running 063mtest-deployment-677d5c5bd7-wz8sp 1/1Running 07m #创建成功#查看创建状态[root@m01 /hzl]# kubectl describe endpoints test-svc Name: test-svcNamespace: defaultLabels: <none>Annotations: <none>Subsets:Addresses:10.244.2.47,10.244.2.53 #表述创建成功的pod ipNotReadyAddresses: <none>#表示创建不成功的pod ipPorts: Name Port Protocol---- ---- --------http 80 TCPEvents: <none>###################################### 测试 ############################################编写资源清单:[root@m01 /hzl]# vim ReadinessProbe.yaml ..............readinessProbe:tcpSocket:port: 8090 #端口更改............#更新资源清单,创建pod[root@m01 /hzl]# kubectl apply -f ReadinessProbe.yaml deployment.apps/test-deployment configuredservice/test-svc unchanged#查看pod[root@m01 /hzl]# kubectl get podNAME READY STATUS RESTARTS AGEdeployment-569f4b99ff-smpkt 1/1Running 054mnginx-6799fc88d8-6c892 1/1Running 073mtest-deployment-677d5c5bd7-wz8sp 1/1Running 017m #之前的pod也不会删除下架test-deployment-85ddccb5dd-h8zfw 0/1Running 06m47s #新pod未就绪的一直存在#使用测试命令实时检测(由端口不存在一直未在就绪状态,旧的永远删除不了,新的永远是未就绪状态)[root@m01 /hzl]# while true; do kubectl describe endpoints test-svc ;sleep 1; clean; doneName: test-svcNamespace: defaultLabels: <none>Annotations: endpoints.kubernetes.io/last-change-trigger-time: -08-07T05:45:31ZSubsets:Addresses:10.244.2.47,10.244.2.53#就绪成功的ip podNotReadyAddresses: 10.244.2.54 #未就绪失败的Ip pod##################################### 测试 #############################更改资源配置清单(存在的端口)[root@m01 /hzl]# vim ReadinessProbe.yaml.........readinessProbe:tcpSocket:port: 80#端口更改为80............#创建pod[root@m01 /hzl]# kubectl get podNAME READY STATUS RESTARTS AGEdeployment-569f4b99ff-rfssh 1/1Running 070mnginx-6799fc88d8-dtg9b 1/1Running 071mtest-deployment-677d5c5bd7-rl7lt 1/1Running 044s#已经正常创建,pod全部通过就绪#查看端点[root@m01 /hzl]# kubectl describe endpoints test-svc Name: test-svcNamespace: defaultLabels: <none>Annotations: <none>Subsets:Addresses:10.244.2.63,10.244.2.73#全部正常通过就绪检查的pod ipNotReadyAddresses: <none> Ports:Name Port Protocol---- ---- --------http 80 TCP############################## 测试二 ######################################设定副本数进行更新[root@m01 /hzl]# kubectl scale deployment test-deployment --replicas=3deployment.apps/test-deployment scaled[root@m01 /hzl]# while true; do wget -q -O http://test-svc.default.svc.cluster.local/index; echo ;sleep 1; done #查看svc[root@m01 /hzl]# kubectl get svcNAME TYPE CLUSTER-IPEXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 25mtest-svcClusterIP 10.107.80.105 <none> 80/TCP 14m#使用网络工具查看别名(集群内部解析名称)[root@m01 /hzl]# kubectl run test --rm -it --image=busybox:1.28 If you don't see a command prompt, try pressing enter./ # nslookup test-svcServer: 10.96.0.10Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.localName:test-svcAddress 1: 10.107.80.105 test-svc.default.svc.cluster.local#测试使用(实时查看过程状态,发现有多个pod正在提供服务)/ # while true; do wget -q -O- http://test-svc.default.svc.cluster.local/index; echo ;sleep 1; done 主机名:test-deployment-677d5c5bd7-hvn99,版本:v1主机名:test-deployment-677d5c5bd7-m2wgq,版本:v1主机名:test-deployment-677d5c5bd7-hvn99,版本:v1主机名:test-deployment-677d5c5bd7-blkrj,版本:v1#查看pod的状态[root@m01 /hzl]# kubectl get podNAME READY STATUS RESTARTS AGEdeployment-569f4b99ff-z5g6z 1/1Running 045mnginx-6799fc88d8-5mckg 1/1Running 045mtest 1/1Running 015mtest-deployment-677d5c5bd7-bnzjl 0/1Running 03stest-deployment-677d5c5bd7-m2wgq 1/1Running 08m1stest-deployment-677d5c5bd7-rbvhr 0/1ContainerCreating 03stest-deployment-677d5c5bd7-sknx5 0/1ContainerCreating 03stest-deployment-677d5c5bd7-snvvj 0/1ContainerCreating 03s#全部更新部署完成(5个)[root@m01 /hzl]# kubectl get podNAME READY STATUS RESTARTS AGEdeployment-569f4b99ff-z5g6z 1/1Running 045mnginx-6799fc88d8-5mckg 1/1Running 045mtest 1/1Running 015mtest-deployment-677d5c5bd7-bnzjl 1/1Running 018stest-deployment-677d5c5bd7-m2wgq 1/1Running 08m16stest-deployment-677d5c5bd7-rbvhr 1/1Running 018stest-deployment-677d5c5bd7-sknx5 1/1Running 018stest-deployment-677d5c5bd7-snvvj 1/1Running 018s#查看端点ip的状态[root@m01 /hzl]# kubectl describe endpoints test-svc Name: test-svcNamespace: defaultLabels: <none>Annotations: endpoints.kubernetes.io/last-change-trigger-time: -08-07T18:24:43ZSubsets:Addresses:10.244.1.61,10.244.1.62,10.244.2.77,10.244.2.85,10.244.2.86,10.244.2.87 #表示布成功pod ipNotReadyAddresses: <none>#未准备好的pod ipPorts:Name Port Protocol---- ---- --------http 80 TCPEvents: <none>#重新设定更新副本数[root@m01 /hzl]# kubectl scale deployment test-deployment --replicas=1deployment.apps/test-deployment scaled#查看pod状态[root@m01 /hzl]# kubectl get pod #正在清除副本数NAME READY STATUS RESTARTS AGEdeployment-569f4b99ff-z5g6z 1/1Running 048mnginx-6799fc88d8-5mckg 1/1Running 048mtest 1/1Running 018mtest-deployment-677d5c5bd7-bnzjl 1/1Terminating 02m49stest-deployment-677d5c5bd7-m2wgq 1/1Running 010mtest-deployment-677d5c5bd7-rbvhr 1/1Terminating 02m49stest-deployment-677d5c5bd7-sknx5 1/1Terminating 02m49stest-deployment-677d5c5bd7-snvvj 1/1Terminating 02m49s[root@m01 /hzl]# kubectl get podNAME READY STATUS RESTARTS AGEdeployment-569f4b99ff-z5g6z 1/1Running 043mnginx-6799fc88d8-5mckg 1/1Running 043mtest 1/1Running 013mtest-deployment-677d5c5bd7-m2wgq 1/1Running 06m21s#副本数为1#测试检测(实时查看过程状态,发现已经从多个变为一个pod使用)[root@m01 /hzl]# kubectl run test --rm -it --image=busybox:1.28 If you don't see a command prompt, try pressing enter./ # while true; do wget -q -O- http://test-svc.default.svc.cluster.local/index; echo ;sleep 1; done 主机名:test-deployment-677d5c5bd7-m2wgq,版本:v1主机名:test-deployment-677d5c5bd7-m2wgq,版本:v1主机名:test-deployment-677d5c5bd7-m2wgq,版本:v1#重新设定更新副本数[root@m01 /hzl]# kubectl scale deployment test-deployment --replicas=1deployment.apps/test-deployment scaled

3、多版本多资源(存活性与就绪型)平滑更新,平滑下线

【基础参数】

1》failureThreshold: 最少连续几次探测失败的次数,满足该次数则认为fail2》initialDelaySeconds: 容器启动之后开始进行存活性探测的秒数。不填立即进行3》periodSeconds: 执行探测的频率(秒)。默认为10秒。最小值为1。4》successThreshold: 探测失败后,最少连续探测成功多少次才被认定为成功,满足该次数则认为success。(但是如果是liveness则必须是 1。最小值是 1。)5》timeoutSeconds:每次执行探测的超时时间,默认1秒,最小1秒

【多版本多资源更新的使用】

################################# 多版本 ###################################编写资源清单:[root@m01 /hzl]# cat ReadinessProbe.yaml ---kind: DeploymentapiVersion: apps/v1metadata:name: test-deploymentspec:replicas: 1selector:matchLabels:app: deploymenttemplate:metadata:labels:app: deploymentspec:containers:- name: nginximage: alvinos/django:v1livenessProbe:#存活性检查exec:command:- "/bin/sh"- "-c"- "cat /root/test/manage.py"initialDelaySeconds: 0periodSeconds: 3timeoutSeconds: 1successThreshold: 1failureThreshold: 3readinessProbe: #就绪性检查tcpSocket:port: 80initialDelaySeconds: 30periodSeconds: 1timeoutSeconds: 1successThreshold: 3failureThreshold: 1---kind: ServiceapiVersion: v1metadata:name: test-svcnamespace: defaultspec:ports:- port: 80targetPort: 80name: httpselector:app: deployment#创建更新pod[root@m01 /hzl]# kubectl apply -f ReadinessProbe.yaml deployment.apps/test-deployment configuredservice/test-svc unchanged#查看pod[root@m01 /hzl]# kubectl get podNAME READY STATUS RESTARTS AGEdeployment-569f4b99ff-z5g6z 1/1Running 057mnginx-6799fc88d8-5mckg 1/1Running 057mtest 1/1Running 027mtest-deployment-5d765fb67d-jccrk 1/1Running 02m44s#使用工具测试(当前只有一个pod使用)[root@m01 /hzl]# kubectl run test --rm -it --image=busybox:1.28 If you don't see a command prompt, try pressing enter./ # while true; do wget -q -O- http://test-svc.default.svc.cluster.local/index; echo ;sleep 1; done 主机名:test-deployment-677d5c5bd7-m2wgq,版本:v1主机名:test-deployment-677d5c5bd7-m2wgq,版本:v1主机名:test-deployment-677d5c5bd7-m2wgq,版本:v1#设定更新副本数[root@m01 /hzl]# kubectl scale deployment test-deployment --replicas=6deployment.apps/test-deployment scaled#查看pod(正在创建)[root@m01 /hzl]# kubectl get podNAME READY STATUS RESTARTS AGEdeployment-569f4b99ff-z5g6z 1/1Running 061mnginx-6799fc88d8-5mckg 1/1Running 061mtest 1/1Running 031mtest-deployment-5d765fb67d-bxkxk 0/1ContainerCreating 03stest-deployment-5d765fb67d-fm75k 0/1ContainerCreating 03stest-deployment-5d765fb67d-jccrk 1/1Running 06m49stest-deployment-5d765fb67d-ppwwp 0/1Running 03stest-deployment-5d765fb67d-q24kk 0/1Running 03stest-deployment-5d765fb67d-xx4b2 0/1ContainerCreating 03s#使用工具测试(创建新pod时,使用多个pod,滚动创建副本,也不影响集群外部的使用)[root@m01 /hzl]# kubectl run test --rm -it --image=busybox:1.28 If you don't see a command prompt, try pressing enter./ # while true; do wget -q -O- http://test-svc.default.svc.cluster.local/index; echo ;sleep 1; done 主机名:test-deployment-5d765fb67d-fm75k,版本:v1主机名:test-deployment-5d765fb67d-ppwwp,版本:v1主机名:test-deployment-5d765fb67d-ppwwp,版本:v1主机名:test-deployment-5d765fb67d-xx4b2,版本:v1主机名:test-deployment-5d765fb67d-bxkxk,版本:v1主机名:test-deployment-5d765fb67d-fm75k,版本:v1主机名:test-deployment-5d765fb67d-xx4b2,版本:v1主机名:test-deployment-5d765fb67d-ppwwp,版本:v1#################################### 滚动更新版本 ####################################配置资源清单(版本更新)[root@m01 /hzl]# cat ReadinessProbe.yaml ..............spec:containers:- name: nginximage: alvinos/django:v2#版本更新 v1-----> v2.............#创建pod[root@m01 /hzl]# kubectl apply -f ReadinessProbe.yaml deployment.apps/test-deployment configuredservice/test-svc unchanged#查看pod(更新新版本,旧版本不会立马删除,只有等新版本更新完毕,才会删除旧版本)[root@m01 /hzl]# kubectl get podNAME READY STATUS RESTARTS AGEdeployment-569f4b99ff-z5g6z 1/1Running 070mnginx-6799fc88d8-5mckg 1/1Running 070mtest 1/1Running 040mtest-deployment-5d765fb67d-jccrk 1/1Running 015mtest-deployment-d75444fb5-vndnx 0/1Running 026s #新版本的pod#使用工具实时检测(版本更新很平滑,负载均衡会帮你调度,丝毫不会影响集群外部的使用)[root@m01 /hzl]# kubectl run test --rm -it --image=busybox:1.28 If you don't see a command prompt, try pressing enter./ # while true; do wget -q -O- http://test-svc.default.svc.cluster.local/index; echo ;sleep 1; done 主机名:test-deployment-5d765fb67d-ppwwp,版本:v1主机名:test-deployment-5d765fb67d-ppwwp,版本:v1 #旧版本v1主机名:test-deployment-d75444fb5-vndnx,版本:v2#新版本v2主机名:test-deployment-d75444fb5-vndnx,版本:v2主机名:test-deployment-d75444fb5-vndnx,版本:v2#更新完毕(旧pod已经删除)[root@m01 /hzl]# kubectl get podNAMEREADY STATUS RESTARTS AGEdeployment-569f4b99ff-z5g6z 1/1Running 072mnginx-6799fc88d8-5mckg 1/1Running 072mtest1/1Running 042mtest-deployment-d75444fb5-vndnx 1/1Running 02m21s################################### 多资源测试 ###############################设定副本数[root@m01 /hzl]# kubectl scale deployment test-deployment --replicas=6deployment.apps/test-deployment scaled#更新pod(正在创建新pod)[root@m01 /hzl]# kubectl get podNAMEREADY STATUS RESTARTS AGEdeployment-569f4b99ff-z5g6z 1/1Running 082mnginx-6799fc88d8-5mckg 1/1Running 082mtest1/1Running 052mtest-deployment-d75444fb5-f5jp8 0/1Running 04stest-deployment-d75444fb5-fk74b 0/1Running 04stest-deployment-d75444fb5-jbc8n 0/1ContainerCreating 04stest-deployment-d75444fb5-lc62q 0/1ContainerCreating 04stest-deployment-d75444fb5-rqfrl 0/1Running 04stest-deployment-d75444fb5-vndnx 1/1Running 012m#使用工具测试(创建多个pod,滚动创建副本,也不影响集群外部的使用)集群平滑更新[root@m01 /hzl]# kubectl run test --rm -it --image=busybox:1.28 If you don't see a command prompt, try pressing enter./ # while true; do wget -q -O- http://test-svc.default.svc.cluster.local/index; echo ;sleep 1; done 主机名:test-deployment-d75444fb5-jbc8n,版本:v2主机名:test-deployment-d75444fb5-lc62q,版本:v2主机名:test-deployment-d75444fb5-vndnx,版本:v2主机名:test-deployment-d75444fb5-lc62q,版本:v2主机名:test-deployment-d75444fb5-vndnx,版本:v2主机名:test-deployment-d75444fb5-f5jp8,版本:v2主机名:test-deployment-d75444fb5-jbc8n,版本:v2主机名:test-deployment-d75444fb5-fk74b,版本:v2主机名:test-deployment-d75444fb5-f5jp8,版本:v2主机名:test-deployment-d75444fb5-lc62q,版本:v2#查看pod(全部创建完毕)[root@m01 /hzl]# kubectl get podNAMEREADY STATUS RESTARTS AGEdeployment-569f4b99ff-z5g6z 1/1Running 085mnginx-6799fc88d8-5mckg 1/1Running 085mtest1/1Running 055mtest-deployment-d75444fb5-f5jp8 1/1Running 02m53stest-deployment-d75444fb5-fk74b 1/1Running 02m53stest-deployment-d75444fb5-jbc8n 1/1Running 02m53stest-deployment-d75444fb5-lc62q 1/1Running 02m53stest-deployment-d75444fb5-rqfrl 1/1Running 02m53stest-deployment-d75444fb5-vndnx 1/1Running 014m#重新设定副本数(下线副本pod)[root@m01 /hzl]# kubectl scale deployment test-deployment --replicas=1deployment.apps/test-deployment scaled#查看pod(整在下线5个pod)[root@m01 /hzl]# kubectl get podNAMEREADY STATUS RESTARTS AGEdeployment-569f4b99ff-z5g6z 1/1Running 086mnginx-6799fc88d8-5mckg 1/1Running 086mtest1/1Running 056mtest-deployment-d75444fb5-f5jp8 1/1Terminating 04m30stest-deployment-d75444fb5-fk74b 1/1Terminating 04m30stest-deployment-d75444fb5-jbc8n 1/1Running 04m30stest-deployment-d75444fb5-lc62q 1/1Terminating 04m30stest-deployment-d75444fb5-rqfrl 1/1Terminating 04m30stest-deployment-d75444fb5-vndnx 1/1Terminating 016m#查看工具测试(已经从多副本下线至一个,集群外部状态也不影响)[root@m01 /hzl]# kubectl run test --rm -it --image=busybox:1.28 If you don't see a command prompt, try pressing enter./ # while true; do wget -q -O- http://test-svc.default.svc.cluster.local/index; echo ;sleep 1; done 主机名:test-deployment-d75444fb5-lc62q,版本:v2#下线pod主机名:test-deployment-d75444fb5-jbc8n,版本:v2#下线最后的一个pod主机名:test-deployment-d75444fb5-jbc8n,版本:v2主机名:test-deployment-d75444fb5-jbc8n,版本:v2主机名:test-deployment-d75444fb5-jbc8n,版本:v2#查看pod状态[root@m01 /hzl]# kubectl get podNAMEREADY STATUS RESTARTS AGEdeployment-569f4b99ff-z5g6z 1/1Running 090mnginx-6799fc88d8-5mckg 1/1Running 090mtest1/1Running 060mtest-deployment-d75444fb5-jbc8n 1/1Running 08m4s #下线最后的一个pod

三、回调Hook

Pod是Kubernetes集群中的最小单元,而 Pod 是由容器组成的,首先了解容器的生命周期

1、回调hook概述:

实际上 Kubernetes 为容器提供了生命周期钩子的,就是我们说的Pod Hook,Pod Hook 是由 kubelet 发起的,当容器中的进程启动前或者容器中的进程终止之前运行,这是包含在容器的生命周期之中。我们可以同时为 Pod 中的所有容器都配置 hook

2、回调hook常用的两种钩子函数

1》PostStart:启动回调hook

2》PreStop: 结束回调hook

1》# PostStart: 这个钩子在容器创建后立即执行。但是,并不能保证钩子将在容器ENTRYPOINT之前运行,因为没有参数传递给处理程序。主要用于资源部署、环境准备等。不过需要注意的是如果钩子花费太长时间以至于不能运行或者挂起, 容器将不能达到running状态。2》#PreStop: 这个钩子在容器终止之前立即被调用。它是阻塞的,意味着它是同步的, 所以它必须在删除容器的调用发出之前完成。 主要用于优雅关闭应用程序、通知其他系统等。如果钩子在执行期间挂起, Pod阶段将停留在running状态并且永不会达到failed状态ps :如果PostStart或者PreStop钩子失败, 它会杀死容器。所以我们应该让钩子函数尽可能的轻量。当然有些情况下,长时间运行命令是合理的, 比如在停止容器之前预先保存状态

3、回调hook的使用方式

Exec :用于执行一段特定的命令,不过要注意的是该命令消耗的资源会被计入容器

HTTP : 对容器上的特定的端点执行HTTP请求

【官网回调hook】

#查看容器的生命周期参数hook[root@m01 /hzl]# kubectl explain deployment.spec.template.spec.containers.lifecycle

4、回调hook的基本用法

1》在pod启动之后立即执行或者Pod终止之前立即执行2》使用关键字lifecycle3》回调钩子也可以执行:exec、HttpGet、tcpSocket

4、回调hook的使用

【PostStart】

#编写配置清单:(启动回调hook与结束回调hook配置清单)[root@m01 /hzl]# cat hook.yaml ---kind: DeploymentapiVersion: apps/v1metadata:name: test-deploymentspec:replicas: 1selector:matchLabels:app: deploymenttemplate:metadata:labels:app: deploymentspec:containers:- name: nginximage: alvinos/django:v1lifecycle:postStart:exec:command:- "/bin/sh"- "-c"- "touch /root/1.txt"preStop:exec:command:- "/bin/sh"- "-c"- "echo 'hzl888' > /root/1.txt"livenessProbe:exec:command:- "/bin/sh"- "-c"- "cat /root/test/manage.py"initialDelaySeconds: 0periodSeconds: 3timeoutSeconds: 1successThreshold: 1failureThreshold: 3readinessProbe:tcpSocket:port: 80initialDelaySeconds: 30periodSeconds: 1timeoutSeconds: 1successThreshold: 3failureThreshold: 1 ---kind: ServiceapiVersion: v1metadata:name: test-svcnamespace: defaultspec:ports:- port: 80targetPort: 80name: httpselector:app: deployment#创建pod[root@m01 /hzl]# kubectl apply -f hook.yaml deployment.apps/test-deployment configuredservice/test-svc unchanged################################### 测试状态 ########################################查看pod[root@m01 /hzl]# kubectl get podsNAME READY STATUS RESTARTS AGEdeployment-569f4b99ff-z5g6z 1/1Running 0147mnginx-6799fc88d8-5mckg 1/1Running 0147mtest 1/1Running 0117mtest-deployment-677d5c5bd7-fqd7z 1/1Terminating 018mtest-deployment-9db95f48d-5jthp 1/1Running 041s #回调hook已启用#进入容器内查看(回调hook是否启用)[root@m01 /hzl]# kubectl exec -it test-deployment-9db95f48d-5jthp -- bash[root@test-deployment-9db95f48d-5jthp test]# cd /root/[root@test-deployment-9db95f48d-5jthp ~]# ls1.txt anaconda-ks.cfg test #1.txt文件已创建(启动回调hook触发启用)

【PostStop】

#配置清单编写:(同上)[root@m01 /hzl]# cat hook.yaml ............spec:containers:- name: nginximage: alvinos/django:v1lifecycle:postStart:#启动回调hookexec:command:- "/bin/sh"- "-c"- "touch /root/1.txt"preStop: #容器结束回调hookexec:command:- "/bin/sh"- "-c"- "echo 'hzl888' > /root/1.txt"livenessProbe:·········#创建pod#创建pod[root@m01 /hzl]# kubectl apply -f hook.yaml deployment.apps/test-deployment configuredservice/test-svc unchanged#查看pod[root@m01 /hzl]# kubectl get podsNAMEREADY STATUS RESTARTS AGEdeployment-569f4b99ff-z5g6z 1/1Running 0163mnginx-6799fc88d8-5mckg 1/1Running 0163mtest-deployment-9db95f48d-pwvvl 1/1Running 047s #正常启动pod############################ 测试状态 #######################################1》#使用工具测试停止回调hook[root@m01 /hzl]# kubectl exec -it test-deployment-9db95f48d-pwvvl -- bash[root@test-deployment-9db95f48d-pwvvl /]# cd /root/[root@test-deployment-9db95f48d-pwvvl ~]# ls1.txt anaconda-ks.cfg test [root@test-deployment-9db95f48d-pwvvl ~]# while true; do cat 1.txt; sleep 1; clear; done #测试容器停止回调hook...........2》#结束容器(触发回调hook)[root@m01 /hzl]# kubectl delete -f hook.yaml deployment.apps "test-deployment" deletedservice "test-svc" deleted3》#查看pod(容器正在删除,触发回调hook)[root@m01 /hzl]# kubectl get podsNAMEREADY STATUS RESTARTS AGEdeployment-569f4b99ff-z5g6z 1/1Running 0169mnginx-6799fc88d8-5mckg 1/1Running 0169mtest-deployment-9db95f48d-pwvvl 1/1Terminating 06m57s4》#查看触发状态(检查上面测试状态)[root@test-deployment-9db95f48d-pwvvl ~]# while true; do cat 1.txt; sleep 1; clear; done #测试容器停止回调hookhzl888hzl888hzl888.......5》#查看pod(容器生命周期)[root@m01 /hzl]# kubectl get podsNAMEREADY STATUS RESTARTS AGEdeployment-569f4b99ff-z5g6z 1/1Running 0175mnginx-6799fc88d8-5mckg 1/1Running 0175mps : test-deployment.......已不存在,容器生命结束5》#回调hook的触发结果(检查上面测试状态)..............hzl888hzl888command terminated with exit code 137[root@m01 /hzl]##容器生命周期结束,回调hook触发完成结束

如果觉得《@kubernetes(k8s)pod服务探针(健康检查)及回调钩子HOOK详解》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。