如何覆盖 Kubernetes 部署文件中 pods 容器中的文件?

Ice*_*Ice 6 elasticsearch kubernetes

我想覆盖 pod 容器上的文件。现在我已经elasticsearch.yml在位置了/usr/share/elasticsearch/config

我试图通过initContainerkubernetes 部署文件来实现这一点,所以我添加了如下内容:

        - name: disabled-the-xpack-security
          image: busybox
          command: 
          - /bin/sh 
          - -c 
          - |
            sleep 20
            rm /usr/share/elasticsearch/config/elasticsearch.yml 
            cp /home/x/IdeaProjects/BD/infra/istio/kube/elasticsearch.yml /usr/share/elasticsearch/config/
          securityContext:
            privileged: true
Run Code Online (Sandbox Code Playgroud)

但这不起作用,错误看起来像:

rm: can't remove '/usr/share/elasticsearch/config/elasticsearch.yml': No such file or directory
cp: can't stat '/home/x/IdeaProjects/BD/infra/istio/kube/elasticsearch.yml': No such file or directory
Run Code Online (Sandbox Code Playgroud)

我试图使用一些echo "some yaml config" >> elasticsearch.yml,但这种解决方法不起作用,因为我能够保持正确的 yaml 格式。

您有什么建议吗?我该怎么做?

Haz*_*zim 7

正如 Arman 在评论中所述,您可以使用 的内容创建一个 ConfigMap,/home/x/IdeaProjects/BD/infra/istio/kube/elasticsearch.yml并将其作为部署中的卷安装。

要从文件创建配置映射,您可以运行:

kubectl create configmap my-es-config --from-file=/home/x/IdeaProjects/BD/infra/istio/kube/elasticsearch.yml
Run Code Online (Sandbox Code Playgroud)

这将使用 yaml 文件在 kubernetes 集群内创建一个 ConfigMap。

然后,您可以使用它并将卷安装添加到您的部署中,如下所示:

  containers:
    - name: elasticsearch
      image: k8s.gcr.io/busybox
      .
      .
      .
      volumeMounts:
      - name: config-volume
        mountPath: /usr/share/elasticsearch/config/
  volumes:
    - name: config-volume
      configMap:
        name: my-es-config
Run Code Online (Sandbox Code Playgroud)

笔记

  • 建议也将 ConfigMap 创建为 yaml。更多信息请点击此处
  • 直接在 上挂载 configmap/usr/share/elasticsearch/config/将替换该路径内的所有内容并放置 configmap 中的配置文件。如果这导致问题,您可能需要将其安装在另一个位置,然后复制它。

  • 实际上,我想指出的是,挂载整个目录也会删除 JVM 配置,尝试将文件挂载到不同的路径并定义 ENV 以从新路径读取 (2认同)

小智 7

请注意,如果您不想覆盖已安装目录中的所有内容,则可以仅在您想要的任何目录中使用“subPath”来安装文件。

https://kubernetes.io/docs/concepts/storage/volumes/#using-subpath