根据环境调整 Kubernetes 配置
Adjusting Kubernetes configurations depending on environment
我想在 kubernetes 模板文件中描述我的服务。是否可以参数化数字或 replicas
等值,以便我可以在部署时进行设置。
这里的目标是能够 运行 我在 minikube 本地的服务(我只需要一个副本)并且让它们尽可能接近那些 运行ning 在 staging/live尽可能。
我希望能够更改副本数、使用本地安装的卷并进行其他小的更改,而不必编写不可避免地彼此不同的单独模板文件。
我希望有人能给我一个更好的答案,但与此同时,您可以通过 envsubst
提供您的配置(参见 gettext
和 this for mac)。
示例配置,text.yaml:
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: test
spec:
replicas: ${NUM_REPLICAS}
...
然后运行:
$ NUM_REPLICAS=2 envsubst < test.yaml | kubectl apply -f -
deployment "test" configured
最后的破折号是必需的。这当然不能解决卷的问题,但它有一点帮助。您可以编写一个 script/makefile 来针对环境自动执行此操作。
头盔
Helm 正在成为模板化 kubernetes 部署的标准。 helm chart 是由带有 golang 变量占位符的 yaml 文件组成的目录
---
kind: Deployment
metadata:
name: foo
spec:
replicas: {{ .Values.replicaCount }}
你在'values.yaml'文件中定义了一个'value'的默认值
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
,您的设置可能如下所示,其中您的代码在一个存储库中,而您的数据在另一个存储库中。
git 带有 helm 图表的 repo
stable
|__mysql
|__Values.yaml
|__Charts
|__apache
|__Values.yaml
|__Charts
incubator
|__mysql
|__Values.yaml
|__Charts
|__apache
|__Values.yaml
|__Charts
然后在另一个包含环境特定数据的 git 存储库中
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 to allow kubectl
to do some of the same features of helm and allow for variable substitution. There is a 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
结合使用来管理机密。
我想在 kubernetes 模板文件中描述我的服务。是否可以参数化数字或 replicas
等值,以便我可以在部署时进行设置。
这里的目标是能够 运行 我在 minikube 本地的服务(我只需要一个副本)并且让它们尽可能接近那些 运行ning 在 staging/live尽可能。
我希望能够更改副本数、使用本地安装的卷并进行其他小的更改,而不必编写不可避免地彼此不同的单独模板文件。
我希望有人能给我一个更好的答案,但与此同时,您可以通过 envsubst
提供您的配置(参见 gettext
和 this for mac)。
示例配置,text.yaml:
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: test
spec:
replicas: ${NUM_REPLICAS}
...
然后运行:
$ NUM_REPLICAS=2 envsubst < test.yaml | kubectl apply -f -
deployment "test" configured
最后的破折号是必需的。这当然不能解决卷的问题,但它有一点帮助。您可以编写一个 script/makefile 来针对环境自动执行此操作。
头盔
Helm 正在成为模板化 kubernetes 部署的标准。 helm chart 是由带有 golang 变量占位符的 yaml 文件组成的目录
---
kind: Deployment
metadata:
name: foo
spec:
replicas: {{ .Values.replicaCount }}
你在'values.yaml'文件中定义了一个'value'的默认值
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
,您的设置可能如下所示,其中您的代码在一个存储库中,而您的数据在另一个存储库中。
git 带有 helm 图表的 repo
stable
|__mysql
|__Values.yaml
|__Charts
|__apache
|__Values.yaml
|__Charts
incubator
|__mysql
|__Values.yaml
|__Charts
|__apache
|__Values.yaml
|__Charts
然后在另一个包含环境特定数据的 git 存储库中
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 to allow kubectl
to do some of the same features of helm and allow for variable substitution. There is a 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
结合使用来管理机密。