2024-05-15
渥太华微生活
来源:CSDN 博客
配置管理原理:
当需要修改很多配置文件时,创建一个配置资源,将配置资源挂载到各个pod当中,给pod所使用,这样就只要修改配置资源就可以了。
一、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/
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
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资源
[root@master ~]# kubectl describe secret db-user-pass ##查看资源详细信息
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
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 内,只有目录下的文件会被挂载。
知识结构图:
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 里边创建一个键值对,键的名字就是文件名,值就是文件里内容。
创建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 即可。
编者注:新闻取自各大新闻媒体,新闻内容并不代表本网立场!文字和图片来自网络,版权归原作者所有。如有侵权,请速联系小编,立即删除。
全部评论 (0) |
---|