第八章:Kubernetes零宕机发布之探针

90 阅读5分钟

注明:当前文档内容来源于51cto课堂‘宽哥’杜宽学习课程。

一、Pod的三种探针

种类说明
startupProbeKubernetes1.16新加的探测方式,用于判断容器内的应用程序是否已经启动。如果配置了startupProde,就会先禁用其他探测,直到他成功为止。如果探测失败,kubelet会杀死容器,之后根据重启策略进行处理,如果探测成功,或没有配置startupProde,则状态为成功,之后就不再探测。
livenessProbe用于探测容器是否在运行,如果探测失败,kubelet会‘杀死’容器并根据重启策略进行相应的处理。如果未指定该探针,将默认为Success。
readlinessProde一般用于探测容器内的程序是否健康,即判断容器是否为就绪(ready)状态。如果是,则可以处理请求,反之Endpoints Controller将从所有的Service的Endpoints中删除容器所在的Pod的IP地址。如果未指定,将默认为Success

二、探针的实现方式

实现方式说明
ExecAction在容器内执行一个指定的命令,如果命令返回值为0,则认为容器健康
TCPSockerAction通过TCP链接检查容器指定的端口,如果端口开放,则认为容器健康
HTTPGetAction对指定的URL进行GET请求,如果状态码在200~400 之间,则认为容器健康

三、livenessProbe 和readinessProbe

1.创建一个没有探针的Pod:

apiVersion: v1 #必选,api的版本号
kind: Pod # 必选,类型Pod
metadata:  # 必选,元数据
  name: nginx # 必选符合RFC 1035规范的名称
spec: # 必选用于定义Pod的详细信息
  containers: # 必选,容器列表
  - name: nginx # 必选符合RFC 1035规范的名称
    image: nginx:1.15.12  # 必选容器所用的镜像
    imagePullPolicy: IfNotPresent  # 镜像拉取策略
    command: # 可选容器启动执行命令
    - sh
    - -c
    - sleep 10; nginx -g "daemon off;"
    ports: #可选,容器需要暴露的端口号列表
    - containerPort: 80
  restartPolicy: Never # 重启策略

例:如果没有健康检查使用上述pod来创建一个nginx 执行kubelet create 之后pod状态正常情况就会变为running但是由于command 执行了sleep 10 即10秒后再启动nginx 那么此时就会导致当前副本是不能接收流量的状态那么就会导致有宕机的时间。

2.配置健康检查

apiVersion: v1 # 必选,api的版本号
kind: pod #必选,类型pod
metadata:  # 必选,元数据
  name: nginx # 必选,符合RFC1035 规范的 Pod 名称
spec:   # 必选,用于定义pod的详细信息
  containers:  # 必选,容器列表
  - name: nginx  # 必选,符合RFC1035 规范的 容器 名称
    image: nginx:1.15.12  # 必选,容器所使用的镜像地址
    imagePullPolicy: IfNotpresent   # 镜像拉取策略
    command:   # 可选,容器启动执行命令
    - sh
    - -c
    - sleep 10; nginx -g "daemon off;"
    readinessProbe:  # 可选,健康检查。注意三种检查方式同时只能使用一种
      httpGet:  # 接口检测方式
        path: /index.html  # 检查路径
        port: 80
        scheme: HTTP # http or https
        # httpHeaders:  # 可选,检查的请求头
        # - name: end-user
        # value: Jason
      initialDelaySeconds: 10 # 初始化时间,健康检查延迟执行时间
      timeoutSeconds: 2 # 超时时间
      periodSeconds: 5 # 检测间隔
      successThreshold: 1 # 检查成功为2次表示就绪
      failureThreshold: 2 # 检测失败为1次表示为就绪
    livenessProbe: # 可选健康检查
      tcpSocket: # 端口检测方式
        port: 80
      initialDelaySeconds: 10 # 初始化时间
      timeoutSeconds: 2  # 超时时间
      periodSeconds: 5   # 检测间隔
      successThreshold: 1 # 检查成功为1次表示就绪
      failureThreshold: 2 # 检测失败2次表示未就绪
    ports:  # 可选,容器需要暴露的端口列表
    - containerPort: 80 #端口号
  restartPolicy: Never # 重启策略

3.livenessProbe 和readinessProbe 区别

readinessProbe: 检测失败会切断流量

livenessProbe: 检测失败会重启pod

4.配置StartupProbe

Kubernetes 版本大于1.16,服务启动时间大于约30秒时间可以采用StartupProbe 探测方式,通过设置失败次数与检测间隔时长,来先保证程序启动,此探测方式实在启动时适用。
apiVersion: v1 # 必选,api的版本号
kind: pod #必选,类型pod
metadata:  # 必选,元数据
  name: nginx # 必选,符合RFC1035 规范的 Pod 名称
spec:   # 必选,用于定义pod的详细信息
  containers:  # 必选,容器列表
  - name: nginx  # 必选,符合RFC1035 规范的 容器 名称
    image: nginx:1.15.12  # 必选,容器所使用的镜像地址
    imagePullPolicy: IfNotpresent   # 镜像拉取策略
    command:   # 可选,容器启动执行命令
    - sh
    - -c
    - sleep 10; nginx -g "daemon off;"
    startupProbe:
      tcpSocket:  # 端口检测方式
        port: 80
      initialDelaySeconds: 10  # 初始化时间
      timeoutSeconds: 2 # 超时时间
      periodSeconds: 5  # 检测间隔
      successThreshold: 1 # 检查成功为1次表示就绪
      failureThreshold: 5 # 检测失败5次表示未就绪
    readinessProbe:  # 可选,健康检查。注意三种检查方式同时只能使用一种
      httpGet:  # 接口检测方式
        path: /index.html  # 检查路径
        port: 80
        scheme: HTTP # http or https
        # httpHeaders:  # 可选,检查的请求头
        # - name: end-user
        # value: Jason
      initialDelaySeconds: 10 # 初始化时间,健康检查延迟执行时间
      timeoutSeconds: 2 # 超时时间
      periodSeconds: 5 # 检测间隔
      successThreshold: 1 # 检查成功为1次表示就绪
      failureThreshold: 2 # 检测失败为2次表示为就绪
    livenessProbe: # 可选健康检查
      tcpSocket: # 端口检测方式
        port: 80
      initialDelaySeconds: 10 # 初始化时间
      timeoutSeconds: 2  # 超时时间
      periodSeconds: 5   # 检测间隔
      successThreshold: 1 # 检查成功为2次表示就绪
      failureThreshold: 2 # 检测失败1 次表示未就绪
    ports:  # 可选,容器需要暴露的端口列表
    - containerPort: 80 #端口号
  #restartPolicy: Never # 重启策略

四、gRpC探测(kubernetes 1.24 版本默认开启) 针对gRpC开发服务适用

apiVersion: v1
kind: Pod
metadata:
  name: etcd-with-grpc
spec:
  containers:
  - name: etcd
    image: registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.1-0
    command: [ "/usr/local/bin/etcd", "--data-dir", "/var/lib/etcd", "--listen-client-urls", "http://0.0.0.0:2379", "--advertise-client-urls", "http://127.0.0.1:2379", "--log-level", "debug"]
    ports:
    - containerPort: 2379
    livenessProbe:
      grpc:
        port: 2379
      initialDelaySeconds: 10