【问题标题】:Kubernetes Deployments and Init ContainersKubernetes 部署和初始化容器
【发布时间】:2019-07-15 08:29:47
【问题描述】:

learned recently 知道 Kubernetes 有一个名为 Init Containers 的功能。太棒了,因为我可以使用此功能等待我的 postgres 服务并在我的 Web 应用程序服务运行之前创建/迁移数据库。

但是,Init Containers 似乎只能在 Pod yaml 文件中配置。有没有办法通过部署 yaml 文件来做到这一点?还是我必须选择?

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    为避免混淆,请回答您的具体问题。我同意 oswin 的观点,您可能需要考虑另一种方法。

    是的,您可以在部署中使用初始化容器。这是一个使用旧样式(1.6 之前)的示例,但它应该可以工作

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: 'nginx'
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: 'nginx'
    
      template:
        metadata:
          labels:
            app: 'nginx'
          annotations:
            pod.beta.kubernetes.io/init-containers: '[
                {
                    "name": "install",
                    "image": "busybox",
                    "imagePullPolicy": "IfNotPresent",
                    "command": ["wget", "-O", "/application/index.html", "http://kubernetes.io/index.html"],
                    "volumeMounts": [
                        {
                          "name": "application",
                          "mountPath": "/application"
                        }
                    ]
                }
            ]'
        spec:
          volumes:
            - name: 'application'
              emptyDir: {}
    
          containers:
    
          - name: webserver
            image: 'nginx'
            ports:
            - name: http
              containerPort: 80
            volumeMounts:
              - name: 'application'
                mountPath: '/application'
    

    【讨论】:

    • 就问题而言,你一针见血。原来我在 GCE 上的集群还在 1.5 上。你的代码可以工作,但我决定升级到 1.6。然后我可以将initContainers 放入部署yaml
    • 很高兴它有帮助。
    • @JamStar init 容器会在每个部署中执行一次还是每个 Pod 执行一次?
    • @JavierHolguera 你有没有发现初始化容器是每个部署一次还是每个 pod 一次?还有一种方法可以在每次部署时执行一次吗?
    • init 容器在真正的 pod 启动之前,因此每个部署一个。
    【解决方案2】:

    对于这个用例,您可能希望使用就绪探针而不是初始化容器。看看这个link 和一个blog。另请注意,部署不会将流量发送到未报告就绪的 pod - 如果您担心的话。

    这是一种众所周知的模式,Web 服务器中的就绪探测会在报告就绪之前简单地检查数据库端点/数据可用性。这是一个简单的解决方案,而不是额外的 init 容器的复杂性,并且还具有正确检测数据库中断的优点。

    【讨论】:

    • 我认为 init 容器与就绪探测无关。在应用程序容器启动之前,初始化容器一直运行到完成并成功退出,并且根据文档 - k8s 将在启动应用程序容器之前等待所有初始化容器成功。 Init 容器旨在运行有限的一次性 pod 启动任务,而就绪探针用于报告无限期运行的应用程序的状态。并非所有引导任务都适合放入应用程序容器中。
    • @alexykot 我没有试图详细说明 init 容器和就绪探针之间的关系,而是根据我们掌握的少量信息,将 OP 指向可能适合他原始问题的解决方案。这是一个众所周知的模式,Web 服务器中的就绪探测会在报告就绪之前简单地检查数据库可用性。这是一个简单的解决方案,而不是额外的 init 容器的复杂性。 (将此添加到答案中)
    • OP 最初的问题不仅在于等待数据库的可用性,还在于“创建/迁移数据库”,这是一项超出就绪探测范围的单独特定任务。
    • 数据库可能不在容器中,例如它可以是托管云实例。而且我不确定 DB 容器如何知道应用程序需要什么架构结构。
    • 据我所知,OP 的问题首先是关于 initContainers。我看不出数据库放置(集群内或其他地方)与您如何运行迁移有什么关系,迁移是应用程序逻辑,而不是数据库服务器逻辑。所以我认为初始化容器无论如何都是相关的。您可以将迁移逻辑放入应用程序启动中或放入同一个 pod 中的 initContainer 中,我认为两者都是合理且符合预期目的的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 2020-07-16
    • 2017-08-24
    • 2019-08-29
    • 2017-07-14
    • 2019-10-20
    • 2018-08-21
    相关资源
    最近更新 更多