k8s集群中的configmap和secret
许多应用经常会有从配置文件、命令行参数或者环境变量中读取一些配置信息,这些配置信息我们肯定不会直接写死到应用程序中去,而ConfigMap就给我们提供了向容器中注入配置信息的能力,不仅可以用来保存单个属性,也可以用来保存整个配置文件。
ConfigMap 资源对象使用key-value形式的键值对来配置数据,这些数据可以在Pod里面使用,ConfigMap和Secrets比较类似,一个比较大的区别是ConfigMap可以比较方便的处理一些非敏感的数据,比如密码之类的还是需要使用Secrets来进行管理
用yaml文件创建configmap
kind: ConfigMap
apiVersion: v1
metadata:
name: cm-demo
namespace: default
data:
data.1: hello
data.2: world
config: |
property.1=value-1
property.2=value-2
property.3=value-3
前两个被用来保存单个属性,后面一个被用来保存一个配置文件。
使用命令创建configmap
$ mkdir testcm
$ cd testcm
$ vim redis.conf
host=127.0.0.1
port=6379
$ vim mysql.conf
host=127.0.0.1
port=3306
$ cd …
$ kubectl create configmap cm-demo1 --from-file=testcm
$ kubectl create configmap cm-demo2 --from-file=testcm/redis.conf
$ kubectl get configmap
$ kubectl describe configmap cm-demo2
Name: cm-demo2
Namespace: default
Labels:
Annotations:
Data
redis.conf:
host=127.0.0.1
port=6379
$ kubectl get configmap cm-demo2 -o yaml
apiVersion: v1
data:
redis.conf: |+
host=127.0.0.1
port=6379
kind: ConfigMap
metadata:
creationTimestamp: "2019-08-21T08:44:45Z"
name: cm-demo2
namespace: default
resourceVersion: "2386733"
selfLink: /api/v1/namespaces/default/configmaps/cm-demo2
uid: ecdd35b6-c3ef-11e9-9b9e-000c29d8512b
将configmap以volume的形式挂载到pod中
apiVersion: v1
kind: Pod
metadata:
name: testcm3-pod
spec:
containers:
- name: testcm3
image: busybox
command: [ "/bin/sh", "-c", "cat /etc/config/redis.conf" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: cm-demo2
$ kubectl logs testcm3-pod
host=127.0.0.1
port=6379
Secret有三种类型:
Opaque:base64 编码格式的 Secret,用来存储密码、**等;但数据也可以通过base64 –decode解码得到原始数据,所有加密性很弱。
kubernetes.io/dockerconfigjson:用来存储私有docker registry的认证信息。
kubernetes.io/service-account-token:用于被serviceaccount引用,serviceaccout 创建时Kubernetes会默认创建对应的secret。Pod如果使用了serviceaccount,对应的secret会自动挂载到Pod目录/run/secrets/kubernetes.io/serviceaccount中。
创建Opaque secret有多种方式
1、通过命令创建
$ kubectl create secret generic mysecret1 --from-literal=user=root -
-from-literal=password=redhat
$ kubectl get secret
$ kubectl describe secret mysecret1
Name: mysecret1
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 6 bytes
user: 4 bytes
$ kubectl get secret mysecret1 -o yaml
apiVersion: v1
data:
password: cmVkaGF0
user: cm9vdA==
kind: Secret
metadata:
creationTimestamp: "2019-08-21T12:07:41Z"
name: mysecret1
namespace: default
resourceVersion: "2396051"
selfLink: /api/v1/namespaces/default/secrets/mysecret1
uid: 466da758-c40c-11e9-9b9e-000c29d8512b
type: Opaque
2、通过普通文件和变量文件创建
$ echo -n tom > user
$ echo -n redhat > password
$ kubectl create secret generic mysecret2 --from-file=user --from-file=password
$ vim env.txt
user=tom
password=redhat
$ kubectl create secret generic mysecret3 --from-file=env.txt
3、通过yaml文件创建
$ echo -n tom |base64
dG9
$ echo -n redhat |base64
cmVkaGF0
$ vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret4
type: Opaque
data:
user: dG9t
password: cmVkaGF0
以卷的方式挂载secret
apiVersion: v1
kind: Pod
metadata:
name: secret2-pod
spec:
containers:
- name: secret2
image: busybox
command: ["/bin/sh", "-c", "ls /etc/secrets"]
volumeMounts:
- name: secrets
mountPath: /etc/secrets
readOnly: true
volumes:
- name: secrets
secret:
secretName: mysecret4
最后我们来对比下Secret和ConfigMap这两种资源对象的异同点:
相同点:
key/value的形式
属于某个特定的namespace
可以导出到环境变量
可以通过目录/文件形式挂载
通过 volume 挂载的配置信息均可热更新
不同点:
Secret 可以被 ServerAccount 关联
Secret 可以存储 docker register 的鉴权信息,用在 ImagePullSecret 参数中,用于拉取私有仓库的镜像
Secret 支持 Base64 加密
Secret 分为 kubernetes.io/service-account-token、kubernetes.io/dockerconfigjson、Opaque 三种类型,而 Configmap 不区分类型
下一篇: Docker容器的使用