在 GKE 上管理多环境 Kubernetes 应用程序?
Manage multi-environment Kubernetes application on GKE?
我们正在从头开始一个项目,该项目将在 Google 云服务上进行管理。我想使用 Google Kubernetes Engine。我们的应用程序将有多个环境(Dev、Staging、Production)。每个环境都设置为 Google Cloud 上的新项目。
我不清楚的是如何参数化我们的 service/manifest 文件。例如我们下面的部署文件,我想从每个环境的变量列表中提取 {}
中的任何内容。在之前的 post 中有人提到使用 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 进行基础设施管理,但是否有更大的包装器可用于为每个环境设置参数?
Helm 和 kustomize 都适用于此。对于 helm,您将拥有单独的 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
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 .
或从环境变量和命令行参数动态自定义值:
export CUSTOM_env=production
ytt -f . \
--data-value max_surge=10 \
--data-value gcr_image_url=some/image:1.0 \
--data-values-env CUSTOM
我们正在从头开始一个项目,该项目将在 Google 云服务上进行管理。我想使用 Google Kubernetes Engine。我们的应用程序将有多个环境(Dev、Staging、Production)。每个环境都设置为 Google Cloud 上的新项目。
我不清楚的是如何参数化我们的 service/manifest 文件。例如我们下面的部署文件,我想从每个环境的变量列表中提取 {}
中的任何内容。在之前的 post 中有人提到使用 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 进行基础设施管理,但是否有更大的包装器可用于为每个环境设置参数?
Helm 和 kustomize 都适用于此。对于 helm,您将拥有单独的 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
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 .
或从环境变量和命令行参数动态自定义值:
export CUSTOM_env=production
ytt -f . \
--data-value max_surge=10 \
--data-value gcr_image_url=some/image:1.0 \
--data-values-env CUSTOM