检查其他容器状态的优雅方式

时间:2019-06-14 14:02:21

标签: kubernetes kubernetes-pod

由于Kubernetes并未在Container之间实现依赖关系,所以我想知道是否存在一种优雅的方法来检查同一Pod中的另一个Container是否已就绪。

我认为向下API是必要的。 也许可以通过将kubectl嵌入容器中来完成-但是有没有更简单的方法?

2 个答案:

答案 0 :(得分:1)

等待另一个容器到另一个容器的容器很容易通过使用初始化容器来完成,该容器将进行检查(通常在运行状况端点上卷曲)或其他情况,直到收到可接受的答案为止。在同一个容器中的容器上,此解决方案将不起作用,但是您可以使用容器规范的command部分来实现类似的操作。

对于HTTP服务:

    command:
    - '/bin/sh'
    - '-c'
    - >
      set -ex;
      until curl --fail --connect-timeout 5 http://localhost:8080/login; do sleep 2; done
      && <start command>

对于postgres数据库,您可以轻松实现相同目标:

    command:
    - '/bin/bash'
    - >
      until pg_isready --host localhost -p 5432; do sleep 2; done
      && bash /sql/00-postgres-configuration.sh

这些只是示例,您必须确定检测其他容器的最佳方式是正常的。

看看https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/,了解如何为吊舱指定command

答案 1 :(得分:1)

现在我最终使用了一个简单的文件存在检查:

apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      containers:
      ...
      - name: former
        readinessProbe:
          exec:
            command:
            - /bin/sh
            - "-c"
            - /bin/sh /check_readiness.sh && touch /foo/ready
        volumeMounts:
        - name: shared-data
          mountPath: /foo
        ...
      - name: latter
        command:
        - /bin/sh
        - "-c"
        - while [ ! -f /foo/ready ]; do sleep 1; done; /bar.sh
        volumeMounts:
        - name: shared-data
          mountPath: /foo
          readOnly: true
      ...
      volumes:
      - name: shared-data
        emptyDir: {}