在GKE上管理多环境Kubernetes应用程序?

时间:2019-06-10 19:04:38

标签: kubernetes google-kubernetes-engine kubernetes-helm devops-services

我们正在从头开始一个项目,该项目将在Google Cloud Services上进行管理。我想使用Google Kubernetes Engine。我们的应用程序将具有多个环境(开发,分段,生产)。每个环境都设置为Google Cloud上的新项目。

我不清楚如何设置服务/清单文件的参数。例如下面的部署文件,我想从每个环境的变量列表中提取{}中的所有内容。在上一篇文章中,有人提到使用Helm,但是我找不到太多支持这种方式使用Helm的文档。

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: webapp
spec:
  replicas: 1
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: {max-surge}
      maxUnavailable: 0
  selector:
    matchLabels:
      run: webapp
  template:
    metadata:
      labels:
        run: webapp
    spec:
      containers:
      - name: webapp
        image: {gcr-image-url}
        imagePullPolicy: Always
        ports:
        - containerPort: 3000
        env:
        - name: DATABASE_URL
          valueFrom:
            secretKeyRef:
              name: app-secrets
              key: DATABASE_URL
        - name: SECRET_KEY_BASE
          valueFrom:
            secretKeyRef:
              name: app-secrets
              key: SECRET_KEY_BASE

哪些工具可用于管理我的GKE环境?我们将使用terraform进行基础结构管理,但是还是可以使用更大的包装器来为每个环境设置参数吗?

2 个答案:

答案 0 :(得分:2)

Helm会为此而工作,就像kustomize一样。如果是掌舵,您将拥有单独的values.yaml文件(例如dev-values.yaml),例如:

max-surge: 2
gcr-image-url: project-23456/test

然后通过以下方式在Yaml中引用它们:

{{ .Values.max-surge }}

安装时,您将使用helm upgrade --install my-app . --values=dev-values.yaml

答案 1 :(得分:1)

https://get-ytt.io可能是一个解决方案。

尤其是查看this github discussion时,您会注意到可以配置环境,然后以标志或环境变量的形式传递值。

在您的示例中,给出以下config.yml

#@ load("@ytt:data", "data")

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: webapp
  annotations:
    environment: #@ data.values.env
spec:
  replicas: 1
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: #@ data.values.max_surge
      maxUnavailable: 0
  selector:
    matchLabels:
      run: webapp
  template:
    metadata:
      labels:
        run: webapp
    spec:
      containers:
      - name: webapp
        image: #@ data.values.gcr_image_url
        imagePullPolicy: Always
        ports:
        - containerPort: 3000
        env:
        - name: DATABASE_URL
          valueFrom:
            secretKeyRef:
              name: app-secrets
              key: DATABASE_URL
        - name: SECRET_KEY_BASE
          valueFrom:
            secretKeyRef:
              name: app-secrets
              key: SECRET_KEY_BASE

values.yml

#@data/values
---
env: staging
max-surge: 1
gcr-image-url: some/other-image:latest

假设所有内容都在同一目录中,则可以像这样制作config.yml模板:

ytt -f .

或通过env var和命令行参数即时自定义值:

export CUSTOM_env=production
ytt -f . \
  --data-value max_surge=10 \
  --data-value gcr_image_url=some/image:1.0 \
  --data-values-env CUSTOM