2

假设我们有一个简单的 deployment.yml 文件:

apiVersion: apps/v1 
kind: Deployment
metadata:
  namespace: ikg-api-demo
  name: ikg-api-demo
spec:
  selector:
    matchLabels:
      app: ikg-api-demo
  replicas: 3 
  template:
    metadata:
      labels:
        app: ikg-api-demo
    spec:
      containers:
        - name: ikg-api-demo
          imagePullPolicy: Always
          image: example.com/main_api:private_key
          ports:
            - containerPort: 80

问题是这个图像/容器依赖于另一个图像/容器 - 它需要从另一个图像中获取数据,或者使用一些共享卷。

如何告诉 kubernetes 下载另一个镜像,将其作为容器运行,然后将数据从中复制到上述文件中声明的容器中?

看起来这篇文章解释了如何。

但目前还不是 100% 清楚它是如何工作的。看起来您创建了一些共享卷,启动两个容器,使用该共享卷?

所以我根据那个链接,我把它添加到我的deployment.yml中:

spec:

  volumes:
    - name: shared-data
      emptyDir: {}

  containers:

    - name: ikg-api-demo
      imagePullPolicy: Always
      volumeMounts:
        - name: shared-data
          mountPath: /nltk_data
      image: example.com/nltk_data:latest

    - name: ikg-api-demo
      imagePullPolicy: Always
      volumeMounts:
        - name: shared-data
          mountPath: /nltk_data
      image: example.com/main_api:private_key
      ports:
        - containerPort: 80

我的主要犹豫是,将 /nltk_data 安装为共享卷将覆盖可能已经存在的内容。

所以我假设我需要做的是将它安装在其他位置,然后为源数据容器创建 ENTRYPOINT:

ENTRYPOINT ['cp', '-r', '/nltk_data_source', '/nltk_data']

这样一旦容器启动,就会将其写入共享卷。

所以我有两个问题:

  1. 如何在另一个容器开始使用 kubernetes 之前运行一个容器并完成一项工作?

  2. 如何写入共享卷而不让共享卷覆盖映像中的内容?换句话说,如果我在图像/容器中有 /xyz,我不想复制/xyz到,/shared_volume_mount_location如果我不需要的话。

4

1 回答 1

8

如何在另一个容器开始使用 kubernetes 之前运行一个容器并完成一项工作?

使用 initContainers - 更新你的 deployment.yml,假设example.com/nltk_data:latest是你的数据镜像

如何在不覆盖共享卷的情况下写入共享卷?

如您所知,您的映像中有什么,您需要选择适当的挂载路径。我会用/mnt/nltk_data

使用 init 容器更新了 deployment.yml

spec:
  volumes:
    - name: shared-data
      emptyDir: {}
  initContainers:
    - name: init-ikg-api-demo
      imagePullPolicy: Always
      # You can use command, if you don't want to change the ENTRYPOINT
      command: ['sh', '-c', 'cp -r /nltk_data_source /mnt/nltk_data']
      volumeMounts:
        - name: shared-data
          mountPath: /mnt/nltk_data
      image: example.com/nltk_data:latest
  containers:
    - name: ikg-api-demo
      imagePullPolicy: Always
      volumeMounts:
        - name: shared-data
          mountPath: /nltk_data
      image: example.com/main_api:private_key
      ports:
        - containerPort: 80
于 2019-07-03T04:54:42.273 回答