Kubernetes CSI livenessprobe探活

要实现一个Kubernetes CSI的livenessprobe探活,可以有以下三种方法:

HttpServer

1、在CSI中实现一个简单的HttpServer,暴露探活接口;

GRPC探测

2、CSI镜像中,增加grpcurl命令,livenessprobe的配置中,使用grpccurl来访问CSI的Probe接口;
这里也需要制作镜像,首先是CSI镜像中,增加grpcurl命令。此外,从CSI官网下载适合版本的csi.proto到镜像中(这里以/root/csi.proto)为例。然后修改CSI的yaml文件。示例如下:

kind: Pod
spec:
  containers:
  # Container with CSI driver
  - name: hostpath-driver
    image: quay.io/k8scsi/hostpathplugin:v0.2.0
    ports:
    - containerPort: 9808
      name: healthz
      protocol: TCP
    # The probe
    livenessProbe:
      failureThreshold: 5
      exec:
        command:
        - sh
        - -c
        - "grpcurl -plaintext -unix=true -import-path "/root" -proto csi.proto /var/lib/csi/sockets/pluginproxy/csi.sock csi.v1.Identity/Probe"
      initialDelaySeconds: 10
      timeoutSeconds: 3
      periodSeconds: 2
    volumeMounts:
    - mountPath: /csi
      name: socket-dir

livenessprobe边车

3、直接使用CSI官方提供的livenessprobe边车镜像。这种方法相对最简单。
livenessprobe边车镜像,github地址在这里。其原理很简单,就是暴露一个HTTP服务,探测该服务时,该服务会向CSI驱动发送GRPC Probe请求,Probe成功则返回探测成功。
使用也很简单,示例yaml如下:

kind: Pod
spec:
  containers:
  # Container with CSI driver
  - name: hostpath-driver
    image: quay.io/k8scsi/hostpathplugin:v0.2.0
    # Defining port which will be used to GET plugin health status
    # 9808 is default, but can be changed.
    ports:
    - containerPort: 9808
      name: healthz
      protocol: TCP
    # The probe
    livenessProbe:
      failureThreshold: 5
      httpGet:
        path: /healthz
        port: healthz
      initialDelaySeconds: 10
      timeoutSeconds: 3
      periodSeconds: 2
    volumeMounts:
    - mountPath: /csi
      name: socket-dir
  # ...
  # The liveness probe sidecar container
  - name: liveness-probe
    imagePullPolicy: Always
    image: registry.k8s.io/sig-storage/livenessprobe:v2.12.0
    args:
    - --csi-address=/csi/csi.sock
    volumeMounts:
    - mountPath: /csi
      name: socket-dir
    # ...

需要配置CSI socket的映射和路径。默认的探测端口为9808,可以使用--http-endpoint覆盖。
这里需要注意的是探测端口虽然由边车容器提供,但livenessProbe的具体配置却需要在CSI驱动容器中。因为一旦探测失败并达到阈值,Kubernetes
会就会重启CSI驱动容器。