在容器启动之前在Kubernetes容器中获取数据

时间:2018-09-28 00:54:39

标签: python kubernetes

我有一个可以控制Kubernetes集群的Python程序(从外部)。在执行该程序期间,它将获得一个字节数组。

我已经准备好创建完整的pod规范。

我需要修改pod规范(添加一个初始化容器),以便在主容器启动时,某个文件所在的位置具有这些确切的字节。

最简单的方法是什么?

2 个答案:

答案 0 :(得分:1)

这更多是一个意见问题/答案。

如果您的python脚本生成了特定的字节,我将使用带有卷的initContainer。像这样:

initContainers:
- name: init-container
  image: container:version
  command: [ 'your-python.py' ]
  volumeMounts:
  - name: conf
    mountPath: /mnt/conf.d
containers:
- name: app-container
  image: container:version
  command: [ 'your-actual-app' ]
  volumeMounts:
  - name: conf
    mountPath: /mnt/conf.d

例如,如果您的字节是连续的UTF-8字符,则只需使用ConfigMap

答案 1 :(得分:0)

如果我正确理解了您的问题,那么您想运行一个Python脚本,该脚本将在Pod启动之前从某个位置提取或派生一个字节数组,并将此字节数组写入文件以供您的实际应用程序在内部运行时从中读取豆荚。

我可以看到两种方法来实现这一目标:

  • 稍微修改Docker映像以将脚本作为入口点运行,然后运行应用程序(在Pod规范中,命令:&args :)。您可以将两者一起运送,并且不需要initContainer。
  • 或者如您所愿:结合使用initContainer和Volumes

以后:

template:
  spec:
    volumes:
    - name: byte-array
      emptyDir: {}
    initContainers:
        - name: byte-array-generator
          image: your/init-image:latest
          command: ["/usr/bin/python", "byte_array_generator.py"]
          volumeMounts:
            - mountPath: /my/byte-array/
              name: byte-array
    containers:
    - name: application
      image: your/actual-app:latest
      volumeMounts:
        - name: byte-array
          mountPath: /byte-array/

我浓缩了所有3个部分:

  • 用于传递文件的1个空卷定义
  • 1个带有脚本的initContainer生成字节数组并将其写入磁盘,例如/my/byte-array/bytearray.bin(已安装卷的位置)
  • 运行应用程序并从/byte-array/bytearray.bin(已装入卷)读取字节数组的1个实际容器

您还需要考虑的一个重要注意事项是:如果将卷装载到带有实际文件的预先存在的文件夹中,它们将全部被您的卷“覆盖”。源将取代目的地的位置。 您也许可以使用subPath来防止这种情况,但是我从未尝试过这种方式,我只知道如果将ConfigMaps作为卷挂载就可以使用。

编辑 :评论的答案太长

在容器外部还是在Kubernetes集群外部?也许会有一个误解,以防万一:initContainer不必使用与Pod相同的图像。您甚至可以将脚本作为ConfigMap加载,并使用Python基本映像将其安装到initContainer中以运行它...

但是,如果实际上您的脚本必须在集群外部运行并发送一个文件以使Pod能够启动,则建议您在字节生成中添加逻辑,以将其输出到具有Pod主机名的文件中示例(来自Kubernetes API),然后将其剪切到运行它的Kubernetes节点(也从Kubernetes API中拉出)到已知目标。只需在节点的每个上定义一个文件夹,例如/var/data/your_app/,然后将其安装在所有Pod上即可。

volumes:
  - hostPath:
       path: /var/data/your_app
      type: Directory
    name: bite-arrays

然后将bite-arrays挂载到任何需要读取的容器中,方法是重用其主机名(以便在必要时进行扩展)。 既然您说过您的脚本正在控制集群,那么我认为它已经在与Kubernetes的API通信...您可能还想创建一个逻辑来清理剩余的数据...

也许我们弄错了所有信息,并且您的脚本还在以某种方式即时生成和应用Pod规范,在这种情况下,可以通过环境变量或ConfigMap附带的ConfigMap来解决。

Pod规格:

volumes:
  - name: byte-array
    configMap:
      name: your-app-bytes

volumeMounts:
  - name: byte-array
    mountPath: /data/your-app/byte-array
    readOnly: true
    subPath: byte-array

ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: your-app-bytes
data:
  byte-array: |-
    WHATEVERBYTESAREGENERATEDHERE