Kubernetes Heathcheck Probe in the ConfigMap
简述
本文详细介绍怎么使用Command Probe检测Pods的状态,在配置中注意的一些事项
Entrypoint & CMD的关系
章节引用官方文档简述一下二之间的关系,entrypoint & command
Docker
-
-
ENTRYPOINT
用于指定容器启动时要执行的可执行文件或命令。如果用户在运行容器时提供了命令,这个命令将被传递给ENTRYPOINT
指定的命令作为参数。如果 Dockerfile 中有多个ENTRYPOINT
指令,只有最后一个ENTRYPOINT
指令会生效。FROM your-base-image ENTRYPOINT ["echo", "Hello,"]
-
CMD
用于指定容器启动时要执行的默认命令。如果用户在运行容器时提供了命令,那么这个命令将覆盖CMD
中的默认命令。如果 Dockerfile 中有多个CMD
指令,只有最后一个CMD
指令会生效,CMD
一般用来作为ENTRYPOINT
的参数,如下FROM your-base-image ENTRYPOINT ["echo", "Hello,"] CMD ["World!"]
-
CMD
与ENTRYPOINT
结合使用:-
你可以同时在 Dockerfile 中使用
CMD
和ENTRYPOINT
。 -
如果用户在运行容器时提供了命令,该命令将覆盖
CMD
,但会附加到ENTRYPOINT
后面。 -
CMD
可以被覆盖,但是ENTRYPOINT
不可以被覆盖
-
-
Kubernetes
-
- CMD
创建 Pod 时,可以为其下的容器设置启动时要执行的命令及其参数。如果要设置命令,就填写在配置文件的
command
字段下,如果要设置命令的参数,就填写在配置文件的args
字段下。 一旦 Pod 创建完成,该命令及其参数就无法再进行更改了。如果在配置文件中设置了容器启动时要执行的命令及其参数,那么容器镜像中自带的命令与参数将会被覆盖而不再执行。 如果配置文件中只是设置了参数,却没有设置其对应的命令,那么容器镜像中自带的命令会使用该新参数作为其执行时的参数。
- 设置格式
apiVersion: v1 kind: Pod metadata: name: command-demo labels: purpose: demonstrate-command spec: containers: - name: command-demo-container image: debian command: ["printenv"] args: ["HOSTNAME", "KUBERNETES_PORT"] restartPolicy: OnFailure
- CMD
Probe脚本植入到ConfigMap
将探针的脚本放入ConfigMap的注意事项
创建ConfigMap
-
- 使用kubectl从文件生成
kubectl create configmap scripts -n dev \ --from-file=start.sh \ --from-file=stop.sh \ --from-file=healthcheck.sh
- 使用kubectl从文件生成
Depolyment.yaml配置
-
- volumes配置如下
spec: volumes: - name: scripts configMap: name: scripts defaultMode: 420
- volumeMounts配置如下
volumeMounts: - name: scripts mountPath: /home/nflow/scripts
- volumes配置如下
配置Healthcheck Command Probe
-
-
调整Deployment.yaml
livenessProbe: exec: command: - /bin/bash - scripts/healthcheck.sh - '8000' initialDelaySeconds: 300 timeoutSeconds: 5 periodSeconds: 10 successThreshold: 1 failureThreshold: 3 readinessProbe: exec: command: - /bin/bash - scripts/healthcheck.sh - '8000' initialDelaySeconds: 30 timeoutSeconds: 2 periodSeconds: 2 successThreshold: 2 failureThreshold: 300
-
注意,如果你检测脚本是放入ConfigMap中一定使用/bin/bash 或者 /bin/sh执行,否则报权限不足,如下
[nflow@dev01-cash-collection-6d9f8577b8-zcfqc ~]$ /home/xxx/scripts/healthcheck.sh 8000 bash: /home/xxx/scripts/healthcheck.sh: Permission denied
-
注意如果在Dockefile使用了 WORKDIR 工作目录,在Pods的command以及探针command可以使用相对路径
-
如果你的探针脚本有参数传入的情况,如上是数字需要另起一行并且使用双、单引号括起来
-
启动脚本植入到ConfigMap中
如果容器的启动脚本不是封装在镜像中,而且植入到ConfigMap中,以下需要一些注意事项
-
-
配置方式一
containers: - name: dev01-cash-collection image: imagehub.qiangyun.com/nfsp/cash-collection:SNAPSHOT-master-31 command: ["/bin/bash start.sh"]
-
配置方式二
containers: - name: dev01-cash-collection image: imagehub.qiangyun.com/nfsp/cash-collection:SNAPSHOT-master-31 command: - /bin/bash - start.sh
-
配置方式三,如果有参数的情况下使用args,如下官方文档参考
containers: - name: dev01-cash-collection image: imagehub.qiangyun.com/nfsp/cash-collection:SNAPSHOT-master-31 command: - /bin/bash args: - start.sh
-