kubernetes中pod里边的环境变量非常重要,如何设置一个pod的环境变量呢?
最直接的,我们可以写到pod的定义中,通过env来设定:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
apiVersion: v1 kind: Pod metadata: name: simple-webapp-color spec: containers: - name: simple-webapp-color image: simple-webapp-color ports: - containerPort: 8080 env: - name: APP_COLOR value: pink |
这是最基础的一种方式,我们还可以通过configmap和secret来设定
config 就是一些key : value
我们可以直接通过命令行创建,但是并不常见,我们更多的时候是从文件创建
例如:
1 2 3 4 5 6 7 |
apiVersion: v1 kind: ConfigMap metadata: name: app-config data: APP_COLOR: blue APP_MODE: prod |
创建完成以后我们如何把configmap 和pod联系起来呢?通过envFrom
1 2 3 4 5 6 7 8 9 10 11 12 13 |
apiVersion: v1 kind: Pod metadata: name: simple-webapp-color spec: containers: - name: simple-webapp-color image: simple-webapp-color ports: - containerPort: 8080 envFrom: - configMapRef: name: app-config |
我们可以通过如下命令获取所有的configmap
1 |
kubectl get configmaps |
如上这种方式,envFrom一下导入了所有的env,我们也可以通过其他方式导入部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
apiVersion: v1 kind: Pod metadata: name: simple-webapp-color spec: containers: - name: simple-webapp-color image: simple-webapp-color ports: - containerPort: 8080 env: - name: APP_COLOR valueFrom: configMapKeyRef: name: app-config key: APP_COLOR |
Secret其实和config一样,但是Secret存储的方式是加密的内容,比较适合存放passwd
例如:
1 2 3 4 5 6 7 8 |
apiVersion: v1 kind: Secret metadata: name: app-secret data: DB_Host: bX1zcWw= DB_User: cm9vdA== DB_Password: cGFzd3Jk |
其中,具体的值我们加密过,如何加密呢?
1 2 |
$echo -n 'mysql'|base64 bXlzcWw= |
当然我们也可以反过来解密:
1 |
echo -n "bX1zcWw=" |base64 --decode |
当然我们也可以直接exec进入我们的pod内部通过env 查看已经解密的值
如何和pod建立连接?和configmap一样
1 2 3 4 5 6 7 8 9 10 11 12 13 |
apiVersion: v1 kind: Pod metadata: name: simple-webapp-color spec: containers: - name: simple-webapp-color image: simple-webapp-color ports: - containerPort: 8080 envFrom: - secretRef: name: app-secret |
同样的,这个是整个secret导入,我们也可以导入部分secret
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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 |
我们还可以把secret以文件的形式mount到我们的pod里,例如:
1 |
kubectl create secret generic ssh-key-secret --from-file=ssh-privatekey=/path/to/.ssh/id_rsa --from-file=ssh-publickey=/path/to/.ssh/id_rsa.pub |
先创建一个公钥和私钥的secret
然后在pod中使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
apiVersion: v1 kind: Pod metadata: name: secret-test-pod labels: name: secret-test spec: volumes: - name: secret-volume secret: secretName: ssh-key-secret containers: - name: ssh-test-container image: mySshImage volumeMounts: - name: secret-volume readOnly: true mountPath: "/etc/secret-volume" |
我们的pod在执行以后,就会在如下路径下找到我们的秘钥
1 2 |
/etc/secret-volume/ssh-publickey /etc/secret-volume/ssh-privatekey |
注意一点,如果我们是通过yml创建的,我们的值必须是手动加密的
如果我们是通过命令创建,例如:
1 2 3 |
kubectl create secret generic db-user-pass \ --from-file=./username.txt \ --from-file=./password.txt |
或者
1 2 3 |
kubectl create secret generic db-user-pass \ --from-file=./username.txt \ --from-file=./password.txt |
注意我们有一个generic
而且我们是不需要刻意去加密我们的值的,这样有个问题就是我们的bash在处理特殊字符的时候会有问题,所以注意
1 2 3 |
kubectl create secret generic dev-db-secret \ --from-literal=username=devuser \ --from-literal=password='S!B\*d$zDsb=' |
Latest posts by Zhiming Zhang (see all)
- aws eks node 自动化扩展工具 Karpenter - 8月 10, 2022
- ReplicationController and ReplicaSet in Kubernetes - 12月 20, 2021
- public key fingerprint - 5月 27, 2021