第38期 - kuztomize生成configmap与Secret
kustomize管理Secret & Configmap ![](image-128.png)在本指南中,我们将了解如何使用 Kustomize 生成 Kubernetes Configmap 和 Secrets。
如果你是 Kustomize 的新手,请查看 Kustomize 教程以学习基础知识。
Configmap & Secret Generator 用例
在研究 secret/config 生成器的工作原理之前,让我们先了解一下它解决了什么问题。
当你将附加到 Pod 的 configmap 更新为卷时,configmap 数据会自动传播到 Pod。但是,在以下情况下,Pod 不会在 configmap 中获取最新数据。
- 如果 Pod 从 configmap 获取环境变量。
- 如果使用子路径将 configmap 挂载为卷。
在上述情况下,Pod 将继续使用旧的 configmap 数据,直到我们重新启动 Pod。因为 Pod 不知道 configMap 中发生了什么变化。
本质上,来自 ConfigMap 的数据(例如属性、环境变量等)在应用程序启动期间被使用。因此,即使更新的 configmap 数据被投影到 Pod,如果在 Pod 中运行的应用程序没有任何热重载机制,你也必须重新启动 Pod 才能进行更改。
我们有哪些选项来解决这个问题?
- 你可以使用 Reloader Controller。
- 使用 Kustomize ConfigMap 生成器
如果你已经使用 Kustomize 进行 Kubernetes 部署或计划使用它,则无需任何额外的控制器来处理 Configmap 的推出。
Kustomize Configmap & Secret 生成器
以下是 Kustoimize Configmap/Secret 生成器的工作原理。
- Kustomize 生成器会创建一个 configMap 和 Secret,并在末尾使用唯一的名称 (hash)。例如,如果 configmap 的名称为 app-configmap,则生成的 configmap 的名称为 app-configmap-7b58b6ct6d。这里 7b58b6ct6d 是附加的哈希值。
- 如果你更新 configmap/Secret,它将创建一个同名的新 configMap/Secret,但末尾具有不同的哈希值(随机字符集)。
- Kustomize 将使用新的 configmap 名称自动更新 Deployment。
- 当 Kustomize 更新 Deployment 时,将触发推出,应用程序在 Pod 上运行并获取更新的 configmap/secret 数据。这样,我们就不需要重新部署或重新启动部署。
下图显示了 Configmap 创建和更新工作流,其中在创建和更新阶段的哈希发生了变化。
以下是你应该了解的有关 Kustomize 生成器的要点。
- 由于 Kustomize 在每次更新时都会创建一个新的 configmap,因此你需要对旧的孤立 Configmap 进行垃圾回收。如果你为命名空间设置了资源配额限制,则孤立的 Configmap 可能是一个问题。或者,你应该在 kubectl apply 命令中使用带有标签的 –prune 标志。此外,ArgoCD 等 GitOps 工具提供了孤立资源监控机制。
- 你可以使用该标志来禁用在每次更新时创建新的 Configmap,但它不会触发 Pod 推出。你需要手动触发 Pod 的推出才能获取最新的 configmap 数据。或者,在 Pod 中运行的应用程序应该具有热重载机制。disableNameSuffixHash: true
现在让我们看看如何使用 Configmap 和 Secret Generators。
使用 Kustomize 生成 Configmap
我们将看一个 Nginx 示例,其中它使用 configmap 内容作为其index.html
注意:base YAML 和 overlay YAML 是 Kustomize Github 存储库的一部分。克隆存储库以按照本教程进行操作
下面是存储库的文件结构。为了了解生成器,我们将使用 generators overlay 文件夹。
├── base
│ ├── deployment.yaml
│ ├── kustomization.yaml
│ └── service.yaml
└── overlays
├── dev
│ ├── deployment-dev.yaml
│ ├── kustomization.yaml
│ └── service-dev.yaml
├── generators
│ ├── deployment.yaml
│ ├── files
│ │ └── index.html
│ ├── kustomization.yaml
│ └── service.yaml
└── prod
├── deployment-prod.yaml
├── kustomization.yaml
└── service-prod.yaml
generators/deployment.yaml
下面是覆盖 nginx deployment.yaml,它使用名为 index-html-configmap 的 configmap,该 configmap 挂载为卷和 env 变量,该变量派生自名为 endpoint-configmap 的 configmap。我以粗体突出显示了配置。
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
spec:
replicas: 3
template:
spec:
containers:
- name: nginx
resources:
limits:
cpu: "200m"
memory: "256Mi"
requests:
cpu: "100m"
memory: "128Mi"
env:
- name: ENDPOINT
valueFrom:
configMapKeyRef:
name: endpoint-configmap
key: endpoint
volumeMounts:
- name: nginx-index-file
mountPath: /usr/share/nginx/html/
volumes:
- name: nginx-index-file
configMap:
name: index-html-configmap
files/index.html
我们在 files 目录下的 index.html 文件中有 configmap 文件内容
<html>
<h1>Welcome</h1>
</br>
<h1>Hi! This is the Configmap Index file </h1>
</html
generators/kustomization.yaml
configmap 生成选项应添加到 configMapGenerator 字段下的 kustomization.yaml 文件中。
在此示例中,我们将生成两种类型的 Configmap。
- Configmap 来自将挂载到 nginx /usr/share/nginx/html/ 目录的文件 (index.html)。
- Configmap 的 Configmap 中,它将设置一个名为 ENDPOINTS 的环境变量
在 generatorOptions 字段下,可以添加需要添加到 Configmap 中的常用标签。
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
patches:
- path: deployment.yaml
- path: service.yaml
generatorOptions:
labels:
app: web-service
configMapGenerator:
- name: index-html-configmap
behavior: create
files:
- files/index.html
- name: endpoint-configmap
literals:
- endpoint="api.example.com/users"
让我们使用 Kustomize 运行部署。
kustomize build overlays/generators | k apply -f -
现在,如果你列出 Configmap,则可以看到两个 Configmap 创建时,它们的名称后附加了一个哈希值,如下所示。
kubectl get cm
由于部署具有 NodePort 服务,因此你可以访问 Nginx 网页,该网页显示了 Configmap 中的内容,如下所示。
此外,如果你登录到 Pod 并回显 ENDPOINT 环境变量,你将看到 configmap 中的数据,如下所示。
现在,要通过生成器测试 configmap 更新,让我们将 index.html 数据更新为以下内容。
<html>
<h1>Welcome</h1>
</br>
<h1>Hi! This is the Updated Configmap Index file </h1>
</html
让我们使用以下命令更新部署。
kustomize build overlays/generators | k apply -f -
现在,如果你列出 Configmap,你将看到两个索引 Configmap,如下所示。这是因为,对于每个 configmap 更新,Kustomize 都会创建一个新的 configmap。
如果要修剪孤立的 Configmap,请使用带有 configmap 标签的 –prune 标志,如下所示。该标志指示 Kustomize 从最终输出中删除不再引用或不需要的任何资源。—prune
kustomize build overlays/generators | kubectl apply --prune -l app=web-service -f -
现在,由于 Kustomize 创建了新的 configmap,部署会触发推出,nginx 将使用更新的 configmap。如果你检查 Nginx NodePort 服务,你将看到更新的索引页面。
接下来,我们将看看如何禁用 Hashed configmap。
禁用 Hashed ConfigMap
如果你不想使用 ConfigMap 生成器创建哈希 Configmap,可以通过在 generatorOptions 下将 disableNameSuffixHash 标志设置为 true 来禁用它。它将禁用 kustomization.yaml 文件中提到的所有 Configmap 的哈希值。
下面是一个示例。
generatorOptions:
labels:
app: web-service
disableNameSuffixHash: true
注意:如果禁用 Configmap 哈希,则需要手动重启 Pod,以便应用程序使用 configmap 数据。
使用 Kustomize 生成密钥
你可以像生成 Configmap 一样生成密钥。
要生成密钥,你需要使用 secretGenerator 字段。
以下是从文件生成 secret 对象的示例。
secretGenerator:
- name: nginx-secret
files:
- files/secret.txt
如果要从文本生成密钥,请使用以下格式。
secretGenerator:
- name: nginx-api-password
literals:
- password="myS3cret"
你可以根据需要将密钥挂载为卷或将其作为环境变量传播。
结论
在这篇博客中,我们研究了,
- 使用 Kustomize 生成器生成 Configmap 和 secret。
- 与孤立的 Configmap 相关的 Configmap 生成器注意事项。
- 实现 Kustomize Configmap 生成器的实际示例。