Kubernetes部署和初始化容器

Kubernetes部署和初始化容器,kubernetes,Kubernetes,我相信库伯内特斯有一个功能叫做。棒极了,因为我可以使用此功能等待我的postgres服务,并在web应用程序服务运行之前创建/迁移数据库 但是,似乎只能在Pod yaml文件中配置Init容器。有没有一种方法可以通过部署yaml文件实现这一点?或者我必须选择吗?对于这个用例,您可能希望使用就绪探测而不是init容器。看看这个和一个。还要注意的是,如果您担心的话,部署不会将流量发送到未报告准备就绪的pod 这是一种众所周知的模式,web服务器中的就绪性探测器只需在报告就绪之前检查DB端点/数据可用

我相信库伯内特斯有一个功能叫做。棒极了,因为我可以使用此功能等待我的postgres服务,并在web应用程序服务运行之前创建/迁移数据库


但是,似乎只能在Pod yaml文件中配置Init容器。有没有一种方法可以通过部署yaml文件实现这一点?或者我必须选择吗?

对于这个用例,您可能希望使用就绪探测而不是init容器。看看这个和一个。还要注意的是,如果您担心的话,部署不会将流量发送到未报告准备就绪的pod


这是一种众所周知的模式,web服务器中的就绪性探测器只需在报告就绪之前检查DB端点/数据可用性。这是一个简单的解决方案,与额外init容器的复杂性相反,它还具有正确检测数据库中断的优点。

为避免混淆,我将回答您的具体问题。我同意奥斯温,你可能想考虑另一种方法。

是的,您可以在部署中使用init容器。这是一个使用旧样式(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
放入部署yamlglad中,这很有帮助。@JamStar init容器是每个部署执行一次还是每个pod执行一次?@JavierHolguera你有没有发现init容器是每个部署执行一次还是每个pod执行一次?还有一种方法可以每次部署一次吗?init容器在真正的pod开始之前,所以每次部署一个。我认为init容器与就绪探测没有任何关系。初始化容器运行直到完成并成功退出,然后应用程序容器才会启动,根据文档,k8s将在启动应用程序容器之前等待所有初始化容器成功。Init容器设计用于运行有限的一次性pod启动任务,而就绪探测用于报告无限期运行的应用程序的状态。并不是所有的引导任务都适合放在应用程序容器中。@alexykot I没有试图详细说明init容器和就绪探测之间的关系,而是根据我们掌握的很少信息,为OP指出了一个可能适合其原始问题的解决方案。这是一种众所周知的模式,web服务器中的就绪性探测器只需在报告就绪之前检查数据库的可用性。这是一个简单的解决方案,而不是额外的init容器的复杂性。(将此添加到回答中)OPs最初的问题不仅是等待DB可用性,而且是“创建/迁移数据库”,这是readiness probe范围之外的一项单独的特定任务。DB可能不在容器中,例如,它可以是托管云实例。我不确定DB容器如何知道应用程序需要什么样的模式结构。据我所知,OPs的问题首先是关于
initContainers
。我看不出数据库的位置(在集群或其他地方)与运行迁移的方式有什么关系,迁移是应用程序逻辑,而不是数据库服务器逻辑。所以我认为init容器是相关的。您可以将迁移逻辑放在应用程序启动或同一个pod中的initContainer中,我认为这两种方法都是合理的,而且都是有目的的。