我们实际开发应用程序和部署运行时,经常有许多的配置参数。在最早的虚拟机时代,这些参数会存放在服务器环境变量、文件目录等地方,如果每一台机器都手动配置一遍,很容易出错,且不方便管理。后来则出现了etcd
,SpringCloud Config
等方案。
k8s也提供了一套配置管理方案ConfigMap组件。
ConfigMap可以通过kubectl
命令或是yaml
资源文件方式创建,我们通常使用后者。下面是一个例子:
apiVersion: v1
kind: ConfigMap
metadata:
name: myconfig
data:
redis_host: "192.168.1.103"
redis_port: "6379"
redis_prefix: "onlineshop"
例子中,我们创建了3个键值对,我们可以使用kubectl apply
创建该对象。
在Deployment文件中,我们可以通过环境变量方式引用ConfigMap。下面例子中,我们创建了一个Pod,并通过env
作为环境变量引用相关配置:
apiVersion: v1
kind: Pod
metadata:
name: testpod
spec:
containers:
- name: test-container
image: gcr.io/google_containers/busybox
command: [ "/bin/sh", "-c", "env" ]
env:
- name: REDIS_HOST
valueFrom:
configMapKeyRef:
name: myconfig
key: redis_host
- name: REDIS_PORT
valueFrom:
configMapKeyRef:
name: myconfig
key: redis_port
restartPolicy: Never
上面Pod作为例子比较简单,只是执行了一条shell的env
命令,我们可以通过观察Pod日志查看其输出:
kubectl logs testpod
注意:
ConfigMap除了作为环境变量引用,也可以作为配置文件引用,还是使用之前的myconfig
,例子如下:
apiVersion: v1
kind: Pod
metadata:
name: testpod
spec:
containers:
- name: test-container
image: gcr.io/google_containers/busybox
command: [ "/bin/sh", "-c", "ls /etc/myconfig" ]
volumeMounts:
- name: myconfig-volume
mountPath: /etc/myconfig
volumes:
- name: myconfig-volume
configMap:
name: myconfig
restartPolicy: Never
上面例子中,ConfigMap的3个data会以3个文件的形式挂载到/etc/myconfig
目录,文件名为ConfigMap的key,文件内容即为ConfigMap的值。
前面介绍的ConfigMap主要用于存储一些通用配置,而数据库密码等一般通过Secret组件指定,其用法和ConfigMap类似。
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
redis_password: YWJjMTIzCg==
上面例子中,我们创建了一个Opaque
类型的Secret,并指定了其值。注意data
中,使用的是一个BASE64编码的字符串,这个字符串并没有加密!!!只是为了防止偷窥而进行了BASE64编码。
Ubuntu下,我们可以通过如下命令获取字符串的BASE64编码:
echo "abc123" | base64
引用Secret和ConfigMap类似,下面例子中以环境变量方式引用:
apiVersion: v1
kind: Pod
metadata:
name: testpod
spec:
containers:
- name: test-container
image: gcr.io/google_containers/busybox
command: [ "/bin/sh", "-c", "env" ]
env:
- name: REDIS_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: redis_password
restartPolicy: Never