【k8s 系列】k8s 学习二十三-2,ConfigMap 补充 和 Secret

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

【k8s 系列】k8s 学习二十三-2,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

此处使用的是 envFrom  和 configMapRef 来配置一个 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

--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


欢迎点赞,关注,收藏

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

image.png

好了,本次就到这里

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

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

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
11月前
|
存储 Kubernetes 持续交付
k8s学习
【10月更文挑战第1天】
400 4
|
11月前
|
Kubernetes 应用服务中间件 nginx
k8s学习--YAML资源清单文件托管服务nginx
k8s学习--YAML资源清单文件托管服务nginx
192 2
k8s学习--YAML资源清单文件托管服务nginx
|
11月前
|
存储 Kubernetes 调度
|
11月前
|
Kubernetes 关系型数据库 MySQL
k8s之Secret
k8s之Secret
|
11月前
|
Kubernetes API 调度
k8s学习--pod的所有状态详解(图例展示)
k8s学习--pod的所有状态详解(图例展示)
1196 1
|
11月前
|
Kubernetes 固态存储 调度
k8s学习--如何控制pod调度的位置
k8s学习--如何控制pod调度的位置
172 0
|
11月前
|
存储 Kubernetes 调度
k8s学习--k8s群集部署zookeeper应用及详细解释
k8s学习--k8s群集部署zookeeper应用及详细解释
599 0
|
运维 Kubernetes Cloud Native
如何轻松学习 Kubernetes?
《深入浅出 Kubernetes》一书共汇集 12 篇技术文章,帮助你一次搞懂 6 个核心原理,吃透基础理论,一次学会 6 个典型问题的华丽操作!
如何轻松学习 Kubernetes?
|
运维 Kubernetes 负载均衡
如何轻松学习 Kubernetes?
本文分享阿里技术专家关于 Kubernetes 的一些观点和看法,并给出学习 Kubernetes 的方法建议 ,最后分享 Kubernetes 集群上的问题排查经验。
11540 0
如何轻松学习 Kubernetes?
|
4月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
154 9

推荐镜像

更多