具有共享环境变量的 K8S 部署
K8S deployments with shared environment variables
我们有一组部署(pods 组)都使用相同的 docker 映像。示例:
- 网络api
- 网络管理员
- 网络任务工作节点
- 数据任务工作节点
- ...
它们都需要一组通用的环境变量,例如数据库主机的位置,外部服务的密钥等。它们还有一组不通用的环境变量。
有没有什么地方可以:
- 重复使用定义了环境变量的模板
- 从文件加载环境变量并在 pods
上设置它们
最佳解决方案是命名空间感知的解决方案,因为我们使用 kubernetes 命名空间将测试、阶段和生产环境分开。
类似于 dockers env_file 的东西会很好。但是我找不到与此相关的任何示例或参考。我唯一能找到的是通过 secrets 设置 env,但这并不干净,过于冗长,因为我仍然需要为每个部署编写所有环境变量。
您可以 create a ConfigMap 使用所有常见的 key:value
对环境变量。
然后你可以重用configmap将configMap
的所有值声明为Deployment
中的环境。
这是取自 kubernetes official docs 的示例。
创建一个包含多个键值对的 ConfigMap。
apiVersion: v1
kind: ConfigMap
metadata:
name: special-config
namespace: default
data:
SPECIAL_LEVEL: very
SPECIAL_TYPE: charm
使用envFrom将ConfigMap的所有数据定义为Pod环境变量。来自 ConfigMap 的键成为 Pod 中的环境变量名称。
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "env" ]
envFrom:
- configMapRef:
name: special-config # All the key-value pair will be taken as environment key-value pair
env:
- name: uncommon
value: "uncommon value"
restartPolicy: Never
您可以在 env
字段中指定不常见的环境变量。
现在,要验证环境变量是否实际可用,请查看日志。
$ kubectl logs -f test-pod
KUBERNETES_PORT=tcp://10.96.0.1:443
SPECIAL_LEVEL=very
uncommon=uncommon value
SPECIAL_TYPE=charm
...
到这里,可以看到提供的环境都可用了
您可以先添加一个秘密,然后将新创建的秘密使用到您无数的部署文件中,以共享具有以下值的相同环境变量:
kubectl create secret generic jwt-secret --from-literal=JWT_KEY=my_awesome_jwt_secret_code
apiVersion: apps/v1
kind: Deployment
metadata:
name: auth-depl
spec:
replicas: 1
selector:
matchLabels:
app: auth
template:
metadata:
labels:
app: auth
spec:
containers:
- name: auth
image: lord/auth
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"
env:
- name: JWT_KEY
valueFrom:
secretKeyRef:
name: jwt-secret
key: JWT_KEY
process.env.JWT_KEY
apiVersion: apps/v1
kind: Deployment
metadata:
name: tickets-depl
spec:
replicas: 1
selector:
matchLabels:
app: tickets
template:
metadata:
labels:
app: tickets
spec:
containers:
- name: tickets
image: lord/tickets
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"
env:
- name: JWT_KEY
valueFrom:
secretKeyRef:
name: jwt-secret
key: JWT_KEY
process.env.JWT_KEY
我们有一组部署(pods 组)都使用相同的 docker 映像。示例:
- 网络api
- 网络管理员
- 网络任务工作节点
- 数据任务工作节点
- ...
它们都需要一组通用的环境变量,例如数据库主机的位置,外部服务的密钥等。它们还有一组不通用的环境变量。
有没有什么地方可以:
- 重复使用定义了环境变量的模板
- 从文件加载环境变量并在 pods 上设置它们
最佳解决方案是命名空间感知的解决方案,因为我们使用 kubernetes 命名空间将测试、阶段和生产环境分开。
类似于 dockers env_file 的东西会很好。但是我找不到与此相关的任何示例或参考。我唯一能找到的是通过 secrets 设置 env,但这并不干净,过于冗长,因为我仍然需要为每个部署编写所有环境变量。
您可以 create a ConfigMap 使用所有常见的 key:value
对环境变量。
然后你可以重用configmap将configMap
的所有值声明为Deployment
中的环境。
这是取自 kubernetes official docs 的示例。
创建一个包含多个键值对的 ConfigMap。
apiVersion: v1
kind: ConfigMap
metadata:
name: special-config
namespace: default
data:
SPECIAL_LEVEL: very
SPECIAL_TYPE: charm
使用envFrom将ConfigMap的所有数据定义为Pod环境变量。来自 ConfigMap 的键成为 Pod 中的环境变量名称。
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "env" ]
envFrom:
- configMapRef:
name: special-config # All the key-value pair will be taken as environment key-value pair
env:
- name: uncommon
value: "uncommon value"
restartPolicy: Never
您可以在 env
字段中指定不常见的环境变量。
现在,要验证环境变量是否实际可用,请查看日志。
$ kubectl logs -f test-pod
KUBERNETES_PORT=tcp://10.96.0.1:443
SPECIAL_LEVEL=very
uncommon=uncommon value
SPECIAL_TYPE=charm
...
到这里,可以看到提供的环境都可用了
您可以先添加一个秘密,然后将新创建的秘密使用到您无数的部署文件中,以共享具有以下值的相同环境变量:
kubectl create secret generic jwt-secret --from-literal=JWT_KEY=my_awesome_jwt_secret_code
apiVersion: apps/v1
kind: Deployment
metadata:
name: auth-depl
spec:
replicas: 1
selector:
matchLabels:
app: auth
template:
metadata:
labels:
app: auth
spec:
containers:
- name: auth
image: lord/auth
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"
env:
- name: JWT_KEY
valueFrom:
secretKeyRef:
name: jwt-secret
key: JWT_KEY
process.env.JWT_KEY
apiVersion: apps/v1
kind: Deployment
metadata:
name: tickets-depl
spec:
replicas: 1
selector:
matchLabels:
app: tickets
template:
metadata:
labels:
app: tickets
spec:
containers:
- name: tickets
image: lord/tickets
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"
env:
- name: JWT_KEY
valueFrom:
secretKeyRef:
name: jwt-secret
key: JWT_KEY
process.env.JWT_KEY