Kubernetes探针

官方Kubernetes探针

Kubernetes 对于Pod 的健康状态可以通过二类探针来检查:livenessProbe 与 readinessProbe,kubernetes定期执行这两类探针来诊断容器的健康状况。

livenessProbe: livenessProbe探针探测到容器不健康,则kubelet将杀掉该容器,并根据容器的重启策略做相应的处理。(决定是否重启容器)

readinessProbe: 用于判断容器服务是否可用(Ready状态),达到Ready状态的Pod才可以接收请求。(决定是否将请求转发给容器)

startupProbe: 启动探测成功一次,活动探测将接管以对容器死锁提供快速响应(探测成功后再交给livenessProbe)。如果启动探针从未成功,则容器将在failureThreshold * periodSeconds后被杀死并受到容器的约束restartPolicy(重启策略) 1.16版本支持

探针名称注释说明
initialDelaySeconds启动容器后,启动活动或就绪探针之前的秒数。默认为0秒。最小值为0。
periodSeconds执行探测的频率(以秒为单位)。默认为10秒。最小值为1。
timeoutSeconds探测超时的秒数。默认为1秒。最小值为1。
successThreshold连续失败的最小成功次数,失败后将被视为成功。默认值为1。为保持活力,必须为1。最小值为1。
failureThreshold如果探测失败,Kubernetes将尝试尝试failureThreshold放弃。放弃活动探针意味着重新启动容器。如果准备就绪,则将Pod标记为“未就绪”。默认值为3。最小值为1
HTTP探针名称注释说明
host要连接的主机名,默认为Pod IP。您可能想在httpHeaders中设置“主机”。
scheme用于连接到主机(HTTP或HTTPS)的方案。默认为HTTP。
pathHTTP服务器上的访问路径
httpHeaders要在请求中设置的自定义标头。HTTP允许重复的标头
port要在容器上访问的端口的名称或端口号。编号必须在1到65535之间

一、 命令方式

1、书写命令资源清单

vim liveness.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-exec
spec:
  containers:
  - name: liveness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 30
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5   #启动容器后,启动活动或就绪探针之前的秒数。默认为0秒。最小值为0
      periodSeconds: 5         #执行探测的频率(以秒为单位)。默认为10秒。最小值为1。

2、生成资源清单

kubectl   apply -f  liveness.yaml

3、查看livenessProbe资源效果

kubectl  describe  pod liveness-exec

在这里插入图片描述

kubectl  get  po -w

在这里插入图片描述

二、活动HTTP请求方式

1、书写HTTP请求资源清单

vim  httpGet-liveness.yaml
apiVersion: apps/v1      #api版本
kind: Deployment         #控制器
metadata:
  labels:
    app: nginx
  name: nginx           #Pod名称
spec:
  replicas: 3           #启动副本数
  selector:             #设置标签
    matchLabels:
      app: nginx        #必须匹配.spec.template.metadata标签相同,查看标签(kubectl  get  pods  --show-labels)
  minReadySeconds: 5            #等待设置的时间后才进行升级,(如果没有设置该值,在某些极端情况下可能会造成服务不正常运行)
  revisionHistoryLimit: 3       #要保留以允许回滚的旧复制集数
  strategy:                     #策略
    type: RollingUpdate         #默认为滚动更新
    rollingUpdate:              #滚动更新
      maxSurge: 1               #滚动升级时会先启动1个pod
      maxUnavailable: 1         #升级过程中最多有多少个POD处于无法提供服务的状态(该不为0)
  template:                     #模板(相当于定义好的一个python中的模块)
    metadata:
      labels:
        app: nginx              #必须匹配match .spec.selector.matchLabels标签相同。
    spec:
      terminationGracePeriodSeconds: 60  #k8s将会给应用发送SIGTERM信号,可以用来正确、优雅地关闭应用,默认为30秒
      containers:               #模板(容器模板)
      - image: nginx            #镜像名字
        name: nginx             #node节点启动的容器名字,容器名称(docker ps)查看格式k8s_容器名称_Pod名称
        env:
        - name: POD_NAME                #容器的环境变量名称
          valueFrom:
            fieldRef:
              fieldPath: metadata.name  #Pod名称
        imagePullPolicy: IfNotPresent   #拉取镜像(选择方式——直接使用本地拥有的镜像)
        livenessProbe:                  #判断容器是否存活(Running状态),如果livenessProbe探针检测到不正常/不健康,则将此容器删除,并且根据容器的策略进行抉择(决定是否重启容器)
          httpGet:
            path:  /                    #HTTP服务器上的访问路径
            port:  80                   #容器上要访问的端口的名称/端口号
            scheme:                     #请求方式http/https。默认为HTTP。
          initialDelaySeconds: 70       #容器启动后要等待多少秒后存活和就绪探测器才被初始化,默认是 0 秒(建议时间设置大于1分钟有些程序运行较慢不适合立马进行探针)
          periodSeconds: 5              #每多少秒执行一次活动性探测, 执行探测的频率(以秒为单位)。默认为10秒。
          timeoutSeconds: 3             #探测的超时后等待多少秒。默认值是 1 秒。最小值是 1
          failureThreshold: 3           #当探测失败时,Kubernetes 的重试次数。默认值是 3。最小值是 1。
        readinessProbe:                 #发送就绪探测,判断容器服务是否可用状态(Ready)状态,达到Ready状态的Pod才可以接收请求,反之ep隔离不可服务的Pod(决定是否将请求转发给容器)
          httpGet:
            path:  /                    #HTTP服务器上的访问路径
            port:  80                   #容器上要访问的端口的名称/端口号
            scheme:                     #请求方式http/https。默认为HTTP。
          initialDelaySeconds: 60       #容器启动后要等待多少秒后存活和就绪探测器才被初始化,默认是 0 秒(建议时间设置大于1分钟有些程序运行较慢不适合立马进行探针)
          periodSeconds: 5              #每多少秒执行一次活动性探测, 执行探测的频率(以秒为单位)。默认为10秒。
          timeoutSeconds: 3             #探测的超时后等待多少秒。默认值是 1 秒。最小值是 1
          failureThreshold: 3           #当探测失败时,Kubernetes 的重试次数。默认值是 3。最小值是 1。
        startupProbe:                   #startupProbe探测成功后再交给livenessProbe探针
          exec:
            command: ['bash','/etc/scrip/dingding.sh','liveness探针测试实验','127.0.0.1:80','cf9097584cce8031df74d29f45eeae01c6712da0c4f842faf303c24a3000d118','容器未启动状态','3']
          initialDelaySeconds: 10       #容器启动后要等待多少秒后存活和就绪探测器才被初始化,默认是 0 秒(建议时间设置大于1分钟有些程序运行较慢不适合立马进行探针)
          periodSeconds: 20              #每多少秒执行一次活动性探测, 执行探测的时间间隔(单位是秒)。默认是 10 秒。最小值是 1。
          timeoutSeconds: 1             #探测的超时后等待多少秒。默认值是 1 秒。最小值是 1
          failureThreshold: 5           #当探测失败时,Kubernetes 的重试次数。默认值是 3。最小值是 1。
        resources:                      #资源
          limits:                       #限制
            memory: "500M"
            cpu: "0.2"                  #0.1代表200m
          requests:                     #请求
            memory: "250M"
            cpu: "0.1"                  #0.1代表100m
      restartPolicy: Always             #重新启动pod中所有容器的策略
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx          #svc的标签名称
  name: nginx           #svc名称
spec:
  ports:
  - name: nginx         #服务中此端口的名称。这必须是DNS标签全部ServiceSpec中的端口必须具有唯一的名称
    # 默认情况下,为了方便起见,`targetPort` 被设置为与 `port` 字段相同的值。
    port: 80                    #Port 的请求端口
    protocol: TCP               #TCP协议
    targetPort: 80              #请求代理到使用TCP端口80,并且具有标签"app=nginx" 的Pod上,默认情况下,targetPort 将被设置为与 port 字段相同的值。
    nodePort: 30080             #宿主机暴露的服务端口,默认情况下随机分配一个端口号(默认:30000-32767)
  selector:
    app: nginx              #具有标签"app=nginx" 的Pod加入到该svc中
  type: NodePort                #对外集群的外部访问
---
apiVersion: autoscaling/v2beta1  #autoscaling/v2beta1 的api
kind: HorizontalPodAutoscaler   #kind控制器
metadata:
  name: nginx               #HPA的名字
spec:
  scaleTargetRef:
    apiVersion: apps/v1         #api版本
    kind: Deployment            #Deployment控制器
    name: nginx             #Deployment控制器名字
  minReplicas: 3                #最小的副本数
  maxReplicas: 7                #最大的副本数
  metrics:
  - type: Resource
    resource:
      name: cpu                 #cpu名称
      targetAverageUtilization: 70 #资源指标
      name: memory
      targetAverageUtilization: 70

2、生成资源清单

kubectl  apply -f httpGet-liveness.yaml

3、查看livenessProbe资源效果

kubectl  get  pod -w

在这里插入图片描述

watch  kubectl  get   svc,ep

在这里插入图片描述

4、更新镜像版本

kubectl set image deployment  nginx  nginx=nginx:1.16.1 --record=true

5、再次查看livenessProbe资源效果

在这里插入图片描述
在这里插入图片描述

三、就绪探针

1、书写就绪探针资源清单

vim  exec-liveness.yaml
apiVersion: apps/v1      #api版本
kind: Deployment         #控制器
metadata:
  labels:
    app: liveness
  name: liveness                #Pod名称
spec:
  replicas: 3           #启动副本数
  selector:             #设置标签
    matchLabels:
      app: liveness     #必须匹配.spec.template.metadata标签相同,查看标签(kubectl  get  pods  --show-labels)
  minReadySeconds: 5            #等待设置的时间后才进行升级,(如果没有设置该值,在某些极端情况下可能会造成服务不正常运行)
  revisionHistoryLimit: 3       #要保留以允许回滚的旧复制集数
  strategy:                     #策略
    type: RollingUpdate         #默认为滚动更新
    rollingUpdate:              #滚动更新
      maxSurge: 1               #滚动升级时会先启动1个pod
      maxUnavailable: 1         #升级过程中最多有多少个POD处于无法提供服务的状态(该不为0)
  template:                     #模板(相当于定义好的一个python中的模块)
    metadata:
      labels:
        app: liveness           #必须匹配match .spec.selector.matchLabels标签相同。
    spec:
      terminationGracePeriodSeconds: 60  #k8s将会给应用发送SIGTERM信号,可以用来正确、优雅地关闭应用,默认为30秒
      containers:               #模板(容器模板)
      - image: nginx            #镜像名字
        name: liveness          #node节点启动的容器名字,容器名称(docker ps)查看格式k8s_容器名称_Pod名称
        env:
        - name: POD_NAME                 #容器的环境变量名称
          valueFrom:
            fieldRef:
              fieldPath: metadata.name   #Pod名称
        imagePullPolicy: IfNotPresent    #拉取镜像(选择方式——直接使用本地拥有的镜像)
        livenessProbe:                   #判断容器是否存活(Running状态),如果livenessProbe探针检测到不正常/不健康,则将此容器删除,并且根据容器的策略进行抉择(决定是否重启容器)
          exec:
            command: ['bash','/etc/scrip/dingding.sh','探针测试实验','127.0.0.1:80','cf9097584cce8031df74d29f45eeae01c6712da0c4f842faf303c24a3000d118','livenessProbe容器未Running状态','3']
          initialDelaySeconds: 70       #容器启动后要等待多少秒后存活和就绪探测器才被初始化,默认是 0 秒(建议时间设置大于1分钟有些程序运行较慢不适合立马进行探针)
          periodSeconds: 5              #每多少秒执行一次活动性探测, 执行探测的时间间隔(单位是秒)。默认是 10 秒。最小值是 1。
          timeoutSeconds: 3             #探测的超时后等待多少秒。默认值是 1 秒。最小值是 1
          failureThreshold: 3           #当探测失败时,Kubernetes 的重试次数。默认值是 3。最小值是 1。
        readinessProbe:                 #发送就绪探测,判断容器服务是否可用状态(Ready)状态,达到Ready状态的Pod才可以接收请求,反之ep隔离不可服务的Pod(决定是否将请求转发给容器)
          exec:
            command: ['bash','/etc/scrip/dingding.sh','探针测试实验','127.0.0.1:80','cf9097584cce8031df74d29f45eeae01c6712da0c4f842faf303c24a3000d118','readinessProbe容器未Ready状态','3']
          initialDelaySeconds: 60       #容器启动后要等待多少秒后存活和就绪探测器才被初始化,默认是 0 秒(建议时间设置大于1分钟有些程序运行较慢不适合立马进行探针)
          periodSeconds: 5              #每多少秒执行一次活动性探测, 执行探测的时间间隔(单位是秒)。默认是 10 秒。最小值是 1。
          timeoutSeconds: 3             #探测的超时后等待多少秒。默认值是 1 秒。最小值是 1
          failureThreshold: 3           #当探测失败时,Kubernetes 的重试次数。默认值是 3。最小值是 1。
        startupProbe:                   #startupProbe探测成功后再交给livenessProbe探针
          exec:
            command: ['bash','/etc/scrip/dingding.sh','liveness探针测试实验','127.0.0.1:80','cf9097584cce8031df74d29f45eeae01c6712da0c4f842faf303c24a3000d118','容器未启动状态','3']
          initialDelaySeconds: 10       #容器启动后要等待多少秒后存活和就绪探测器才被初始化,默认是 0 秒(建议时间设置大于1分钟有些程序运行较慢不适合立马进行探针)
          periodSeconds: 50             #每多少秒执行一次活动性探测, 执行探测的时间间隔(单位是秒)。默认是 10 秒。最小值是 1。
          timeoutSeconds: 1             #探测的超时后等待多少秒。默认值是 1 秒。最小值是 1
          failureThreshold: 2           #当探测失败时,Kubernetes 的重试次数。默认值是 3。最小值是 1。
        resources:                      #资源
          limits:                       #限制
            memory: "500M"
            cpu: "0.2"                  #0.1代表200m
          requests:                     #请求
            memory: "250M"
            cpu: "0.1"                  #0.1代表100m
        volumeMounts:
        - name: dingding-config
          mountPath: /etc/scrip
      volumes:
      - name: dingding-config
        configMap:
          name: dingding-config
      restartPolicy: Always             #重新启动pod中所有容器的策略
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: liveness               #svc的标签名称
  name: liveness                #svc名称
spec:
  ports:
  - name: liveness              #服务中此端口的名称。这必须是DNS标签全部ServiceSpec中的端口必须具有唯一的名称
    # 默认情况下,为了方便起见,`targetPort` 被设置为与 `port` 字段相同的值。
    port: 80                    #Port 的请求端口
    protocol: TCP               #TCP协议
    targetPort: 80              #请求代理到使用TCP端口80,并且具有标签"app=liveness" 的Pod上,默认情况下,targetPort 将被设置为与 port 字段相同的值。
    nodePort: 30080             #宿主机暴露的服务端口,默认情况下随机分配一个端口号(默认:30000-32767)
  selector:
    app: liveness              #具有标签"app=liveness" 的Pod加入到该svc中
  type: NodePort                #对外集群的外部访问
---
apiVersion: autoscaling/v2beta1  #autoscaling/v2beta1 的api
kind: HorizontalPodAutoscaler   #kind控制器
metadata:
  name: liveness               #HPA的名字
spec:
  scaleTargetRef:
    apiVersion: apps/v1         #api版本
    kind: Deployment            #Deployment控制器
    name: liveness             #Deployment控制器名字
  minReplicas: 3                #最小的副本数
  maxReplicas: 7                #最大的副本数
  metrics:
  - type: Resource
    resource:
      name: cpu                 #cpu名称
      targetAverageUtilization: 70 #资源指标
      name: memory
      targetAverageUtilization: 70

2、生成资源清单

kubectl  apply -f exec-liveness.yaml

3、书写ConfigMap资源清单并且生成资源清单

vim  configdingding.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: dingding-config
data:
  dingding.sh: |
    #!/bin/bash
    pod_name=$1
    healthcheck_url=$2
    status_code=`curl http://${healthcheck_url} -o /dev/null -w '%{http_code}\n' -s`
    dingding_token=$3
    check_type=$4
    failure_time=3
    message="报警康检查异常:$pod_name
                 \n检查类型:$check_type
                 \n检查时间:$(date +%F_%T |awk -F  "_" '{print $1,$2}')
                 \n检查地址:$healthcheck_url
                 \n状态码:  $status_code
                 \n错误次数:$failure_time
                 \nPod名称: $POD_NAME
    "

    json="{
        \"actionCard\": {
                \"title\": \"健康检查异常\",
                \"text\": \"$message\",
                \"hideAvatar\": \"0\",
                \"btnOrientation\": \"0\",
                \"btns\": [{\"title\": \"容器服务异常\",\"actionURL\": \"http://$healthcheck_url\"}]},
        \"msgtype\": \"actionCard\"}"
    if [ "$status_code" == "200" ];then
        echo "健康检查OK"
    else
        curl 'https://oapi.dingtalk.com/robot/send?access_token='$dingding_token \
        -H 'Content-Type: application/json' \
        -d "$json"
    fi
kubectl  apply -f configdingding.yaml

在这里插入图片描述

4、查看就绪探针资源效果

kubectl  get  pod -w

在这里插入图片描述

5、测试就绪探针效果

  • 现在现在更新文件
kubectl  edit deployments.apps  liveness

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值