K8S部署执行shell脚本读取配置数据

0 deployment manifest kubernetes

在 K8S 中,在部署时在容器(POD)中执行一次脚本的最佳方法是什么,该脚本从属于部署一部分的配置文件中读取并作为 mongodb 的种子一次?

我的项目由 k8s 清单文件 + 配置文件组成

我希望能够在本地更新配置文件,然后通过 kubectl 或 helm 重新部署

在 docker-compose 中,我可以在配置文件所在的目录创建一个卷 ponting,然后在命令部分执行 bash -c cmds 从卷中的配置文件中读取。在 K8S 中如何最好地完成此操作?我不想通过 dockerfile 将配置文件包含在映像中,这迫使我在通过 kubectl 或 helm 再次重新部署之前重建映像

Con*_*nst 5

在 K8S 中如何最好地完成此操作?

给猫剥皮的方法有多种,但我的建议是执行以下操作:

  • 保留配置configMap并将其安装为单独的卷。这样的映射保留为 k8s 清单,使其所有更改与 docker 构建映像分开 - 无需重建或保留映像中的敏感数据。secret您也可以以与 相同的方式替代使用(或与 一起使用)configMap
  • 用于initContainers在主容器上线之前进行初始化,自动覆盖“一次部署”。或者(如果初始化操作不可重复)您可以使用Jobs它并在必要时启动它。

以下是我们在 gitlab runner 上使用的示例摘录:

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: ss-my-project
spec:
  ...
  template:
    ....
    spec:
      ...
      volumes:
      - name: volume-from-config-map-config-files
        configMap:
          name: cm-my-config-files
      - name: volume-from-config-map-script
        projected:
          sources:
          - configMap:
              name: cm-my-scripts
              items:
              - key: run.sh
                path: run.sh
                mode: 0755
      # if you need to run as non-root here is how it is done:
      securityContext:
        runAsNonRoot: true
        runAsUser: 999
        supplementalGroups: [999]
      containers:
      - image: ...
        name: ...
        command:
        - /scripts/run.sh
        ...
        volumeMounts:
        - name: volume-from-config-map-script
          mountPath: "/scripts"
          readOnly: true
        - mountPath: /usr/share/my-app-config/config.file
          name: volume-from-config-map-config-files
          subPath: config.file
      ...
Run Code Online (Sandbox Code Playgroud)

您可以,ofc,从配置映射安装多个卷或将它们合并为一个卷,具体取决于更改的频率和受影响的部分。这是两个单独安装的示例,configMap只是为了说明原理(并标记脚本可执行文件),但您可以仅对所有必需的文件使用一个,将多个文件放入一个文件或将单个文件放入每个文件 - 根据您的需要。

此类 configMap 的示例如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-my-scripts
data:
  run.sh: |
    #!/bin/bash
    echo "Doing some work here..."
Run Code Online (Sandbox Code Playgroud)

覆盖配置文件的 configMap 示例如下:

kind: ConfigMap
apiVersion: v1
metadata:
  name: cm-my-config-files
data:
  config.file: |
     ---
     # Some config.file (example name) required in project
     # in whatever format config file actually is (just example)
     ... (here is actual content like server.host: "0" or EFG=True or whatever)
Run Code Online (Sandbox Code Playgroud)

使用单个或多个文件configMaps可以产生您想要的结果,并且根据您的需要,您可以拥有任意数量的文件。

在 docker-compose 中,我可以在配置文件所在的目录创建一个卷 ponting,然后在命令部分执行 bash -c cmds 从卷中的配置文件中读取。

在 k8s 中相当于这样,hostPath但是这样你就会严重妨碍 k8s 将 pod 调度到不同节点的能力。如果您有单节点集群(或在开发过程中)以简化配置文件的更改,这可能没问题,但对于实际部署,建议使用上述方法。