K8s:ConfigMap & Secret

ConfigMap

ConfigMap 允许您将配置文件与镜像文件分离,以使容器化的应用程序具有可移植性。

你可以使用四种方式来使用 ConfigMap 配置 Pod 中的容器:

  1. 在容器命令和参数内
  2. 容器的环境变量
  3. 在只读卷里面添加一个文件,让应用来读取
  4. 编写代码在 Pod 中运行,使用 Kubernetes API 来读取 ConfigMap

例子

  1. 创建configmap.yaml:

    1
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: game-config
      namespace: dev
    data:
      # 类属性键;每一个键都映射到一个简单的值
      player_initial_lives: "3"
      ui_properties_file_name: "user-interface.properties"
    
      # 类文件键
      game.properties: |
        enemy.types=aliens,monsters
        player.maximum-lives=5    
      user-interface.properties: |
        color.good=purple
        color.bad=yellow
        allow.textmode=true
    1
    [root@master ~]# kubectl create -f configmap.yaml
    configmap/game-config created
    
    [root@master ~]# kubectl describe cm game-config -n dev
    Name:         game-config
    Namespace:    dev
    Labels:       <none>
    Annotations:  <none>
    
    Data
    ====
    game.properties:
    ----
    enemy.types=aliens,monsters
    player.maximum-lives=5    
    
    player_initial_lives:
    ----
    3
    ui_properties_file_name:
    ----
    user-interface.properties
    user-interface.properties:
    ----
    color.good=purple
    color.bad=yellow
    allow.textmode=true    
    
    Events:  <none>
  2. 创建pod-configmap.yaml

    1
    apiVersion: v1
    kind: Pod
    metadata:
      name: configmap-game
      namespace: dev
    spec:
      containers:
        - name: game
          image: nginx:1.17.1
          command: ["sleep", "3600"]
          env:
            # 定义环境变量
            - name: PLAYER_INITIAL_LIVES # 请注意这里和 ConfigMap 中的键名是不一样的
              valueFrom:
                configMapKeyRef:
                  name: game-config           # 这个值来自 ConfigMap
                  key: player_initial_lives # 需要取值的键
            - name: UI_PROPERTIES_FILE_NAME
              valueFrom:
                configMapKeyRef:
                  name: game-config
                  key: ui_properties_file_name
          volumeMounts:
          - name: config
            mountPath: "/config"
            readOnly: true
      volumes:
        # 你可以在 Pod 级别设置卷,然后将其挂载到 Pod 内的容器中
        - name: config
          configMap:
            # 提供你想要挂载的 ConfigMap 的名字
            name: game-config

    如果 Pod 中有多个容器,则每个容器都需要自己的 volumeMounts 块,但针对 每个 ConfigMap,你只需要设置一个 spec.volumes 块。

    1
    [root@master ~]# kubectl create -f pod-configmap.yaml
    pod/configmap-game created
    [root@master ~]# kubectl get pod configmap-game -n dev
    NAME             READY   STATUS    RESTARTS   AGE
    configmap-game   1/1     Running   0          33s
    [root@master ~]# kubectl exec -it configmap-game -n dev /bin/sh
    # cd config
    # ls
    game.properties  player_initial_lives  ui_properties_file_name	user-interface.properties
    # cat user-interface.properties
    color.good=purple
    color.bad=yellow
    allow.textmode=true

    当卷中使用的 ConfigMap 被更新时,所投射的键最终也会被更新。 kubelet 组件会在每次周期性同步时检查所挂载的 ConfigMap 是否为最新。

    以环境变量方式使用的 ConfigMap 数据不会被自动更新。 更新这些数据需要重新启动 Pod。

Secret

Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。Secrets其用法是跟ConfigMap基本上是一致,区别不同是ConfigMap是明文,而Secrets是经过base64加密过的。

有几种不同的方式来创建 Secret:

  • 使用 kubectl 命令创建 Secret
  • 使用配置文件来创建 Secret
  • 使用 kustomize 来创建 Secret
配置文件创建
  1. 数据进行编码

    1
    [root@master ~]# echo -n 'admin' | base64
    YWRtaW4=
    [root@master ~]# echo -n '123456' | base64
    MTIzNDU2
  2. 创建secret.yaml

    1
    apiVersion: v1
    kind: Secret
    metadata:
      name: secret
      namespace: dev
    type: Opaque
    data:
      username: YWRtaW4=
      password: MTIzNDU2
    1
    [root@master ~]# kubectl create -f secret.yaml
    secret/secret created
    [root@master ~]# kubectl describe secret secret -n dev
    Name:         secret
    Namespace:    dev
    Labels:       <none>
    Annotations:  <none>
    
    Type:  Opaque
    
    Data
    ====
    password:  6 bytes
    username:  5 bytes
环境变量引用

创建secretenv.yaml

1
apiVersion: v1
kind: Pod
metadata:
  name: secret-pod
  namespace: dev
spec:
  containers:
  - name: mycontainer
    image: nginx:1.17.1
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: secret
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: secret
            key: password
  restartPolicy: Never
1
[root@master ~]# vi secretenv.yaml
[root@master ~]# kubectl create -f secretenv.yaml 
pod/secret-pod created
[root@master ~]# kubectl get pod secret-pod -n dev
NAME         READY   STATUS    RESTARTS   AGE
secret-pod   1/1     Running   0          4s
[root@master ~]# kubectl exec -it secret-pod -n dev /bin/sh
# echo $SECRET_USERNAME
admin
# echo $SECRET_PASSWORD
123456
唐胡璐 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
分享创造价值,您的支持将鼓励我继续前行!