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
[图片上传失败...(image-fea28d-1689605899009)]
查看 cm 对应的 yaml 信息
[图片上传失败...(image-c8301b-1689605899009)]
- 创建一个应用多个环境变量的镜像
**写一个小脚本 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
此处使用的是 envFrom
和 configMapRef
来配置一个 configmap 的多个条目
kubectl create -f newinfo.yaml
查看对应 pod 的日志:
[图片上传失败...(image-5fef88-1689605899009)]
没毛病老铁,正确使用到了 my-config 里面的键值对,这样我们使用单个 ConfigMap 条目或者多个 ConfigMap 的时候,都是可以方便的使用了
将 ConfigMap 中的数据作为命令行参数传入
根据上述案例,我们可以看到的,做法都是以环境变量的方式配置的,那么可不可以也像我们之前不使用环境变量而使用命令行传入参数的方式来传入我们需要的参数的呢?
k8s 对你说,必须可以啊,安排上
我们也来做一个实验,分为如下几步走,步骤与上述类似,下面我使用图的方式来呈现:
- 写脚本 env_configmap.sh ,带有传入参数
[图片上传失败...(image-162e05-1689605899009)]
- 制作镜像
[图片上传失败...(image-9163c-1689605899009)]
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 参数当中
[图片上传失败...(image-4457be-1689605899009)]
通过 kubectl create -f env_configmap.yaml
之后,我们来查看一下效果
[图片上传失败...(image-bc172f-1689605899009)]
nice ,没毛病,老铁 , 看了这几个例子之后,是不是觉得很简单呢,动手来试试吧
当然,ConfigMap 也可以使用卷的方式,这个做法我们往下看,一起和 secret 一起分享,他们的用法是类似的
看到这里的兄弟们,明眼人都能看出 ConfigMap 传递的都是明文的信息,那么如果我们有一些需要传递敏感信息,需要加密的信息,我们可以如何传递呢?
那么接下来我们来分享一下如何传递 ConfigMap 的所有条目作为环境变量,以及如何传递敏感数据呢?
Secret 的方式传递敏感数据
Secret 和 ConfigMap 类似,都是用来传递数据,都是键值对的形式,解耦配置的,
只不过 ConfigMap 传递的是明文信息,Secret 传递的是加密的信息,和二进制信息,加密方式是 base64,使用改加密方式的原因是传递二进制数据的时候,base64 转化之后,可以将二进制转化成字符串的形式
既然 secret 和 ConfigMap 很类似,那么在数据传递上也是类似的,也有如下几种方式
- secret 暴露为卷中的文件
- secret 里面的条目作为环境变量传递
有一点需要注意:
secret 是不会存储在磁盘中的,只会存储在节点的内存中
我们会有默认的一个 secret
kubectl get secrets
[图片上传失败...(image-2cad5d-1689605899009)]
[图片上传失败...(image-27e22d-1689605899009)]
kubectl describe secret default-token-76xjz
查看详情之后,我们可以看到这个 secret 包含了 3 个条目,分别是
- ca.crt
- namespace
- token
这些信息是用于 pod 内部安全访问 k8s Apiserver 服务器所需的全部信息
看到这里,我们知道,既然每一个 pod 访问 Apiserver 都需要这些权限信息,那么上述的加密信息肯定会存在 pod 的某个目录咯?
[图片上传失败...(image-8c8bcd-1689605899009)]
兄弟你很聪明,确实是这样的,我们来查看任意一个 pod ,看看详情
[图片上传失败...(image-d2735e-1689605899009)]
我们可以看到 这个目录/var/run/secrets/kubernetes.io/serviceaccount
是作为 k8s 的secrets 挂载,那么我们看看里面有啥吧
[图片上传失败...(image-f58be9-1689605899009)]
果然猜测没错,该目录下有 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 个文件
[图片上传失败...(image-4fa7be-1689605899009)]
创建 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
[图片上传失败...(image-cb1952-1689605899009)]
使用 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 里面自己需要如何时候,看自己的需求了
[图片上传失败...(image-7c491-1689605899009)]
此处记得挂载的名字需要是一样的,另外是使用 secret.secretName 关键字
如果是 ConfigMap 的挂载,可以是 configMap.name 关键字
查看效果:
kubectl create -f mysecret.yaml 创建 pod 之后,查看效果
[图片上传失败...(image-f2fe32-1689605899009)]
kubectl exec -it mysecret ls /tmp/cert
kubectl exec -it mysecret cat /tmp/cert/hello
kubectl exec -it mysecret cat /tmp/cert/https.cert
[图片上传失败...(image-46d41-1689605899009)]
[图片上传失败...(image-aa7c5a-1689605899009)]
我们再来看看本地的 http.cert 的信息,是否也是同样的字符串
[图片上传失败...(image-3b0c53-1689605899009)]
没毛病老铁,看效果还可以
最后提醒一点:
在 pod 运行过程中,如果修改了引用的 ConfigMap 和 secret,如果 pod 中的服务不支持热配置读取的话,那么请一定记得重启 pod
今天就到这里,学习所得,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~