kubernetes—ConfigMap 与 Secret

目录

一、ConfigMap(配置地图)介绍

1、开发中的困难

2、ConfigMap 的功能

3. 创建ConfigMap - 从目录创建

4、查看ConfigMap

5、创建ConfigMap - 从文件创建

6、创建ConfigMap - 从 literal

 7、创建 ConfigMap - 从 Yaml 文件创建

8、使用ConfigMap - 通过环境变量

9、使用ConfigMap - 通过Volume

10、ConfigMap使用注意事项

二、Secret 介绍

1、Secret

2、创建Secret - 使用 kubectl 命令创建

3、查看Secret

4、创建 Secret - 使用 Yaml 文件创建

5、使用 Secret - volume 方式

6、使用Secret - 挂载指定值


一、ConfigMap(配置地图)介绍

1、开发中的困难

kubernetes—ConfigMap 与 Secret_第1张图片

当开发人员开发完成一个应用程序,比如一个Web程序,在正式上线之前需要在各种环境中运行,例如开发时的开发环境,测试环节的测试环境,直到最终的线上环境。Web程序在各种不同的环境中都需要对接不同的数据库、中间件等服务,在传统方式中我们通过配置文件来定义这些配置,而kubernetes中如果需要进入一个Pod来配置,那将会是一个巨大的麻烦 

2、ConfigMap 的功能

kubernetes—ConfigMap 与 Secret_第2张图片1. ConfigMap 用于容器的配置文件管理。它作为多个properties文件的应用,类似一个专门存储配置文件的目录,里面存放着各种配置文件

2. ConfigMap 实现了 image 和应用程序的配置文件、命令行参数和环境变量等信息解耦

3. ConfigMap 和 Secrets 类似,但ConfigMap用于处理不含敏感信息的配置文件

3. 创建ConfigMap - 从目录创建

1. 创建两个配置文件如下图,放置在/runfile/configmap文件夹下

    通过目录来创建,文件夹名称、路径随意,有读权限即可

$ sudo mkdir -p /runfile/configmap

$ sudo tee /runfile/configmap/game.properties <

2. 使用kubectl 命令可以创建一个ConfigMap。

    --from-file 目录下的所有文件都会被用在ConfigMap中创建一个键值对,键是文件名,值是文件的内容

$ kubectl create configmap game-config --from-file=/runfile/configmap/
configmap/game-config created
当不写具体文件时,会将文件夹中的文件全部变成变量

参考资料: 配置 Pod 使用 ConfigMap | Kubernetes

4、查看ConfigMap

1. 创建完成后依然可以通过get describe 命令查看ConfigMap

$ kubectl get configmaps     #确认资源是否存在
NAME               DATA   AGE
game-config        2      102s
kube-root-ca.crt   1      25d
$ kubectl describe configmaps game-config 
Name:         game-config
Namespace:    default
Labels:       
Annotations:  

Data
====
ui.properties:    #文件名
----
color.good=purple    #变量
how.nice.to.look=fairlyNice #变量

game.properties:    #文件名
----
lives=3    #变量
enemies.cheat=true #变量
enemies.cheat.level=noGoodRotten #变量


BinaryData
====

Events:  

5、创建ConfigMap - 从文件创建

--from-file 参数可以多次使用,用于从多个文件创建ConfigMap的场景:

$ kubectl create configmap game-config-3 \
  --from-file=/runfile/configmap/game.properties \    #文件1
  --from-file=/runfile/configmap/ui.properties        #文件2

6、创建ConfigMap - 从 literal

之前的方式都需要新建配置文件,然后从文件创建ConfigMap。kubernetes还提供使用实际配置值创建的方式,通过 --from-literal 参数实现

但是无论起什么名字都是key=value

$ kubectl create configmap special-config \
--from-literal=special.how=very \
--from-literal=special.type=charm
$ kubectl get configmaps special-config 
NAME             DATA   AGE
special-config   2      59s
kiosk@k8s-master:~$ kubectl describe configmaps special-config 
Name:         special-config
Namespace:    default
Labels:       
Annotations:  

Data
====
special.how:
----
very
special.type:
----
charm

BinaryData
====

Events:  

 7、创建 ConfigMap - 从 Yaml 文件创建

1. 与deployment,pod等资源对象相同,ConfigMap也可以使用Yaml 文件进行创建

2. Data字段中,

    key1的定义方式类似使用 --from-iterial,

    pro.property的定义方式类似使用--from-file

8、使用ConfigMap - 通过环境变量

1. 可以直接将ConfigMap里的参数,直接做为容器的环境变量供其中程序调用

$ kubectl explain configmap.data    #查看configmap.data说明
$ kubectl apply -f- <
$ kubectl describe configmaps specialconfig-2 
Name:         specialconfig-2
Namespace:    default    #配置时没有写命名空间,所以就在当前空间
Labels:       
Annotations:  

Data
====
key1:
----
value1
pro.property:
----
key2: value2
key3: value3


BinaryData
====

Events:  

2. env可以创建环境变量的键,并且引用configmap里的特定参数做为值。

    envFrom则自动将configmap 的所有的键值对自动变成环境变量

$ kubectl apply -f- <

3. 创建完成后容器中额外的环境变量如下:

$ kubectl get pods cm-test-pod     #查看pod状态
NAME          READY   STATUS    RESTARTS   AGE
cm-test-pod   1/1     Running   0          119s
$ kubectl exec -it cm-test-pod -- /bin/sh    #登录pod
/ # env        #查询环境变量
...输出省略...
key1=value1                        #与configmap一致
...输出省略...
pro.property=key2: value2         #与configmap一致
key3: value3
...输出省略...

9、使用ConfigMap - 通过Volume

1. 使用方式和存储章节中使用 emptyDir 和 hostPath 的 volume类似,configMap挂载后变成了容器内的一个目录

$ kubectl apply -f- <
$ kubectl get pods cmpod2 
NAME     READY   STATUS    RESTARTS   AGE
cmpod2   1/1     Running   0          25s

2. 在容器的/etc/db 目录中,

我们可以看到两个文件,分别是 key1,和pro.property,对应configmap 中的两个DATA

键就是文件名,值就是文件内容

$ kubectl exec -it cmpod2 -- /bin/sh    #进入pod
/ # ls /etc/db    
key1          pro.property
/ # cat /etc/db/key1     #key1值
value1/ # 
/ # cat /etc/db/pro.property     #key2、3值
key2: value2
key3: value3

10、ConfigMap使用注意事项

1. ConfigMap必须在创建Pod前创建完成。如果Pod调用ConfigMap失败,则无法创建

2. Pod只能使用在同一Namespace 中的 ConfigMap

3. ConfigMap 创建方式通常使用文件方式

4. ConfigMap 使用方式通常使用 volume 方式(另一种是envfrom方式

5. 以volume 方式挂载 ConfigMap,更新ConfigMap 或删除重建 ConfigMap,Pod内挂载的配置信息会热更新

$ kubectl apply -f- <

二、Secret 介绍

1、Secret

1. Secret 是一种包含少量敏感信息,例如密码、token 或 key 的对象

    这样的信息可能会被放在Pod spec 中或者镜像中;

    将其放在一个secret 对象中可以更好地控制它的用途,并降低意外暴露的风险

2. ConfigMap 主要解决配置文件的存储问题

    而Secret 主要用来解决密码、token、秘钥等敏感数据

        在创建、查看和编辑Pod的流程中Secret 暴露风险较小

        系统会对Secret 对象采取额外的预防措施,例如避免将其写入磁盘中可能的位置

        只要Pod请求的Secret 在其容器中才是可见的,一个Pod 不能访问另一个Pod的Secret

2、创建Secret - 使用 kubectl 命令创建

1. 创建一个两个文件,写入用户名和密码

$ echo -n "admin" > username.txt    #-n代表没有回车
$ echo -n "mima" > password.txt

2. 使用 kubectl 命令创建。Secret 的名称为db-user-pass

$ kubectl create secret generic db-user-pass \
--from-file=./username.txt \
--from-file=./password.txt

3. 其中generic 参数代表从本地的文件、目录或实际值(literal value)

参考资料: 使用 kubectl 管理 Secret | Kubernetes

3、查看Secret

1. 使用get命令可以查到Secret 信息,其中Opaque 类型表示base64 编码格式的Secret

$ kubectl get secrets 
NAME           TYPE     DATA   AGE
db-user-pass   Opaque   2      15s

2. 通过describe 命令可以发现Secret 与 ConfigMap不同,不会直接显示内容

$ kubectl describe secrets db-user-pass 
Name:         db-user-pass
Namespace:    default
Labels:       
Annotations:  

Type:  Opaque

Data
====
username.txt:  5 bytes
password.txt:  4 bytes

4、创建 Secret - 使用 Yaml 文件创建

1. 为避免 Yaml 文件中的值被查看到,因此需要先用 base64 编码后,将值写入Yaml

$ echo -n "admin" | base64 
YWRtaW4=
$ echo -n "mima" | base64
bWltYQ==

2. 创建Yaml文件 

kubectl apply -f- <

3. 查看

$ kubectl get secret
NAME           TYPE     DATA   AGE
db-user-pass   Opaque   2      45m
mysecret       Opaque   2      6s

$ kubectl describe secrets mysecret 
Name:         mysecret
Namespace:    default
Labels:       
Annotations:  

Type:  Opaque

Data
====
password:  4 bytes
username:  5 bytes

参考资料: Secret | Kubernetes

5、使用 Secret - volume 方式

1. 使用volume 方式挂载Secret 给Pod 和使用 ConfigMap类似

$ kubectl apply -f- <

2. 一个Secret 在容器内体现为一个目录,一个键值对是一个文件,

    其中键是文件名称,值是文件内容

3. Secret 内容在挂载给pod 时进行解码,因此在Pod 内部是明文呈现

$ kubectl get pod spod     #查看状态
NAME   READY   STATUS    RESTARTS   AGE
spod   1/1     Running   0          23s

$ kubectl exec -it spod -- /bin/sh    #进入pod
/ # ls /etc/secret/
password  username
/ # cat /etc/secret/username 
admin/ # 
/ # cat /etc/secret/password 
mima/ # exit

6、使用Secret - 挂载指定值

1. 在挂载Secret 的时候可以指定 items,只将Secret 中的某些参数传递到Pod中

        ① Secret 中 password 传递到了pod中,而username 没有

        ② 在 Pod 中 /etc/secret/my-group 有一个 my-passwd文件,内容为mima

kubectl apply -f- <
$ kubectl exec -it spod2 -- /bin/sh
/ # ls /etc/secret/
my-group
/ # ls /etc/secret/
my-group/
/ # ls /etc/secret/my-group/
my-passwd
/ # cat /etc/secret/my-group/my-passwd 
mima/ # exit

参考资料: Secret | Kubernetes   --“Secret 键投射到特定目录

你可能感兴趣的:(k8s,kubernetes,docker,容器,linux)