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!"]
    • CMDENTRYPOINT 结合使用:

      • 你可以同时在 Dockerfile 中使用 CMDENTRYPOINT

      • 如果用户在运行容器时提供了命令,该命令将覆盖 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

Probe脚本植入到ConfigMap


将探针的脚本放入ConfigMap的注意事项

  创建ConfigMap

    1. 使用kubectl从文件生成
      kubectl create configmap scripts -n dev \
        --from-file=start.sh \
        --from-file=stop.sh \
        --from-file=healthcheck.sh

  Depolyment.yaml配置

    1. volumes配置如下
          spec:
            volumes:
              - name: scripts
                configMap:
                  name: scripts
                  defaultMode: 420
    2. volumeMounts配置如下
                volumeMounts:
                  - name: scripts
                    mountPath: /home/nflow/scripts

  配置Healthcheck Command Probe

    1. 调整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
    2. 注意,如果你检测脚本是放入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
    3. 注意如果在Dockefile使用了 WORKDIR 工作目录,在Pods的command以及探针command可以使用相对路径

    4. 如果你的探针脚本有参数传入的情况,如上是数字需要另起一行并且使用双、单引号括起来

启动脚本植入到ConfigMap中


如果容器的启动脚本不是封装在镜像中,而且植入到ConfigMap中,以下需要一些注意事项

    1. 配置方式一

            containers:
              - name: dev01-cash-collection
                image: imagehub.qiangyun.com/nfsp/cash-collection:SNAPSHOT-master-31
                command: ["/bin/bash start.sh"]
    2. 配置方式二

            containers:
              - name: dev01-cash-collection
                image: imagehub.qiangyun.com/nfsp/cash-collection:SNAPSHOT-master-31
                command:
                  - /bin/bash
                  - start.sh
    3. 配置方式三,如果有参数的情况下使用args,如下官方文档参考

            containers:
              - name: dev01-cash-collection
                image: imagehub.qiangyun.com/nfsp/cash-collection:SNAPSHOT-master-31
                command:
                  - /bin/bash
                args:
                  - start.sh

       

posted @ 2024-01-18 09:43  MacoPlus  阅读(8)  评论(0编辑  收藏  举报