Kubernetes 配置管理:secret 与 configmap

2024-05-15 渥太华微生活
来源:CSDN 博客

Screenshot-2022-08-01-at-4.58.55-PM.png


配置管理原理:

当需要修改很多配置文件时,创建一个配置资源,将配置资源挂载到各个pod当中,给pod所使用,这样就只要修改配置资源就可以了。

60418651c6544d6096a26dd3527f4e55.png


一、Secret

1.1  secret 简介

Secret 解决了密码、token、秘钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec 中。Secret 可以以 Volume 或者环境变量的方式使用。

Secret:保存加密文件 ;加密数据并存放在Etcd中,让Pod的容器以挂载Volume方式访问

secret 可选参数有三种:

  • generic: 通用类型,通常用于存储密码数据。

  • tls:此类型仅用于存储私钥和证书。

  • docker-registry: 若要保存 docker 仓库的认证信息的话,就必须使用此种类型来创建。

Secret 类型:

  • Service Account:用于被 service  account 引用。service accout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod 的/run/secrets/kubernetes.io/serviceaccount 目录中。

  • Opaque:base64 编码格式的 Secret,用来存储密码、秘钥等。可以通过 base64 --decode 解码获得原始数据,因此安全性弱。

  • kubernetes.io/dockerconfigjson:用来存储私有 docker registry 的认证信息

Pod 需要先引用才能使用某个 secret,Pod 有 3 种方式来使用 secret:

  • 作为挂载到一个或多个容器上的卷 中的文件。

  • 作为容器的环境变量。

  • 由 kubelet 在为 Pod 拉取镜像时使用。

官方网站:

Secrets | Kubernetes

https://kubernetes.io/docs/concepts/configuration/secret/

536e7861c65c41e7bebbfe942c2073c3.png

1.2  创建及使用

1.2.1  基于文件形式

1. 创建用户名和密码文件

[root@master ~]# echo -n 'admin' > username.txt    ##创建username文件存放用户名admin;-n:不转行输出
[root@master ~]# echo -n '123456' > password.txt   ##创建password文件存放密码123456

e5291139ed884043bea1da740d4e24a0.png

2. 查看资源 

[root@master ~]# kubectl create secret generic db-user-pass --from-file=username.txt --from-file=password.txt    ##创以数据库形式的资源,以文件形式导入凭据存放
secret/db-user-pass created
[root@master ~]# kubectl get secret     ##查看secret资源

b0d2ce14f57249019a6415653816d30c.png

[root@master ~]# kubectl describe secret db-user-pass 
##查看资源详细信息

8c761d0f1d234b1ab07da9ebf6b4f0f5.png

1.2.2 基于参数创建secret

1. 创建变量参数,先通过64位编码方式,明文转密文

[root@master ~]# echo -n 'admin' | base64    ##基于用户名生成64位编码
YWRtaW4=   ##生成的编码
[root@master ~]# echo -n '123456' | base64   ##基于密码生成64位编码
MTIzNDU2    ##生成的编码

2. 编写yaml文件,引用密文创建secret

[root@master ~]# cd demo/
[root@master demo]# vim secret.yaml
apiVersion: v1
kind: Secret   ##资源格式
metadata:
name: mysecret   ##资源名称
type: Opaque   ##opa凭证类型
data:
username: YWRtaW4=    ##复制生成的用户名编码
password: MTIzNDU2    ##复制生成的密码编码

3. 创建secret资源并查看信息

[root@master demo]# kubectl create -f secret.yaml     ##创建了配置资源
secret/mysecret created
[root@master demo]# kubectl get secret

54fc85512fce4c65b824c4498b1364db.png

1.2.3  secret资源的使用方式

1. 使用secret中的变量导入到pod中示例:将上面secret资源中的username和password重新赋值

key:username赋值给SECRET_USERNAME

key:password 赋值给SECRET_PASSWORD

[root@master demo]# vim secret-var.yaml
apiVersion: v1
kind: Pod   ##类型为pod
metadata:
name: mypod
spec:
containers:
- name: nginx    ##名字为nginx
image: nginx   ##镜像为nginx
env:     ##环境代理
- name: SECRET_USERNAME   ##username赋值给SECRET_USERNAME
valueFrom:   ##值来自于谁
secretKeyRef:
name: mysecret     ##值来自于mysecret资源
key: username   ##资源的值:username
- name: SECRET_PASSWORD  ##password 赋值给SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
[root@master demo]# kubectl apply -f secret-var.yaml   ##创建资源
pod/mypod created
[root@master demo]# kubectl get pods    ##查看pod资源
NAME    READY   STATUS    RESTARTS   AGE
mypod   1/1     Running   0          29s
[root@master demo]# kubectl exec -it mypod bash    ##进入资源
root@mypod:/# echo $SECRET_USERNAME    ##输出username变量
admin
root@mypod:/# echo $SECRET_PASSWORD   ##输出PASSWORD变量
123456

进入pod查看环境变量 SECRET_PASSWORD 的值为 password

2. 以volume的形式挂载到pod的某个目录下

[root@master demo]# vim secret-vol.yaml    ##编写secret-vol文件
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
volumeMounts:  ##容器卷挂载
- name: foo    ##指明挂载卷的名称
mountPath: "/etc/foo"   ##挂载的路径在容器中的/etc/foo
readOnly: true   ##设置权限为只读模式
volumes:   ##被挂载的外部资源
- name: foo    ##创建挂载卷名称
secret:
secretName: mysecret     ## secret资源
[root@master demo]# kubectl delete -f secret-var.yaml       ##删除之前的secret资源
pod "mypod" deleted
[root@master demo]# kubectl create -f secret-vol.yaml      ##创建资源
pod/mypod created
[root@master demo]# kubectl get pods    ##查看资源
NAME    READY   STATUS    RESTARTS   AGE
mypod   1/1     Running   0          50s   ##创建成功
[root@master ~]# kubectl exec -it mypod bash   ##进入mypod资源
root@mypod:/# ls /etc/foo
password  username    ##挂载成功
root@mypod:/# cat /etc/foo/password 
123456     ##看到password对应的值
root@mypod:/etc/foo# cat username 
admin     ##看到username对应的值

二、configmap

2.1 configmap 简介

Configmap 是 k8s 中的资源对象,用于保存非机密性的配置的,数据可以用 key/value 键值对的形式保存,也可通过文件的形式保存。

作用:

我们在部署服务的时候,每个服务都有自己的配置文件,如果一台服务器上部署多个服务:nginx、tomcat、apache 等,那么这些配置都存在这个节点上,假如一台服务器不能满足线上高并发的要求,需要对服务器扩容,扩容之后的服务器还是需要部署多个服务:nginx、tomcat、apache,新增加的服务器上还是要管理这些服务的配置,如果有一个服务出现问题,需要修改配置文件,每台物理节点上的配置都需要修改,这种方式肯定满足不了线上大批量的配置变更要求。 所以,k8s 中引入了 Configmap资源对象,可以当成 volume 挂载到 pod 中,实现统一的配置管理。

ConfigMap 的主要作用就是为了让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。

特点:

  • Configmap 是 k8s 中的资源, 相当于配置文件,可以有一个或者多个 Configmap;

  • Configmap 可以做成 Volume,k8s pod 启动之后,通过 volume 形式映射到容器内部指定目录上;

  • 容器中应用程序按照原有方式读取容器特定目录上的配置文件;

  • 在容器看来,配置文件就像是打包在容器内部特定目录,整个过程对应用没有任何侵入。

应用场景:

  • 应用配置

使用 ConfigMap 的限制条件:

  • ConfigMap 需要在 Pod 启动前创建出来;

  • 并且只有当 ConfigMap 和 Pod 处于同一命名空间时,才可以被 Pod 引用;

  • 当 Pod 挂载 ConfigMap 绑定的目录时,目录下的目录并不会挂载到 Pod 内,只有目录下的文件会被挂载。

知识结构图:

f5cccd623e9b4f9abee61c8fdd81a6e9.png

2.2  创建 ConfigMap  

2.2.1  基于kubectl形式

[root@master demo]# vim redis.properties    ##创建redis的配置文件中需要的参数文件
redis.host=127.0.0.1    ##主机地址
redis.port=6379     ##端口
redis.password=123456    ##密钥
[root@master demo]# kubectl create configmap redis-config --from-file=redis.properties  ##创建configmap资源,名称为redis-config文件来自于redis.properties文件
configmap/redis-config created
[root@master demo]# kubectl get configmap    ##查看资源
NAME           DATA   AGE
redis-config   1      69s
[root@master demo]# kubectl get cm    ##缩写查看资源
NAME           DATA   AGE
redis-config   1      95s
[root@master demo]# kubectl describe cm redis-config    ##查看参数信息

--from-file:指定在目录下的所有文件都会被用在 ConfigMap 里边创建一个键值对,键的名字就是文件名,值就是文件里内容。

addee2653f8d4d3c848a6114adb0fa03.png

创建mypod资源查看文件导入

[root@master demo]# kubectl delete pod/mypod   ##先将原先创建的mypod资源删除
pod "mypod" deleted
[root@master demo]# vim cm.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
 - name: busybox
image: busybox     ##镜像为linux最小内核
command: [ "/bin/sh","-c","cat /etc/config/redis.properties" ]   ##执行在pod中查看 /etc/config/redis.properties文件中的数据信息
volumeMounts:
 - name: config-volume    ##使用指定资源的标签
mountPath: /etc/config    ##挂载点
volumes:
 - name: config-volume   ##指定资源标签
configMap:
name: redis-config    ##指定的资源名称
restartPolicy: Never
[root@master demo]# kubectl apply -f cm.yaml    ##创建资源
pod/mypod created
[root@master demo]# kubectl get pods    ##查看pod资源
NAME    READY   STATUS      RESTARTS   AGE
mypod   0/1     Completed   0          25s   ##执行完任务状态就为Completed
[root@master demo]# kubectl logs mypod     ##查看mypod的日志信息
redis.host=127.0.0.1
redis.port=6379
redis.password=123456

2.2.2   基于变量参数形式

[root@master demo]# vim myconfig.yaml    ##创建变量资源
apiVersion: v1
kind: ConfigMap
metadata:
name: myconfig
namespace: default
data:
special.level: info     ##定义两个键值
special.type: hello
[root@master demo]# kubectl create -f myconfig.yaml    ##创建资源
configmap/myconfig created

创建mypod使用configmap资源输出变量参数

[root@master demo]# vim config-var.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: busybox
image: busybox
command: [ "/bin/sh", "-c", "echo $(LEVEL) $(TYPE)" ]    ##输出LEVEL和TYPE两个变量
env:     ##定义环境变量
- name: LEVEL     ##定义LEVEL变量
valueFrom:    ##值来自于
configMapKeyRef:   ##来自于configMap类型资源
name: myconfig    ##创建的configMap的资源
key: special.level    ##key来自于configMap中的special.level
- name: TYPE    ##定义TYPE变量
valueFrom:
configMapKeyRef:
name: myconfig
key: special.type
restartPolicy: Never
[root@master demo]# kubectl delete pod mypod     ##删除重复的名称的资源
pod "mypod" deleted
[root@master demo]# kubectl apply -f config-var.yaml    ##创建mypod资源
pod/mypod created
[root@master demo]# kubectl logs mypod    ##通过查看日志查看变量的输出
info hello

在 K8s 1.6 版本后引入新字段 envFrom,可以实现 ConfigMap 中所有的 key:value 自动生成为环境变量。

env 和 envFrom 的区别:前者是可以自定义变量名,但需要重复性操作;后者是不能自定义变量名,但是很便捷。

configMapKeyRef 和 configMapRef 的区别:前者是需要指定 key 和 configmap,后者是只需要指定 configMap 即可。

二维码 | 渥太华微生活

编者注:新闻取自各大新闻媒体,新闻内容并不代表本网立场!文字和图片来自网络,版权归原作者所有。如有侵权,请速联系小编,立即删除。

93
全部评论 (0)
展开快速发表评论

科技专栏