头盔
Helm 正在成为模板化 Kubernetes 部署的标准。 helm chart 是由带有 golang 变量占位符的 yaml 文件组成的目录
---
kind: Deployment
metadata:
name: foo
spec:
replicas: {{ .Values.replicaCount }}
您在“values.yaml”文件中定义“值”的默认值
replicaCount: 1
您可以选择使用--set 命令行覆盖该值
helm install foo --set replicaCount=42
Helm 也可以指向外部应答文件
helm install foo -f ./dev.yaml
helm install foo -f ./prod.yaml
dev.yaml
---
replicaCount: 1
prod.yaml
---
replicaCount: 42
Helm 与envbsubst 等更简单的解决方案相比的另一个优势是Helm 支持插件。一个强大的插件是helm-secrets 插件,它允许您使用 pgp 密钥加密敏感数据。 https://github.com/futuresimple/helm-secrets
如果使用helm + helm-secrets,您的设置可能如下所示,其中您的代码在一个存储库中,而您的数据在另一个存储库中。
带有 helm 图表的 git repo
stable
|__mysql
|__Values.yaml
|__Charts
|__apache
|__Values.yaml
|__Charts
incubator
|__mysql
|__Values.yaml
|__Charts
|__apache
|__Values.yaml
|__Charts
然后在另一个包含环境特定数据的 git repo 中
values
|__ mysql
|__dev
|__values.yaml
|__secrets.yaml
|__prod
|__values.yaml
|__secrets.yaml
然后你有一个引用值和秘密文件的包装脚本
helm secrets upgrade foo --install -f ./values/foo/$environment/values.yaml -f ./values/foo/$environment/secrets.yaml
envsubst
正如其他答案中提到的,envsubst 是一种非常强大且简单的方法来制作您自己的模板。来自kiminehart的示例
apiVersion: extensions/v1beta1
kind: Deployment
# ...
architecture: ${GOOS}
GOOS=amd64 envsubst < mytemplate.tmpl > mydeployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
# ...
architecture: amd64
Kubectl
有一个feature request 允许kubectl 执行一些与helm 相同的功能并允许变量替换。有一个background document 强烈建议永远不会添加该功能,而是由Helm 和envsubst 等外部工具来管理模板。
(编辑)
自定义
Kustomize是google开发的一个新项目,和helm很像。基本上你有 2 个文件夹 base 和 overlays。然后运行kustomize build someapp/overlays/production,它将为该环境生成 yaml。
someapp/
├── base/
│ ├── kustomization.yaml
│ ├── deployment.yaml
│ ├── configMap.yaml
│ └── service.yaml
└── overlays/
├── production/
│ └── kustomization.yaml
│ ├── replica_count.yaml
└── staging/
├── kustomization.yaml
└── cpu_count.yaml
它比 helm 更简单且开销更少,但没有用于管理机密的插件。您可以将kustomize 与sops 或envsubst 结合使用来管理机密。
https://kubernetes.io/blog/2018/05/29/introducing-kustomize-template-free-configuration-customization-for-kubernetes/