k8s:pod 部署后将文件复制到容器

kos*_*mol 4 kubernetes kubernetes-helm

我正在使用 Helm 图表在 Kubernetes 中部署应用程序。部署后,我想将一个文件从图表存储库复制到容器中。

目前我正在手动执行此操作:

kubectl cp custom-samples.json che-8467596d54-7c2hg:/data/templates
Run Code Online (Sandbox Code Playgroud)

但我想让这一步成为将自动执行的部署的一部分。请注意,我查看了post-installhooks,但我不确定它是否是一个好的解决方案。

[UPD] 我创建了这个初始化容器:

 - name: add-custom-samples
        image: alpine:3.5
        command: ["sh", "-c", "cd /data/templates; touch custom.json;"]
        volumeMounts: [{
              "mountPath": "/data",
              "name": "che-data-volume"
        }]
Run Code Online (Sandbox Code Playgroud)

但是该文件custom.json在安装的卷中丢失。

Dav*_*aze 5

您可以在 Helm 图表中包含您的文件。您通常会将其包含在 Kubernetes ConfigMap 对象中,然后可以将其作为 volume 挂载在 Pod 中

您需要将文件移动到 Helm 图表目录中的某个位置;说它在charts/mychart/files/custom-samples.json。例如,您可以创建一个 ConfigMap,charts/mychart/templates/configmap.yaml看起来像

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  custom-samples.json" |-
{{ .Files.Get "custom-samples.json" | indent 4 }}
Run Code Online (Sandbox Code Playgroud)

然后在您的部署的 Pod 规范中,您将引用以下内容:

apiVersion: v1
kind: Deployment
spec:
  template:
    spec:
      volumes:
        - name: config
          configMap:
            name: {{ .Release.Name }}-configmap
      containers:
        - name: ...
          volumeMounts:
            - name: config
              mountPath: /data/templates
Run Code Online (Sandbox Code Playgroud)

请注意,这种方法会导致文件被存储为 Kubernetes 对象,并且有一些适度的大小限制;看起来像文本文件并且以千字节为单位的东西应该没问题。此外,如果/data/templates目录中有其他文件,这种方法将导致它们被隐藏以支持 ConfigMap 中的任何内容。


Leo*_*o K 4

kubectl cp(以您正在使用它的形式)从它运行的主机获取一个文件。如果您始终从同一主机启动部署,则可以(理论上)安排复制文件 - 或者通过kubectl cp ...用于控制部署的脚本或设置监视并每次执行复制需要它的部署中会出现一个新容器。

然而,最好让 pod在启动过程中自行获取该文件(例如,通过 http 或从 github)。如果您可以控制容器的启动(例如,您拥有其代码或者您可以指定它运行的命令),那么您可以轻松做到这一点。您还可以定义一个 init 容器,该容器在执行实际工作的容器之前运行,并将文件拉入与主容器共享的卷中。