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

问题描述 投票:1回答:3

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

目前我手动执行此操作:

kubectl cp custom-samples.json che-8467596d54-7c2hg:/data/templates

但我希望将此步骤作为将自动执行的部署的一部分。请注意,我看了一下post-install钩子,但我不确定这是一个很好的解决方案。

[UPD]我创建了这个init容器:

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

但是已安装的卷中缺少文件custom.json

kubernetes kubernetes-helm
3个回答
1
投票

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

但是,最好让pod自己获取该文件(例如,通过http或来自github)作为其启动的一部分。如果您可以控制容器的启动(例如,您拥有其代码,或者您可以指定它运行的命令),则可以轻松地执行此操作。您还可以定义一个init容器,该容器在执行实际工作的容器之前运行,并将文件拉入与主容器共享的卷中。


1
投票

你可以include your file in the Helm chart。你通常将它包含在Kubernetes ConfigMap对象中,然后可以是mounted in a Pod as a volume

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

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  custom-samples.json" |-
{{ .Files.Get "custom-samples.json" | indent 4 }}

然后在您的Deployment的Pod规范中,您将引用此:

apiVersion: v1
kind: Deployment
spec:
  template:
    spec:
      volumes:
        - name: config
          configMap:
            name: {{ .Release.Name }}-configmap
      containers:
        - name: ...
          volumeMounts:
            - name: config
              mountPath: /data/templates

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


0
投票

您可以使用ksync或OpenShift,它具有内置的oc rsync命令。

© www.soinside.com 2019 - 2024. All rights reserved.