首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行外壳脚本读取配置数据的K8S部署

执行外壳脚本读取配置数据的K8S部署
EN

Stack Overflow用户
提问于 2018-07-01 15:00:23
回答 1查看 2.4K关注 0票数 0

在K8S中,在部署时执行容器(POD)中的脚本的最佳方法是什么?部署时从作为部署一部分的混合文件中读取脚本,并一次性从seed ex读取脚本?

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

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

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

EN

回答 1

Stack Overflow用户

发布于 2018-07-01 16:31:30

如何在K8S中最好地做到这一点?

剥猫皮有几种方法,但我的建议是:

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

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

代码语言:javascript
复制
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
      ...

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

这类configMap的示例如下:

代码语言:javascript
复制
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-my-scripts
data:
  run.sh: |
    #!/bin/bash
    echo "Doing some work here..."

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

代码语言:javascript
复制
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中处理单个或多个文件可以产生您想要的结果,并且根据您的需要,您可以拥有任意数量或尽可能少的文件。

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

在k8s中,与此等价的是hostPath,但这样会严重妨碍k8s将豆荚调度到不同节点的能力。如果您有单个节点集群(或正在开发中)来简化配置文件的更改,这可能是可以的,但对于实际部署,建议采用上述方法。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51124426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档