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驱动容器。