mysql的pod
yaml优化
思考:为什么要优化
yaml
的环境变量中存在敏感信息(账号、密码),存在安全隐患
为什么要统一管理环境变量
- 环境变量中有很多敏感的信息,比如账号密码,直接暴漏在yaml文件中存在安全性问题
- 对于开发、测试、生产环境,由于配置均不同,每套环境部署的时候都要修改yaml,带来额外的开销
ConfigMap和Secret
k8s提供两类资源,configMap
和Secret
,可以用来实现业务配置的统一管理, 允许将配置文件与镜像文件分离,以使容器化的应用程序具有可移植性 。
-
configMap
,通常用来管理应用的配置文件或者环境变量apiVersion: v1
kind: ConfigMap
metadata:
name: eladmin
namespace: luffy
data:
DB_HOST: "10.99.14.241"
DB_USER: "root"
REDIS_HOST: "10.105.226.34"
REDIS_PORT: "6379"创建并查看
configmap
:$ kubectl create -f configmap.yaml
$ kubectl -n luffy get configmap eladmin -oyaml
或者可以使用命令的方式,从文件中创建,比如:
$ cat env-configs.txt
DB_HOST=10.99.14.241
REDIS_HOST=10.105.226.34
REDIS_PORT=6379
$ kubectl -n luffy create configmap eladmin --from-env-file=env-configs.txt
-
Secret,管理敏感类的信息,默认会base64编码存储,有三种类型
Service Account
:用来访问Kubernetes API
,由Kubernetes
自动创建,并且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount
目录中;创建ServiceAccount
后,Pod中指定serviceAccount
后,自动创建该ServiceAccount
对应的secret;Opaque
:base64
编码格式的Secret
,用来存储密码、密钥等;kubernetes.io/dockerconfigjson
:用来存储私有docker registry
的认证信息。
cat env-secret.txt
DB_PWD=luffyAdmin!
DB_USER=root
kubectl -n luffy create secret generic eladmin-secret --from-env-file=env-secret.txt
kubectl -n luffy get secret也可以通过如下方式:
apiVersion: v1
kind: Secret metadata: name: eladmin-secret namespace: luffy type: Opaque data: DB_USER: cm9vdA== #注意加-n参数, echo -n root|base64 DB_PWD: bHVmZnlBZG1pbiE=
###### 从配置中引用环境变量
```yaml
# mysql的pod
...
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_DATABASE # 指定数据库地址
value: "eladmin"
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: eladmin-secret
key: DB_PWD
ports:
- containerPort: 3306
...
# eladmin-api的yaml
...
containers:
- name: eladmin-api
image: 172.21.65.226:5000/eladmin/eladmin-api:v1
env:
- name: DB_HOST # 指定数据库地址
valueFrom:
configMapKeyRef:
name: eladmin
key: DB_HOST
- name: DB_USER # 指定数据库连接使用的用户
valueFrom:
secretKeyRef:
name: eladmin-secret
key: DB_USER
- name: DB_PWD
valueFrom:
secretKeyRef:
name: eladmin-secret
key: DB_PWD
- name: REDIS_HOST
valueFrom:
configMapKeyRef:
name: eladmin
key: REDIS_HOST
- name: REDIS_PORT
valueFrom:
configMapKeyRef:
name: eladmin
key: REDIS_PORT
ports:
- containerPort: 8000
...
在部署不同的环境时,pod的yaml无须再变化,只需要在每套环境中维护一套ConfigMap和Secret
即可。但是注意configmap
和secret
不能跨namespace
使用,且更新后,pod内的env不会自动更新,重建后方可更新。