目录

Secret And ConfigMap

K8S学习笔记

1. 背景

到目前为止,也许您不必将任何类型的配置数据传递给应用程序。 因为几乎所有应用程序都需要配置,不应将其融入到构建的应用程序本身中。 本文介绍了将配置数据传递到应用程序的两种方法。

2.密钥

密钥是因为您传递给容器的信息是敏感的。 K8s 提供了一个单独的对象,称为 Secret。 有 4 种创建 Secret 的方法。

  • 通过 –from-literal

    1
    
    kubectl create secret generic mysecret --from-literal=username=admin --from-literal=password=123456
    
  • 通过–from-file,每个文件包含一项。

    1
    2
    3
    
    echo -n admin > ./username
    echo -n 123456 > ./password
    kubectl create secret generic mysecret1 --from-file=./username --from-file=./password 
    
  • 通过–from-env-file。 在 env.txt 中,每一行键值都匹配一项。

    1
    2
    3
    4
    5
    
    cat << EOF > env.txt
    username=admin
    password=123456
    EOF
    kubectl create secret generic mysecret --from-env-file=env.txt
    
  • 通过 YAML 文件。

    1
    2
    3
    4
    5
    6
    7
    
    apiVersion: v1
    kind: Secret
    metadata:
    name: mysecret
    data:
    username: YWRtaW4=
    password: NTY3ODk=
    

    用户名和密码是敏感信息,因此会被加密。 然后可以使用:“kubectl apply -f my Secret.yaml”来创建秘密。

    创建秘密后,可以使用命令显示秘密。 像这样。

    您也可以使用describe命令来显示详细信息。

    在此图中,您可以看到密码和用户名已加密。

3.如何在Pod中使用secret

我们知道,Secret是k8s中分离的对象,所以pod会通过卷来使用secret。 如何使用,如下。

  • 创建 pod,在 pod 中定义卷,也来自秘密。 (体积)

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    apiVersion: v1
    kind: Pod
    metadata:
    name: mypod
    spec:
    containers:
    - name: mypod
      image: busybox
      args:
        - /bin/sh
        - -c
        - sleep 10; touch /tmp/healthy; sleep 30000
      volumeMounts:
      - name: foo
        mountPath: "/etc/foo"
        readOnly: true
    volumes:
    - name: foo
      secret:
        secretName: mysecret
    

    从Yaml文件中我们可以看到,将秘钥值挂载到路径:/etc/foo. 然后我们就可以查看秘密了。

也可以将数据保存到组路径中。 这样,我们就可以保存秘密加密。

  • 创建 Pod,在 Pod 中定义 env 变量。 (环境)

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    apiVersion: v1
    kind: Pod
    metadata:
    name: mypod-env
    spec:
    containers:
    - name: mypod-env
      image: busybox
      args:
        - /bin/sh
        - -c
        - sleep 10; touch /tmp/healthy; sleep 30000
      env:
        - name: SECRET_USERNAME
          valueFrom:
            secretKeyRef:
              name: mysecret
              key: username
        - name: SECRET_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysecret
              key: password
    

    在 pod 中,定义键和值。 然后就可以通过环境变量获取值了。

4. 配置映射

k8s 允许将配置选项分离到一个名为 ConfigMap 的单独对象中。 这与秘密不同。 它习惯于不敏感的数据。 让我们展示一下。 和secret一样,有4种创建ConfigMap的方法。

  • 通过 –from-literal

    1
    
    kubectl create configmap myconfigmap --from-literal=config1=xxx --from-literal=config2=yyy
    
  • 通过–from-file

    1
    2
    3
    
    echo -n xxx > ./config1
    echo -n yyy > ./config2
    kubectl create configmap myconfigmap2 --from-file=./config1 --from-file=./config2
    
  • 通过 –from-evn-file

    1
    2
    3
    4
    5
    
    cat << EOF > env.txt
    config1=xxx
    config2=yyy
    EOF
    kubectl create configmap myconfigmap3 --from-env-file=env.txt
    
  • 通过YAML文件

    1
    2
    3
    4
    5
    6
    7
    
    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: myconfigmap
    data:
    config1: xxx
    config2: yyy
    

    这和秘密是一样的。 由此,可以创建单独的config对象,然后可以在Pod中使用。

    5.如何在Pod中使用configmap

    这和秘密是一样的。 configmap就像一个单独的对象,然后Pod可以使用该对象并获取键值。 下面是关于configmap的一种实践。

    • 创建配置映射。

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      
      apiVersion: v1
      kind: ConfigMap
      metadata:
      name: myconfigmap5
      data:
      logging.conf: |
      class: logging.handlers.RotatingFileHandler
      formatter: precise
      level: INFO
      filename: %hostname-%timestamp.log
      
    • 使用配置映射创建 Pod。

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      
      apiVersion: v1
      kind: Pod
      metadata:
      name: mypodconfig
      spec:
      containers:
      - name: mypodconfig
        image: busybox
        args:
          - /bin/sh
          - -c
          - sleep 10; touch /tmp/healthy; sleep 30000
        volumeMounts:
        - name: foo
          mountPath: "/etc/foo"
      volumes:
      - name: foo
        configMap:
          name: myconfigmap5
          items:
            - key: logging.conf
              path: myapp/logging.conf
      

      在此 Pod 中,定义安装路径。 然后执行以下命令。