根据环境调整 Kubernetes 配置

Adjusting Kubernetes configurations depending on environment

我想在 kubernetes 模板文件中描述我的服务。是否可以参数化数字或 replicas 等值,以便我可以在部署时进行设置。

这里的目标是能够 运行 我在 minikube 本地的服务(我只需要一个副本)并且让它们尽可能接近那些 运行ning 在 staging/live尽可能。

我希望能够更改副本数、使用本地安装的卷并进行其他小的更改,而不必编写不可避免地彼此不同的单独模板文件。

我希望有人能给我一个更好的答案,但与此同时,您可以通过 envsubst 提供您的配置(参见 gettextthis 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 强烈建议永远不会添加该功能,取而代之的是 Helmenvsubst 等外部工具来管理模板。


(编辑)

自定义

Kustomize是google开发的新项目,和helm很像。基本上你有 2 个文件夹 baseoverlays。然后,您 运行 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 更简单且开销更少,但没有用于管理机密的插件。您可以将 kustomizesopsenvsubst 结合使用来管理机密。

https://kubernetes.io/blog/2018/05/29/introducing-kustomize-template-free-configuration-customization-for-kubernetes/