小阿轩yx-Kubernetes配置管理
前言
- 通常一个服务的启动需要依赖一些配置
比如
- 一个 java 应用需要知道自己连接的数据库或其他中间件的地址是什么?
- 需要知道连接另一个服务的接口地址是什么?所以需要告诉应用其他服务的配置信息。
一般可以通过环境注入或者配置文件进行统一管理,而不是写死在代码里面,这也是云原生应用设计比较重要的因素--配置分离。
传统的架构中
- 配置文件可以保存在本地服务器、代码仓库或配置中心
kubernetes 上
- 其抽象为 ConfigMap(缩写为 CM)和 Secret 的概念,用来管理程序的配置文件或 Pod 变量
什么是 ConfigMap
传统架构中
- 配置文件被保存在宿主机上,程序启动是可以指定某个配置文件,但是使用容器部署时,容器所在的节点并不固定,所以不能使用这种方式,此处在构建镜像时,如果把配置文件也放在容器里面,那么配置文件一旦有更改的话,也是一件非常麻烦的事情。
- 所以 k8s 抽象了一个 configMap 的概念,将配置与 pod 和组件分开,这有助于保持工作负载的可移植性,使配置更易于更改和管理。
生产环境中
- 可以将 Nginx、Redis 等应用的配置文件存储在 configMap 上,然后将其挂载即可使用。
相对于 secret
- ConfigMap 更倾向于存储和共享非敏感、未加密的配置信息
- 假如是集群中使用敏感信息,最好使用 secret。
ConfigMap
- 用来在键值对数据库(etcd)中保存非加密数据。一般用来保存配置文件。
- 可以用作环境变量、命令行参数或者存储卷。
- 将环境配置信息与 容器镜像 解耦,便于配置的修改。
- 在设计上不是用来保存大量数据的。
- 中保存的数据不可超过 1 MiB。
创建 ConfigMap
ConfigMap 可以创建的方式
- 目录(目录下有多个文件)
- 单个文件
- 字符值
使用 kubectl 创建一个 ConfigMap 的命令格式
kubectl create configmap <map-name><data-source>
- map-name:configMap 的名称
- data-source:数据源,可以使数据的目录、文件或字符值
- ConfigMap 中的数据是以键值对(key-value pair)的形式保存的;key:文件名或秘钥;value:文件内容或字符值
将 images 镜像通过 Xftp 上传至master、node01、node02(101、102、103)
将资源清单单独上传至 master 主节点(101)
三台主机导入镜像(master、node01、node02)
主机一
[root@k8s-master ~]# cd images/
[root@k8s-master images]# bash imp_docker_img
主机二
[root@k8s-node01 ~]# cd images/
[root@k8s-node01 images ~]# bash imp_docker_img
主机三
[root@k8s-node02 ~]# cd images/
[root@k8s-node02 images ~]# bash imp_docker_img
基于目录创建 ConfigMap
- 假如一次性需要多个文件来创建 ConfigMap,可以使用 kubectl create configmap 命令从同一个目录中的多个文件创建 configMap。
创建 conf 目录
[root@k8s-master ~]# mkdir /conf
放置两个文件
[root@k8s-master ~]# echo "This is file01">/conf/file01.conf
[root@k8s-master ~]# echo "This is file02">/conf/file02.conf
基于目录下的所有文件创建 ConfigMap
[root@k8s-master ~]# kubectl create configmap game-config-1 --from-file=/conf/
- ConfigMap 是按 namespace 隔离的,不同的 namespace 之间的 ConfigMap 的名称可以相同,但是不能跨 namespace 进行访问,创建 ConfigMap 时,可以使用 -n 选项指定资源所在的 namespace
查看当前创建的 ConfigMap
[root@k8s-master ~]# kubectl get cm game-config-1 -oyaml
apiVersion:v1
data:
file01.conf:
This is file01
file02.conf:
This is file02
kind: configMap
metadata:
creationTimestamp:“2023-08-21T13:47:21Z'
name:game-config-1
namespace:default
resourceVersion:"18393"
uid:15796a97-cadc-4a13-809c-4ba064e657d8
- 由于该 ConfigMap 是直接基于目录创建的,没有指定 ConfigMap 中的 key 名,因此默认是按照目录下的文件名作为 ConfigMap 数据中的 key 名
基于文件创建 ConfigMap
创建测试文件 game-cfg
[root@k8s-master ~]# echo "This is game-cfg file">/conf/game.cfg
基于单个文件创建 ConfigMap
[root@k8s-master ~]# kubectl create cm game-config-2 --from-file=/conf/game.cfg
查看当前创建的 ConfigMap
[root@k8s-master ~]# kubectl get cm game-config-2 -o yaml
apiVersion: v1
data:
game.cfg:
This is game-cfg file
kind: configMap
metadata:
creationTimestamp:"2022-08-21T14:07:24Z
name:game-config-2
namespace:default
resourceVersion:“20414"
uid:8da3a7ec-e188-49f0-9183-38bfd7fd50da
- 没有指定 ConfigMap 的 key,因此使用文件名作为 key
使用带有 key 的命令创建 ConfigMap
[root@k8s-master ~]# kubectl create cm game-config-3 --from-file=self-key=/conf/game.cfg
查看当前创建的 ConfigMap
[root@k8s-master ~]# kubectl get cm game-config-3 -o yaml
apiVersion: v1
data:
self-key:
This is game-cfg file
kind: ConfigMap
metadata:
creationTimestamp:"2022-08-21T14:10:49Z
name:game-config-3
namespace:default
resourceVersion:"20759"
uid:00a42c00-1a12-4eac-8984-f1137d7a34e8
- 由于没有指定 ConfigMap 的 key,因此使用文件名作为key
使用带有 key 的命令创建 ConfigMap
[root@k8s-master ~]# kubectl create cm game-config-3 --from-file=self-key=/conf/game.cfg
查看当前创建的 ConfigMap
[root@k8s-master ~]# kubectl get cm game-config-3 -o yaml
apiVersion:v1
data:
self-key:
This is game-cfg file
kind: configMap
metadata:
creationTimestamp:"2022-08-21T14:10:49Z
name: game-config-3
namespace: default
resourceVersion:"20759"
uid:00a42c00-1a12-4eac-8984-f1137d7a34e8
多次使用 --from-file 传入参数,用以从多个文件创建 ConfigMap
[root@k8s-master ~]# kubectl create cm game-config-4 --from-file=self01-key=/config/file01.conf --from-file=self02-key=/conf/file02.conf
获取 game-config-4 文件的参数
[root@k8s-master ~]# kubectl get cm game-config-4 -o yaml
apiVersion: v1
data:
selfo1-key: |
This is file01
selfo2-key: |
This is file01
kind: ConfigMap
metadata:
creationTimestamp:"2022-08-21T14:14:20Z'
name: game-config-4
namespace: default
resourceVersion: "21113"
uid: 7698ee8c-d1cb-4747-bc51-a7a7cfa31e7c
基于 ENV 文件创建 ConfigMap
- 假如有一个文件 game-env-file.cfg,里面存储的 key=value 形式的数据,此类文件可以当做某个应用的环境变量配置,此时可以使用 --from-env-file 从 ENV 文件创建 ConfigMap。
查看测试用的变量 key-value 文件
[root@k8s-master ~]# cat /conf/game-env-file.cfg
name1=zhangsan
name2=lisi
name3=wwangwu
创建 ConfigMap
[root@k8s-master ~]# kubectl create cm game-config-env-file --from-env-file=/conf/game-env-file.cfg
获取 Config 文件参数
[root@k8s-master ~]# kubectl create cm game-config-env-file -o yaml
apiVersion: v1
data:
name1: zhangsan
name2: lisi
name3: wangwu
kind: configMap
metadata:
creationTimestamp: "2023-11-27T13:16:59Z
name: game-config-env-file
namespace: default
resourceVersion: "3186"
uid: bcobdo0f-ad4a-4f69-a4cf-c4f433c26f91
基于字符值创建 ConfigMap
- 有时候配置的并不是很多,只有几个 key=value 的参数,可以直接使用 kubectl create configmap--from-lietal 参数来定义命令行的字符值。
- lietal:文字的;逐字的;
利用字符值创建 ConfigMap
- 如字符值:spec.level=info 和 spec.type=charm
[root@k8s-master ~]# kubectl create config spec-config-1 --from-liternal=spec.user01=zhangsan --from-liternal=spec.user02=lisi
获取 Config 文件参数
[root@k8s-master ~]# kubectl create cm spec-config-1 -o yaml
apiVersion: v1
data:
name1: zhangsan
name2: lisi
kind: configMap
metadata:
creationTimestamp: "2023-11-27T13:16:59Z
name: spec-config-1
namespace: default
resourceVersion: "7104"
uid: 23a78f6f-8f0d-4ce6-8b59-9f9b2fb9850f
删除已创建的 ConfigMap
[root@k8s-master ~]# kubectl delete configmap spec-config-1
- 删除时只需指定要删除的 ConfigMap 的名称。
ConfigMap 实践
- 本实践案例将 CM 创建的变量引入到 pod 内。
- 在 kubernetes 中,用户可以使用环境变量引用 ConfigMap 中的数据,容器启动时,kubernetes会将 configMap 数据作为环境变量注入到容器的进程中。
- 为了使用 configMap 中的数据,用户需要在 pod的规范(spec)中定义一个env 字段,并指定 ConfigMap 中的“键值对”。
使用 valueFrom 定义容器的环境变量
先以字符值的形式创建 ConfigMap
[root@k8s-master ~]# kubectl create config spec-config-2 --from-liternal=name1=zhangsan --from-liternal=name2=lisi
获取创建的 ConfigMap
[root@k8s-master ~]# kubectl get cm spec-config-2 -o yaml
apiVersion: v1
data:
name1: zhangsan
name2: lisi
kind: configMap
metadata:
creationTimestamp: "2022-08-23T04:12:02Z
name: spec-config-2
namespace: default
resourceVersion: "14219"
uid: ecedad7d-5f56-4a87-8baf-664eba182bec
使用 valueFrom 从 ConfigMap 中定义变量
[root@k8s-master ~]# cat env-valuefrom.yaml
apiVersion: v1
kind: Pod
metadata:
name: env-valuefrom
spec:
containers:
- name: env-valuefrom
image: busybox:v1
command: ["/bin/sh","-c","env" ]
env:
- name: my-name01-
valueFrom:
configMapKeyRef:
key: name1
name: spec-config-2
- name: my-name02
valueFrom:
configMapKeyRef:
key: name2
name: spec-config-2
restartPolicy: Never
此案例中
- env 用于定义环境变量,valueFrom 指定了环境变量的值来源于 ConfigMap。
- “name: my-name81”用于定义容器中用的变量名,其值来自于 CM 中的 name1 的值。
- “name1”是在 CM 中定义的 key。
- 用 valueFrom 的方式引入 pod 中的变量名,可以在定义 pod 的之后指定成另一个名称。相当于在 pod中起了一个新的名字,但是值还是原来 ConfigMap 中给定的值。
创建此 Pod
[root@k8s-master ~]# kubectl create -f env-valuefrom.yaml
查看 Pod 日志
[root@k8s-master ~]# kubectl logs env-valuefrom
KUBERNETES SERVICE PORT=443
KUBERNETES PORT=tcp://10.96.0.1:443
HOSTNAME=env-valuefrom
SHLVL=1
HOME=/root
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tCp
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
my-name01=zhangsan
my-name02=lisi
使用 envFrom 定义容器的环境变量
- k8s 从 1.6的版本开始,引入了一个新的字段 envFrom,实现了在 Pod 中将 ConfigMap 中所有定义的key=value 自动生成为环境变量。
- 使用 envFrom 时,环境变量的名字是 configMap 中数据的 key 名。
valueFrom 和 envfrom 的区别
- 通过 valueFrom 来配置环境变量,Pod 的环境变量名与 ConfigMap 中定义的变量名不必相同valueFrom 是指定变量进行映射。
- 通过 envFrom 会把 configMap 的所有键值对都映射到 Pod 的环境变量中去
- envFrom 配置的环境变量和 Pod 的环境变量名是相同的
使用 envFrom 从 ConfigMap 中定义变量
[root@k8s-master ~]# cat env-envfrom.yaml
apiVersion: v1
kind: Pod
metadata:
name: env-envfrom
spec:
containers:
- name: env-envfrom
image: busybox:v1
command:["/bin/sh","-c","env" ]
envFrom:
- configMapRef:
name: spec-config-2
restartPolicy: Never
形容 spec 文件
[root@k8s-master ~]# kubectl describe cm spec-config
创建此 Pod
[root@k8s-master ~]# kubectl apply -f env-envfrom.yaml
查看 pod 的日志
[root@k8s-master ~]# kubectl logs env-envfrom
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
ame1=zhangsan
HOSTNAME=env-envfrom
name2=lisi
SHLVL=1
HOME=/root
KUBERNETES_PORT_443_TCPADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
以文件的形式挂载 configMap
- 大部分情况下,ConfigMap 定义的都是配置文件,而不是环境变量,因此需要将 ConfigMap 的文件挂载到 Pod 中,然后 Pod 中的容器就可以引用,此时可以通过 Pod 的 volume 字段进行挂载。
创建测试文件 game-properties
[root@k8s-master ~]# mkdir /etc/conf
定义回显页面
[root@k8s-master ~]# echo "This is game-cfg file">/etc/conf/game.cfg
[root@k8s-master ~]# echo "This is info-cfg file">/etc/conf/info.cfg
ck 使用带有 key 的命令创建 ConfigMap
[root@k8s-master ~]# kubectl create cm spec-config02 --from-file=app1.conf=/etc/conf/game.cfg --from-file=app2.conf=/etc/conf/info.cfg
查看 ConfigMap
[root@k8s-master ~]# kubectl get cm spec-config02 -o yaml
apiVersion: v1
data:
app1.conf: |
This is game-properties file
app2.conf: |
This is info-properties file
kind: ConfigMap
metadata:
creationTimestamp: “2023-11-27T14:30:06Z'
name: spec-config
namespace: default
resourceVersion: "13235"
uid: e38ec76f-7400-45c5-b693-f72d8427dc09
编写文件,将名为 spec-config 的 ConfigMap 挂载到容器的 /etc/config 目录下
[root@k8s-master ~]# cat dapi-test1-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: dapi-test1-pod
spec:
containers:
- name: dapi-test1-pod
image: kubeguide/tomcat-app:v1
ports:
- containerPort: 8080
volumeMounts:
- name: config-volume
mountPath: /etc/conf
volumes:
- name: config-volume
configMap:
name: spec-config02
items:
创建此 Pod
[root@k8s-master ~]# kubectl create -f dapi-test1-pod.yaml
- 容器的/etc/config 目录会被覆盖掉
查看创建结果
[root@k8s-master ~]# kubectl get pods
NAME REAFY STATUS RESTARTS AGE
dapi-test1-pod.yaml 1/1 Running 0 47s
登录容器查看挂载情况
[root@k8s-master ~]# kubectl exec -it dapi-test1-pod -- bash
root@dapi-test1-pod:/usr/local/tomcat# ls /etc/conf
app1.conf app2.conf
root@dapi-test1-pod:/usr/local/tomcat# ls -l /etc/conf
total 0
lrwxrwxrwx 1 root root 16 Aug 24 14:31 app1.conf -> ..data/app1.conf
lrwxrwxrwx 1 root root 16 Aug 24 14:31 app2.conf -> ..data/app2.conf
删除此 Pod
[root@k8s-master ~]# kubectl delete -f dapi-test1-pod.yaml
自定义文件名挂载 ConfigMap
- 很多情况下,需要更改挂载的文件名,可以使用 path 字段指定 ConfigMap 挂载的文件名
- 将文件 app2.conf 挂载到/etc/conf 下,并重命名为 app2.cfg
编写 Pod 文件
[root@k8s-master ~]# cat dapi-test2-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: dapi-test2-pod
spec:
containers:
- name: dapi-test2-pod
image: kubeguide/tomcat-app:v1
ports:
- containerPort: 8080
volumeMounts:
- name: config-volume
mountPath: /etc/conf
volumes :
- name: config-volume
configMap:
name: spec-config02
items:
- key: app1.conf
path: app1.cfg
- key: app2.conf
path: app2.cfg
创建此 Pod
[root@k8s-master ~]# kubectl create -f dapi-test2-pod.yaml
查看创建结果
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTART AGE
dapi-test2-pod 1/1 Running 0 3s
登录容器查看挂载结果
[root@k8s-master ~]# kubectl exec -it dapi-test2-pod -- bash
root@dapi-test2-pod:/usr/local/tomcat# ls -l /etc/conf/
total 0
lrwxrwxrwx 1 root root 15 Aug 24 14:45 app1.cfg ->..data/app1.cfg
lrwxrwxrwx 1 root root 15 Aug 24 14:45 app2.cfg ->..data/app2.cfg
删除此 Pod
[root@k8s-master ~]# kubectl delete -f dapi-test2-pod.yaml
指定挂载的文件权限
编写 Pod 文件
[root@k8s-master ~]# cat dapi-test2-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: dapi-test3-pod
spec:
containers:
- name: dapi-test3-pod
image: kubeguide/tomcat-app:v1
ports:
- containerPort: 8080
volumeMounts:
- name: config-volume
mountPath: /etc/conf
volumes:
- name: config-volume
configMap:
name: spec-config02
items :
- key: app1.conf
path: app1.cfg
mode: 0644
- key: app2.conf
path: app2.cfg
defaultMode: 0666
- defaultMode: 0666 没有设置权限的其他文件默认的权限
创建此 Pod
[root@k8s-master ~]# kubectl create -f dapi-test3-pod.yaml
查看创建结果
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
dapi-test2-pod.yaml 1/1 Running 0 3s
登录容器查看挂载结果
[root@k8s-master ~]# kubectl exec -it dapi-test3-pod -- bash
root@dapi-test3-pod:/usr/local/tomcat# ls -l /etc/conf/
total 0
lrwxrwxrwx 1 root root 15 Aug 24 14:58 app1.cfg ->..data/app1.cfg
lrwxrwxrwx 1 root root 15 Aug 24 14:58 app2.cfg ->..data/app2.cfg
root@dapi-test3-pod:/usr/local/tomcat# ls -l /etc/conf/..data/
total 8
-rw-r--r--1 root root 29 Aug 24 14:58 app1.cfg
-rw-rw-rw-1 root root 29 Aug 24 14:58 app2.cfg
删除此 Pod 和 ConfigMap
[root@k8s-master ~]# kubectl delete -f dapi-test3-pod.yaml
[root@k8s-master ~]# kubectl delete cm spec-config
利用 SubPath 解决挂载覆盖的问题
- 当挂载 ConfigMap 或 Secret 到容器内部时,会覆盖容器中的目录,从而导致容器无法正常运行。为了解决挂载覆盖的问题,需要使用 SubPath 的方式进行挂载。
创建测试用的配置文件
[root@k8s-master ~]# mkdir /etc/conf
编写配置文件
[root@k8s-master ~]# cat /etc/conf/nginx.conf
user nginx;
#This is my ngin-config
worker processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log format main"$remote addr -$remote user [$time local] "$request"
"$status $body bytes sent "$http referer"'
"$http user agent" "$http x forwarded for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopushon on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
使用带有 key 的命令创建 ConfigMap
[root@k8s-master ~]# kubectl create cm nginx-config --from-file=nginx.conf=/etc/conf/nginx.conf
查看 ConfigMap
[root@k8s-master ~]# kubectl get cm nginx-config -o yaml
创建 Pod 文件挂载文件
[root@k8s-master ~]# cat dapi-test4-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: dapi-test4-pod
spec:
containers:
- name: dapi-test4-pod
image: nginx:1.7.9
ports:
- containerPort:80
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/nginx.conf
subPath: nginx.conf
volumes :
- name: nginx-config
configMap:
name: nginx-config
items :
- key: nginx.conf
path: nginx.conf
- mountPath 表示容器中目录
- subPath 表示 configMap 中文件的 key 名
创建此 Pod
[root@k8s-master ~]# kubectl create -f dapi-test4-pod.yaml
查看创建结果
[root@k8s-master ~]# kubectl get pods
登录容器查看挂载结果
[root@k8s-master ~]# kubectl exec -it dapi-test4-pod -- bash
root@dapi-test4-pod:~# cat /etc/nginx/nginx.conf
user nginx;
#This is my ngin-config
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker connections 1024;
}
http {
include/etc/nginx/mime.types;
default typeapplication/octet-stream;
log format main ' - [] ""'
' "" '
' "" "" ';
access log /var/log/nginx/access.log main;
sendfile on ;
#tcp nopushon on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
删除此 Pod
[root@k8s-master ~]# kubectl delete -f dapi-test4-pod.yaml
ConfigMap 限制
ConfigMap
- 使用时有很多的限制,如果没有正确使用 configMap,可能会导致 Pod 不能正常操作
目前具有的限制如下
- 必须创建 ConfigMap 才能在 Pod 中引用它,如果 Pod 引用的 ConfigMap 不存在,Pod 将无法启动,一直处于 Pending 状态,可以通过 describe 命令查看
[root@k8s-master ~]# kubectl describe configmap nginx-config
[root@k8s-master ~]# kubectl describe pod dapi-test4-pod
- Pod 引用的键必须存在于 configMap 中,否则 Pod 无法启动,一直处于 containercreating 状态,可以通过 describe 命令查看査看。
- 使用 envFrom 配置容器环境变量时,默认会跳过被视为无效的键,但是不影响 Pod 的启动,无效的变量会记录在事件日志中。
获取状态
[root@k8s-master ~]# kubectl get events
- ConfigMap 和引用它的 Pod 需要在同一个命名空间
加密数据管理
- ConfigMap 主要用于非安全的数据,与其对应的是 Secret 对象类型,用来保存敏感信息
- 将这些信息放在 Serret 中比较安全和灵活。
- 用户可以创建 Secret 并且引用到 Pod 中,比如使用 Secre 初始化 Redres、MySQL 密码等。
创建 secret
创建 Secret 的方式有很多
- 命令行工具 Kubectl
- 通过 yaml 文件创建
使用 kubect1命令行创建 secret
- 假设有些 Pod 需要访问数据库,可以将账户、密码存储在 username.txt和 password.txt 文件中,然后以文件的形式创建 Secret 供 Pod 使用。
首先创建账户信息
[root@k8s-master ~]# echo -n "admin">./username.txt
[root@k8s-master ~]# echo -n "password">./password.txt
以文件 username.txt 和 password.txt 创建 secret(创建方式和 ConfigMa 一致)
[root@k8s-master ~]# kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
secret/db-user-pass created
- generic:通用
- db-user-pass:创建的secret的名字
查看 Secret
[root@k8s-master ~]# kubectl get secret dnb-user-pass
NAME TYPE DATA AGE
db-user-pass Opaque 2 11s
- Opaque 不透明的,表示secret是加密的形式保存数据的
查看文件参数
[root@k8s-master ~]# kubectl describe secret/db-user-pass
Name: db-user-pass
Namespace: default
Labels : <none>
Annotations: <none>
Type: Opaque
Data
===
password.txt: 10 bytes
username.txt: 5 bytes
- 默认情况下,get 和 describe 命令都不会显示文件的内容,这是为了防止 Secret 中的内容被意外暴露。
- 所以,显示出来的信息中 Data 字段没有对应的值,只显示了文件的名字。
通过 yaml 文件创建 secret
- 手动创建 Secret 时,每一项内容必须是 base64 编码的,所以要先对明文进行编码
[root@k8s-master ~]# echo -n "admin" | base64
YWRtAW4=
[root@k8s-master ~]# echo -n "password" | base64
bXwYXNz29yZA==
创建一个 yaml 文件
[root@k8s-master ~]# vim db-user-secret.yaml
apiVersion: v1
kind: secret
metadata:
name: mysecret
type: opaque
data:
username: YwRtaW4=
password: bXlwYXNzd29yZA==
- Opaque:不透明的
最后使用该文件创建一个 Secret
[root@k8s-master ~]# kubectl create -f db-user-secret.yaml
解码 secret
[root@k8s-master ~]# kubectl get secret mysecret -o yaml
apiVersion: v1
data:
password: bXlwYXNzd29yZA==
username: YwRtaW4=
kind: Secret
metadata:
creationTimestamp: "2023-03-30T10:30:16Z
name: mysecret
namespace: default
resourceVersion: "3203"
uid:a73915be-5759-4614-bfbe-363dd6c49be4
type: opaque
查看内容
[root@k8s-master ~]# echo "bXlwYXNzd29yZA==" | base64 --decode
mypassword
在 pod 中应用 secret
- secret 和 ConfigMap 的用法类似,也可以作为数据卷挂载,或作为环境变量以供 Pod 的容器使用。
在 Pod 的 volume 中使用 Secret
[root@k8s-master ~]# vim secret-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: nginx:1.7.9
volumeMounts:
- name:foo
mountPath:"/etc/foo"
readonly: true
volumes :
- name: foo
secret:
secretName: mysecret
创建 secret 文件
[root@k8s-master ~]# kubectl create -f secret-pod.yaml
登录容器
[root@k8s-master ~]# kubectl exec -it mypod /bin/sh
登录容器查看 Pod 中的信息
[root@k8s-master ~]# kubectl exec -it mypod /bin/sh
# ls /etc/foo
password username
# cat /etc/foo/username
admin
# cat /etc/foo/password
mypassword
小阿轩yx-Kubernetes配置管理