1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > kubernetes—ConfigMap 与 Secret

kubernetes—ConfigMap 与 Secret

时间:2021-02-19 06:30:35

相关推荐

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、开发中的困难

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

2、ConfigMap 的功能

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 <<EOFlives=3enemies.cheat=trueenemies.cheat.level=noGoodRottenEOF$ sudo tee /runfile/configmap/ui.properties <<EOFcolor.good=purplehow.nice.to.look=fairlyNiceEOF

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. 创建完成后依然可以通过getdescribe命令查看ConfigMap

$ kubectl get configmaps#确认资源是否存在NAMEDATA AGEgame-config 2102skube-root-ca.crt 125d

$ kubectl describe configmaps game-config Name: game-configNamespace: defaultLabels: <none>Annotations: <none>Data====ui.properties: #文件名----color.good=purple #变量how.nice.to.look=fairlyNice #变量game.properties: #文件名----lives=3 #变量enemies.cheat=true #变量enemies.cheat.level=noGoodRotten #变量BinaryData====Events: <none>

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 AGEspecial-config 259skiosk@k8s-master:~$ kubectl describe configmaps special-config Name: special-configNamespace: defaultLabels: <none>Annotations: <none>Data====special.how:----veryspecial.type:----charmBinaryData====Events: <none>

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- <<EOFapiVersion: v1kind: ConfigMapmetadata:name: specialconfig-2data:key1: value1pro.property: | # | 代表有多行,多行都代表是property的valuekey2: value2key3: value3EOF

$ kubectl describe configmaps specialconfig-2 Name: specialconfig-2Namespace: default #配置时没有写命名空间,所以就在当前空间Labels: <none>Annotations: <none>Data====key1:----value1pro.property:----key2: value2key3: value3BinaryData====Events: <none>

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

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

$ kubectl apply -f- <<EOFapiVersion: v1kind: Podmetadata:name: cm-test-podspec:containers:- name: cm-containerimage: busyboxargs: [ "/bin/sh", "-c", "sleep 3000" ]env: #环境变量- name: special-envvalueFrom: #值从哪或得configMapKeyRef: #从此configmap中指定变量获得name: specialconfig-2key: key1 #此变量从哪获得envFrom: #环境变量- configMapRef: #通过configmap关联name: specialconfig-2 #与此configmap关联restartPolicy: Never #永不重启EOF

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

$ kubectl get pods cm-test-pod#查看pod状态NAMEREADY STATUS RESTARTS AGEcm-test-pod 1/1Running 0119s

$ 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- <<EOFapiVersion: v1kind: Podmetadata:name: cmpod2spec:containers:- name: cmpod2image: busyboxargs: [ "/bin/sh", "-c", "sleep 3000" ]volumeMounts:- name: dbmountPath: "/etc/db"readOnly: truevolumes:- name: dbconfigMap:name: specialconfig-2EOF

$ kubectl get pods cmpod2 NAMEREADY STATUS RESTARTS AGEcmpod2 1/1Running 025s

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

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

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

$ kubectl exec -it cmpod2 -- /bin/sh #进入pod/ # ls /etc/db key1pro.property/ # cat /etc/db/key1#key1值value1/ # / # cat /etc/db/pro.property#key2、3值key2: value2key3: 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- <<EOFapiVersion: v1kind: ConfigMapmetadata:name: specialconfig-2data:key1: value-new #修改下对应值pro.property: |key2: value2key3: value3EOF$ kubectl exec -it cmpod2 -- /bin/sh #登录cmpod2/ # ls /etc/db key1pro.property/ # cat /etc/db/key1 #发现变量值已被更新value-new/ #

二、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 TYPEDATA AGEdb-user-pass Opaque 215s

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

$ kubectl describe secrets db-user-pass Name: db-user-passNamespace: defaultLabels: <none>Annotations: <none>Type: OpaqueData====username.txt: 5 bytespassword.txt: 4 bytes

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

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

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

2. 创建Yaml文件

kubectl apply -f- <<EOFapiVersion: v1kind: Secretmetadata:name: mysecrettype: Opaquedata:username: YWRtaW4=password: bWltYQ==EOF

3.查看

$ kubectl get secretNAME TYPEDATA AGEdb-user-pass Opaque 245mmysecret Opaque 26s$ kubectl describe secrets mysecret Name: mysecretNamespace: defaultLabels: <none>Annotations: <none>Type: OpaqueData====password: 4 bytesusername: 5 bytes

参考资料:Secret | Kubernetes

5、使用 Secret - volume 方式

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

$ kubectl apply -f- <<EOFapiVersion: v1kind: Podmetadata:name: spodspec:containers:- image: busyboxname: spodargs: ["/bin/sh","-c","sleep 3000"]volumeMounts:- name: secretsmountPath: "/etc/secret"readOnly: truevolumes:- name: secretssecret: #区别,挂载为secret(挂载什么写什么)secretName: mysecretEOF

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

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

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

$ kubectl get pod spod#查看状态NAME READY STATUS RESTARTS AGEspod 1/1Running 023s$ 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- <<EOFapiVersion: v1kind: Podmetadata:name: spod2spec:containers:- image: busyboxname: spod2args: ["/bin/sh","-c","sleep 3000"]volumeMounts:- name: secretsmountPath: "/etc/secret" #挂载路径readOnly: true #只读volumes:- name: secretssecret:secretName: mysecret #secret名items: #只有items中指定了的主键会被投射- key: password #挂载path: my-group/my-passwd #指定路径EOF

$ 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 键投射到特定目录”

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。