使用环境变量
您的应用程序将数据作为环境变量获取会很方便。
环境变量来自ConfigMap
对于非敏感数据,您可以将变量存储在 a 中ConfigMap
,然后使用ConfigMap
数据定义容器环境变量。
来自 Kubernetes 文档的示例:
创建第ConfigMap
一个。文件configmaps.yaml
:
apiVersion: v1
kind: ConfigMap
metadata:
name: special-config
namespace: default
data:
special.how: very
---
apiVersion: v1
kind: ConfigMap
metadata:
name: env-config
namespace: default
data:
log_level: INFO
创建 ConfigMap:
kubectl create -f ./configmaps.yaml
Pod
然后在规范中定义环境变量, pod-multiple-configmap-env-variable.yaml
:
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "env" ]
env:
- name: SPECIAL_LEVEL_KEY
valueFrom:
configMapKeyRef:
name: special-config
key: special.how
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: env-config
key: log_level
restartPolicy: Never
创建Pod
:
kubectl create -f ./pod-multiple-configmap-env-variable.yaml
现在在您的控制器中,您可以读取这些环境变量SPECIAL_LEVEL_KEY
(这将为您提供special.how
来自 的值special-config
ConfigMap
)和LOG_LEVEL
(这将为您提供log_level
来自 的值env-config
ConfigMap
):
例如:
specialLevelKey := os.Getenv("SPECIAL_LEVEL_KEY")
logLevel := os.Getenv("LOG_LEVEL")
fmt.Println("SPECIAL_LEVEL_KEY:", specialLevelKey)
fmt.Println("LOG_LEVEL:", logLevel)
环境变量来自Secret
如果您的数据是敏感数据,您可以将其存储在 a 中Secret
,然后将其Secret
用作环境变量。
要Secret
手动创建:
您首先需要使用base64
.
# encode username
$ echo -n 'admin' | base64
YWRtaW4=
# encode password
$ echo -n '1f2d1e2e67df' | base64
MWYyZDFlMmU2N2Rm
Secret
然后用上面的数据创建一个:
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
创建Secret
一个kubectl apply
:
$ kubectl apply -f ./secret.yaml
请注意,还有其他方法可以创建秘密,请选择最适合您的方法:
现在你可以使用这个Secret
为环境变量创建的。
要在 Pod 的环境变量中使用密钥:
- 创建一个秘密或使用现有的秘密。多个 Pod 可以引用同一个 secret。
- 修改您希望使用密钥值的每个容器中的 Pod 定义,以便为您希望使用的每个密钥添加环境变量。使用密钥的环境变量应填充密钥的名称和密钥
env[].valueFrom.secretKeyRef
。
- 修改您的图像和/或命令行,以便程序在指定的环境变量中查找值。
这是Pod
Kubernetes 文档中的一个示例,展示了如何使用Secret
环境变量:
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: mycontainer
image: redis
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
restartPolicy: Never
最后,如文档中所述:
在使用环境变量中的秘密的容器内,秘密密钥显示为包含秘密数据的 base64 解码值的普通环境变量。
现在在您的控制器中,您可以读取这些环境变量SECRET_USERNAME
(这将为您提供username
来自 的值mysecret
Secret
)和SECRET_PASSWORD
(这将为您提供password
来自 的值mysecret
Secret
):
例如:
username := os.Getenv("SECRET_USERNAME")
password := os.Getenv("SECRET_PASSWORD")
使用卷
您还可以将两者都挂载ConfigMap
到Secret
您的 Pod 中。
使用存储在 ConfigMap 中的数据填充卷:
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "ls /etc/config/" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
# Provide the name of the ConfigMap containing the files you want
# to add to the container
name: special-config
restartPolicy: Never
使用 Secrets 作为来自 Pod 的文件:
要在 Pod 的卷中使用 Secret:
- 创建一个秘密或使用现有的秘密。多个 Pod 可以引用同一个 secret。
- 修改您的 Pod 定义以在 .spec.volumes[] 下添加一个卷。将卷命名为任何名称,并有一个 .spec.volumes[].secret.secretName 字段等于 Secret 对象的名称。
.spec.containers[].volumeMounts[]
向需要密钥的每个容器添加一个。指定.spec.containers[].volumeMounts[].readOnly = true
和.spec.containers[].volumeMounts[].mountPath
到您希望秘密出现的未使用目录名称。修改您的图像或命令行,以便程序在该目录中查找文件。data
秘密映射中的每个密钥都成为mountPath
.
Pod
在卷中安装 a的示例Secret
:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret