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

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 对于上一篇文章我们分享了为什么要使用 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

好了,本次就到这里

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

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

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
存储 Kubernetes 持续交付
k8s学习
【10月更文挑战第1天】
101 4
|
2月前
|
Kubernetes 应用服务中间件 nginx
k8s学习--YAML资源清单文件托管服务nginx
k8s学习--YAML资源清单文件托管服务nginx
k8s学习--YAML资源清单文件托管服务nginx
|
2月前
|
存储 Kubernetes 调度
|
2月前
|
Kubernetes 关系型数据库 MySQL
|
2月前
|
Kubernetes API 调度
k8s学习--pod的所有状态详解(图例展示)
k8s学习--pod的所有状态详解(图例展示)
234 1
|
2月前
|
Kubernetes 固态存储 调度
k8s学习--如何控制pod调度的位置
k8s学习--如何控制pod调度的位置
|
2月前
|
存储 Kubernetes 调度
k8s学习--k8s群集部署zookeeper应用及详细解释
k8s学习--k8s群集部署zookeeper应用及详细解释
106 0
|
运维 Kubernetes Cloud Native
如何轻松学习 Kubernetes?
《深入浅出 Kubernetes》一书共汇集 12 篇技术文章,帮助你一次搞懂 6 个核心原理,吃透基础理论,一次学会 6 个典型问题的华丽操作!
如何轻松学习 Kubernetes?
|
运维 Kubernetes 负载均衡
如何轻松学习 Kubernetes?
本文分享阿里技术专家关于 Kubernetes 的一些观点和看法,并给出学习 Kubernetes 的方法建议 ,最后分享 Kubernetes 集群上的问题排查经验。
11415 0
如何轻松学习 Kubernetes?
|
12天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。