0 deployment manifest kubernetes
在 K8S 中,在部署时在容器(POD)中执行一次脚本的最佳方法是什么,该脚本从属于部署一部分的配置文件中读取并作为 mongodb 的种子一次?
我的项目由 k8s 清单文件 + 配置文件组成
我希望能够在本地更新配置文件,然后通过 kubectl 或 helm 重新部署
在 docker-compose 中,我可以在配置文件所在的目录创建一个卷 ponting,然后在命令部分执行 bash -c cmds 从卷中的配置文件中读取。在 K8S 中如何最好地完成此操作?我不想通过 dockerfile 将配置文件包含在映像中,这迫使我在通过 kubectl 或 helm 再次重新部署之前重建映像
在 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 调度到不同节点的能力。如果您有单节点集群(或在开发过程中)以简化配置文件的更改,这可能没问题,但对于实际部署,建议使用上述方法。
| 归档时间: |
|
| 查看次数: |
3086 次 |
| 最近记录: |