大家好,我是砸锅。一个摸鱼八年的后端开发。熟悉 Go、Lua。今天和大家一起学习 Kubernetes😊
ConfigMap
ConfigMap 用来保存明文配置,可以使用 kubectl create 创建一个 YAML 模版
export out="--dry-run=client -o yaml" # 定义Shell变量
kubectl create cm info $out
kubectl create cm info --from-literal=k=v $out # 生成带有 data 字段的 ConfigMap YAML
ConfigMap 存储的是配置数据,都是静态的字符串。所以不需要使用 spec 字段来说明运行时的规格
apiVersion: v1
kind: ConfigMap
metadata:
name: info
data:
count: '10'
debug: 'on'
path: '/etc/systemd'
greeting: |
say hello to kubernetes.
使用这个 YAML 创建 ConfigMap
kubectl apply -f cm.yml
查看 ConfigMap 的状态,ConfigMap 的 Key-Value 信息都存入 etcd 数据库了
kubectl get cm
kubectl describe info
Name: info
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
count:
----
10
debug:
----
on
greeting:
----
say hello to kubernetes.
path:
----
/etc/systemd
BinaryData
====
Secret
Secret 用来保存秘密配置,使用 kubectl create secret generic 来创建 Secret 的 YAML 模版,并且使用参数 —from-literal 给出 Key-Value 值
kubectl create secret generic user --from-literal=name=root $out
编辑 Secret 的 YAML
apiVersion: v1
kind: Secret
metadata:
name: user
data:
name: cm9vdA== # root
pwd: MTIzNDU2 # 123456
db: bXlzcWw= # mysql
使用 kubectl apply、kubectl get、kubectl describe:
kubectl apply -f secret.yml
kubectl get secret
root@iZjtwuZ:~/k8s/info-secret# kubectl describe secret user
Name: user
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
db: 5 bytes
name: 4 bytes
pwd: 6 bytes
使用 kubectl describe 只能看到数据大小了
ConfigMap 和 Secret 的使用
因为 ConfigMap 和 Secret 都是一些存储到 etcd 的字符串,所以要使用的话要么使用环境变量,要么就是加载文件
环境变量的方式
使用 “valueFrom” 字段,从 ConfigMap 或者 Secret 对象里获取值,这样就实现了把配置信息以环境变量的形式注入进 Pod,也就是配置与应用的解耦
“valueFrom” 字段指定了环境变量值的来源,可以是 “configMapKeyRef” 或者 “secretKeyRef”,然后再进一步指定应用的 ConfigMap/Secret 的 “name” 和它里面的 “key”,要当心的是这个 “name” 字段是 API 对象的名字,而不是 Key-Value 的名字。例如:
apiVersion: v1
kind: Pod
metadata:
name: env-pod
spec:
containers:
- env:
- name: COUNT
valueFrom:
configMapKeyRef:
name: info
key: count
- name: GREETING
valueFrom:
configMapKeyRef:
name: info
key: greeting
- name: USERNAME
valueFrom:
secretKeyRef:
name: user
key: name
- name: PASSWORD
valueFrom:
secretKeyRef:
name: user
key: pwd
image: busybox
name: busy
imagePullPolicy: IfNotPresent
command: ["/bin/sleep", "300"]
Pod 与 ConfigMap、Secret 的“松耦合”关系:

Volume 的方式使用 ConfigMap 和 Secret
Pod里面可以挂载(mount)多个 Volume,里面存放供 Pod 访问的数据。只需要在 “spec” 里增加一个 “volumes” 字段,然后再定义卷的名字和引用的 ConfigMap/Secret 就可以了。有了 Volume 的定义之后,就可以在容器里挂载了,这要用到“volumeMounts”字段,正如它的字面含义,可以把定义好的 Volume 挂载到容器里的某个路径下,所以需要在里面用“mountPath”“name”明确地指定挂载路径和 Volume 的名字
apiVersion: v1
kind: Pod
metadata:
name: vol-pod
spec:
volumes:
- name: cm-vol
configMap:
name: info
- name: sec-vol
secret:
secretName: user
containers:
- volumeMounts:
- mountPath: /tmp/cm-items
name: cm-vol
- mountPath: /tmp/sec-items
name: sec-vol
image: busybox
name: busy
imagePullPolicy: IfNotPresent
command: ["/bin/sleep", "300"]
volumes 和 volumeMounts 的关系:

以 Volume 的方式来使用 ConfigMap/Secret,就和环境变量不太一样。环境变量用法简单,更适合存放简短的字符串,而 Volume 更适合存放大数据量的配置文件,在 Pod 里加载成文件后让应用直接读取使用
此文章为3月Day15学习笔记,内容来源于极客时间《Kubernetes 入门实战课》 这门课真的非常好,推荐大家看看