第10章:管理应用程序配置
secret加密数据并存放Etcd中,让Pod的容器以挂载Volume方式访问。
应用场景:凭据、https证书、secret存放docker registry认证信息、存放文件内容或者字符串,例如用户名密码
Pod使用secret两种方式:
-
变量注入
-
挂载
1 创建一个secret用于保存应用程序用到的用户名和密码
创建用户名和密码:
# echo -n 'admin' | base64
YWRtaW4=
# echo -n '1f2d1e2e67df' | base64
MWYyZDFlMmU2N2Rm
创建secret:
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
2 变量注入方式在pod中使用secret
创建pod:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
进入到Pod中测试是否传入变量:
# kubectl exec -it mypod bash
# echo $SECRET_USERNAME
admin
# echo $SECRET_PASSWORD
1f2d1e2e67df
2 数据挂载方式在Pod中使用secret
创建pod:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
进入到Pod中测试是否写入文件:
# kubectl exec -it mypod bash
# cat /etc/foo/username
admin
# cat /etc/foo/password
1f2d1e2e67df
如果你的应用程序使用secret,应遵循Pod获取该数据的方式。
10.2 configmap
与Secret类似,区别在于ConfigMap保存的是不需要加密配置信息。
应用场景:应用配置文件
1 创建一个configmap用于保存应用程序用到的字段值
创建字段
apiVersion: v1
kind: ConfigMap
metadata:
name: myconfig
namespace: default
data:
special.level: info
special.type: hello
2 变量注入方式在Pod中使用configmap:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: busybox
image: busybox
command: [ "/bin/sh", "-c", "echo $(LEVEL) $(TYPE)" ]
env:
- name: LEVEL
valueFrom:
configMapKeyRef:
name: myconfig
key: special.level
- name: TYPE
valueFrom:
configMapKeyRef:
name: myconfig
key: special.type
restartPolicy: Never
查看Pod日志就可以看到容器里打印的键值了:
# kubectl logs mypod
info hello
2 数据挂载方式在pod中使用configmp
举一个常见的用法,例如将应用程序的配置文件保存到configmap中,这里以redis为例:
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-config
data:
redis.properties: |
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
---
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
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: redis-config
restartPolicy: Never
查看Pod日志就可以看到容器里打印的文件了:
# kubectl logs mypod
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
10.3 应用程序如何动态更新配置?
ConfigMap更新时,动态让应用生效方案: 1、重建pod 2、应用程序本身实现监听本地配置文件,如果发生变化触发配置热更新 3、使用sidecar容器监听配置文件是否更新,如果发生变化触发socket、http通知应用热更新 4、采用配置中心,例如nacos、apollo