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

时间:2018-07-01 15:00:24

标签: deployment kubernetes manifest

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

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

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

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

1 个答案:

答案 0 :(得分:3)

  

如何在K8S中做到最好?

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

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

这是我们在gitlab Runner上使用的示例的摘录:

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)

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

configMaps

播放hostPath中的单个或多个文件可以产生所需的结果,并且根据您的需要,您可以拥有任意多个。

  

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

在k8s中,等效值是icacls %WINDIR%\Temp /t /c /grant IIS_IUSRS:(OI)(CI)M icacls %WINDIR%\System32\config\systemprofile\AppData\Local /t /c /grant IIS_IUSRS:(OI)(CI)M ,但随后会严重妨碍k8s将Pod调度到不同节点的能力。如果您具有单节点群集(或在开发过程中)以简化配置文件的更改,则可以这样做,但建议针对上述方法的实际部署。

相关问题