小阿轩yx-Kubernetes配置管理

49 篇文章 0 订阅
1 篇文章 0 订阅

小阿轩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配置管理

  • 20
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值