ConfigMap 补充 和 Secret

对于上一篇文章我们分享了为什么要使用 ConfigMap ,我们创建 ConfigMap 的时候可以传入单个或者多个键值对,也可以传入文件,还分享了如何简单的传入 ConfigMap 里面的数据作为环境变量

我们补充一下使用 ConfigMap 一次性传递多个条目吧

一次性传递 ConfigMap 的所有条目

若 ConfigMap 里面有多个键值对,如果按照我们上一次分享的做法来操作的话,肯定是会觉得非常的麻烦的,而且数量多了之后就会容易出错,搞的整个人都不好了

那么我们看看 ConfigMap 如何一次性的传递多个条目吧

  • 创建一个多条目的 ConfigMap

kubectl create configmap my-config --from-literal=XMTNAME=xiaozhu --from-literal=AGE=15 --from-literal=CITY=sz

创建有 3 个条目的 ConfigMap 来做个试验

查看 my-config 详情

正确创建了包含 3 个键值对的 ConfigMap

查看 cm 对应的 yaml 信息

  • 创建一个应用多个环境变量的镜像

*写一个小脚本 newinfo.sh *

#!/bin/bash

while :
do
  echo "new  -- xmtname = " $XMTNAME  " --- age = " $AGE "  --- city = " $CITY "
  sleep 2
done

写 Dockerfile

FROM ubuntu:latest
ADD newinfo.sh /bin/newinfo.sh
ENTRYPOINT ["/bin/newinfo.sh"]

构建镜像并推送

docker build -t xiaomotong888/newinfo .
docker push xiaomotong888/newinfo
  • yaml 清单 newinfo.yaml,配置好 ConfigMap 多条目,创建 pod ,查看效果
apiVersion: v1
kind: Pod
metadata:
  name: newinfo
spec:
  containers:
  - image: xiaomotong888/newinfo
    name: newinfo
    envFrom:
    - configMapRef:
        name: my-config

此处使用的是 envFromconfigMapRef 来配置一个 configmap 的多个条目

kubectl create -f newinfo.yaml

查看对应 pod 的日志:

没毛病老铁,正确使用到了 my-config 里面的键值对,这样我们使用单个 ConfigMap 条目或者多个 ConfigMap 的时候,都是可以方便的使用了

将 ConfigMap 中的数据作为命令行参数传入

根据上述案例,我们可以看到的,做法都是以环境变量的方式配置的,那么可不可以也像我们之前不使用环境变量而使用命令行传入参数的方式来传入我们需要的参数的呢?

k8s 对你说,必须可以啊,安排上

我们也来做一个实验,分为如下几步走,步骤与上述类似,下面我使用图的方式来呈现:

  • 写脚本 env_configmap.sh ,带有传入参数

  • 制作镜像

docker hub 上生成的镜像是 xiaomotong888/envconfigmap

  • 写 yaml env_configmap.yaml,创建 pod ,查看效果
apiVersion: v1
kind: Pod
metadata:
  name: newinfo-env-configmap
spec:
  containers:
  - image: xiaomotong888/envconfigmap
    name: newinfo-env-configmap
    env:
    - name: XMTCITY
      valueFrom:
        configMapKeyRef:
          name: my-config
          key: CITY
    args: ["$(XMTCITY)"]

我们可以看到,我们的做法其实和直接使用 ConfigMap 作为环境变量的做法是类似的,只不过是我们这里是先将 ConfigMap 里面的键值对转成环境变量,然后我们在 yaml 清单中将该环境变量用 args 参数当中

通过 kubectl create -f env_configmap.yaml 之后,我们来查看一下效果

nice ,没毛病,老铁 , 看了这几个例子之后,是不是觉得很简单呢,动手来试试吧

当然,ConfigMap 也可以使用卷的方式,这个做法我们往下看,一起和 secret 一起分享,他们的用法是类似的

看到这里的兄弟们,明眼人都能看出 ConfigMap 传递的都是明文的信息,那么如果我们有一些需要传递敏感信息,需要加密的信息,我们可以如何传递呢?

那么接下来我们来分享一下如何传递 ConfigMap 的所有条目作为环境变量,以及如何传递敏感数据呢?

Secret 的方式传递敏感数据

Secret 和 ConfigMap 类似,都是用来传递数据,都是键值对的形式,解耦配置的

只不过 ConfigMap 传递的是明文信息,Secret 传递的是加密的信息,和二进制信息,加密方式是 base64,使用改加密方式的原因是传递二进制数据的时候,base64 转化之后,可以将二进制转化成字符串的形式

既然 secret 和 ConfigMap 很类似,那么在数据传递上也是类似的,也有如下几种方式

  • secret 暴露为卷中的文件
  • secret 里面的条目作为环境变量传递

有一点需要注意:

secret 是不会存储在磁盘中的,只会存储在节点的内存中

我们会有默认的一个 secret

kubectl get secrets

kubectl describe secret default-token-76xjz

查看详情之后,我们可以看到这个 secret 包含了 3 个条目,分别是

  • ca.crt
  • namespace
  • token

这些信息是用于 pod 内部安全访问 k8s Apiserver 服务器所需的全部信息

看到这里,我们知道,既然每一个 pod 访问 Apiserver 都需要这些权限信息,那么上述的加密信息肯定会存在 pod 的某个目录咯?

兄弟你很聪明,确实是这样的,我们来查看任意一个 pod ,看看详情

我们可以看到 这个目录/var/run/secrets/kubernetes.io/serviceaccount 是作为 k8s 的secrets 挂载,那么我们看看里面有啥吧

果然猜测没错,该目录下有 3 个文件,是包含权限信息的

那么我们来创建 secret 并使用他来玩玩吧

如何创建并使用 secret

创建证书

openssl genrsa -out https.key 2048 
$ openssl req -new -x509 -key https.key -out https.cert-days 365 -subj 
/CN=www.xmt.com

我们可以看到在我们的当前目录下创建了 2 个文件

创建 secret

上面说到 ConfigMap 和 secret 类似,那么我们也创建一个文件,里面写上明文的数据,然后加入到 secret 中看看效果吧

写 hello 文件

echo xiaozhu > hello

创建 secret

kubectl create secret generic xmt-https --from-file=https.key --from-file=https.cert --from-file=hello

查看我们创建的 secret

kubectl get secrets
 kubectl describe secret xmt-https

使用 secret

我们使用 secret 的方式,最好是用卷的方式暴露文件,而不是使用环境变量的方式,因为 secret 传递的是敏感信息,若直接体现在 yaml 清单中的环境变量,这样还是不太可取

  • 写 yaml 清单,引用 secret mysecret.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mysecret
spec:
  containers:
  - image: xiaomotong888/envconfigmap
    name: mysecret
    volumeMounts:
    - name: mycert
      mountPath: /tmp/cert
  volumes:
  - name: mycert
    secret:
      secretName: xmt-https

我们这里可以随便用一个镜像,正确的创建 pod 即可,我们主要是验证挂载到 pod 里面的文件是明文的且挂进再进去了,pod 里面自己需要如何时候,看自己的需求了

此处记得挂载的名字需要是一样的,另外是使用 secret.secretName 关键字

如果是 ConfigMap 的挂载,可以是 configMap.name 关键字

查看效果:

kubectl create -f mysecret.yaml 创建 pod 之后,查看效果

kubectl exec -it mysecret ls /tmp/cert
kubectl exec -it mysecret cat /tmp/cert/hello
kubectl exec -it mysecret cat /tmp/cert/https.cert

我们再来看看本地的 http.cert 的信息,是否也是同样的字符串

没毛病老铁,看效果还可以

最后提醒一点:

在 pod 运行过程中,如果修改了引用的 ConfigMap 和 secret,如果 pod 中的服务不支持热配置读取的话,那么请一定记得重启 pod

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

本作品采用《CC 协议》,转载必须注明作者和本文链接
关注微信公众号:阿兵云原生
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!