【问题标题】:Adjusting Kubernetes configurations depending on environment根据环境调整 Kubernetes 配置
【发布时间】:2018-05-19 05:12:39
【问题描述】:

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

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

我希望能够更改副本的数量、使用本地安装的卷并进行其他细微的更改,而不必编写不可避免地相互分离的单独模板文件。

【问题讨论】:

  • 看看helm。您可以使用它为 k8s 捆绑模板并在部署时填充它们。

标签: kubernetes kubectl minikube


【解决方案1】:

头盔

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

Helmenvbsubst 等更简单的解决方案相比的另一个优势是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 强烈建议永远不会添加该功能,而是由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/

【讨论】:

    【解决方案2】:

    我希望有人能给我一个更好的答案,但与此同时,您可以通过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
    

    最后的破折号是必需的。当然,这并不能解决卷的问题,但它有一点帮助。您可以编写一个脚本/makefile 来为环境自动执行此操作。

    【讨论】:

      猜你喜欢
      • 2018-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      • 2017-07-09
      • 2021-01-17
      • 1970-01-01
      相关资源
      最近更新 更多