繁体   English   中英

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

[英]K8S deployment executing shell scripts reading configuration data

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

我的项目包含k8s清单文件+配置文件

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

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

如何在K8S中做到最好?

有几种方法可以给猫皮,但是我的建议是做以下事情:

  • 将配置保留在configMap并将其挂载为单独的卷。 这样的地图会保留为k8s清单,使对它的所有更改都与docker build image分开-无需在镜像中重建或保留敏感数据。 您还可以以与configMap相同的方式使用secret (或与secret一起使用)。
  • 在使主容器联机之前,使用initContainers进行初始化,自动覆盖您的“部署一次”。 另外,(如果初始化操作不可重复),您可以改用Jobs并在必要时启动它。

这是我们在gitlab运行程序上使用的示例的摘录:

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
      ...

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

这样的configMap的示例如下所示:

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-my-scripts
data:
  run.sh: |
    #!/bin/bash
    echo "Doing some work here..."

覆盖配置文件的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)

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM