七、Secret、ConfigMap详解
secret用途
保存镜像仓库账号信息
保存数字证书(比如https证书)
保存通用的敏感数据,例如用户名密码
加密数据实际还是存放在Etcd中,让Pod的容器以挂载Volume方式访问。
可通过kubectl get secret查看
将证书保存至secret:kubectl create secret tls blog-ctnrs-com --cert=blog.ctnrs.com.pem --key=blog.ctnrs-key.pem
Pod使用secret的两种方式
变量注入
挂载
secret.yaml文件及Pod使用secret文件
echo -n 'admin' | base64 YWRtaW4= echo -n '1f2d1e2e67df' | base64 MWYyZDFlMmU2N2Rm --------------------------------------------------------- # secret.yaml文件 apiVersion: v1 kind: Secret metadata: name: mysecret # 通用类型 type: Opaque data: # 通过base64加密后的用户名和密码,以key|value形式 username: YWRtaW4= password: MWYyZDFlMmU2N2Rm --------------------------------------------------------------------------- # 以变量的方式给pod注入secret apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: nginx image: nginx # 定义变量 env: # 变量名称:变量值 - name: SECRET_USERNAME # 表示变量值来自于secret valueFrom: secretKeyRef: # secret的名称 name: mysecret # secret.yaml文件中的key key: username - name: SECRET_PASSWORD valueFrom: secretKeyRef: name: mysecret key: password # 设置完之后进入容器可以打印这两个变量,具体运行还是要看场景需求 # echo $SECRET_USERNAME # echo $SECRET_PASSWORD --------------------------------------------------------------------------- # 以数据卷的形式给pod注入secret apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: nginx image: nginx # 将foo数据卷挂载到对应的目录 volumeMounts: - name: foo mountPath: "/etc/foo" readOnly: true # 数据卷来源 volumes: - name: foo # secret的名称 secret: secretName: mysecret # cat /etc/foo/username # cat /etc/foo/password
ConfigMap
与Secret类似,区别在于ConfigMap保存的是不需要加密配置信息。
可通过kubectl get cm查看
应用程序如何动态更新配置?
当ConfigMap发生变更时,应用程序会动态加载的方案
1、inotify(可以动态检查文件) 检查文件是否变动 ->但需要重启应用 (sidecar)
2、与版本迭代一起
3、进行热加载,需要程序有这块逻辑支持(比如加if判断。如果配置=1,则重启应用)
4、采用统一配置中心,应用程序自己去读取,例如apollo、disconf (与方法3类似)
5、触发滚动更新,即重启服务
ConfigMap.yaml文件及Pod使用ConfigMap文件
# ConfigMap文件 apiVersion: v1 kind: ConfigMap metadata: name: myconfig namespace: default # 以键值对方式存储,如果是数字,需要有双引号 data: special.level: info special.type: hello --------------------------------------------------------------------------- # 以变量的方式给pod注入ConfigMap apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: busybox image: busybox # 启动pod需要运行的命令,调用下面的变量 command: [ "/bin/sh", "-c", "echo $(LEVEL) $(TYPE)" ] env: - name: LEVEL # 变量来自ConfigMap valueFrom: configMapKeyRef: # ConfigMap的name name: myconfig key: special.level - name: TYPE valueFrom: configMapKeyRef: name: myconfig key: special.type restartPolicy: Never --------------------------------------------------------------------------- # ConfigMap一般用来保存配置文件内容 apiVersion: v1 kind: ConfigMap metadata: name: redis-config data: # | 竖杠表示下面可以内容块 redis.properties: | redis.host=127.0.0.1 redis.port=6379 redis.password=123456 --------------------------------------------------------------------------- # 以数据卷的形式给pod注入ConfigMap apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: busybox image: busybox command: [ "/bin/sh","-c","cat /etc/config/redis.properties" ] volumeMounts: - name: config-volume # 挂载到/etc/config目录下 mountPath: /etc/config # 数据卷来自于ConfigMap volumes: - name: config-volume configMap: name: redis-config restartPolicy: Never
浙公网安备 33010602011771号