跳到主要内容

mysql的pod

yaml优化

思考:为什么要优化

yaml的环境变量中存在敏感信息(账号、密码),存在安全隐患

为什么要统一管理环境变量

  • 环境变量中有很多敏感的信息,比如账号密码,直接暴漏在yaml文件中存在安全性问题
  • 对于开发、测试、生产环境,由于配置均不同,每套环境部署的时候都要修改yaml,带来额外的开销
ConfigMap和Secret

k8s提供两类资源,configMapSecret,可以用来实现业务配置的统一管理, 允许将配置文件与镜像文件分离,以使容器化的应用程序具有可移植性 。

  • 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;
    • Opaquebase64编码格式的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即可。但是注意configmapsecret不能跨namespace使用,且更新后,pod内的env不会自动更新,重建后方可更新。