《Kubernetes 入门实战课》 学习笔记 day5

157 阅读3分钟

大家好,我是砸锅。一个摸鱼八年的后端开发。熟悉 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 的“松耦合”关系:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b70577d2933347f3854883287e4f451b~tplv-k3u1fbpfcp-zoom-1.image

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 的关系:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/52bd78adfe0f4361813c634e6ef06e32~tplv-k3u1fbpfcp-zoom-1.image

以 Volume 的方式来使用 ConfigMap/Secret,就和环境变量不太一样。环境变量用法简单,更适合存放简短的字符串,而 Volume 更适合存放大数据量的配置文件,在 Pod 里加载成文件后让应用直接读取使用

此文章为3月Day15学习笔记,内容来源于极客时间《Kubernetes 入门实战课》 这门课真的非常好,推荐大家看看