ConfigMap与Secret
- ConfigMap用于将一些配置文件传递给Pod
- Secret用于将一些敏感信息通过一些安全手段传递给Pod
要求掌握
描述ConfigMap的功能
使用ConfigMap
区分Secret和ConfigMap的区别
使用Secret
目录
- ConfigMap介绍
- Secret介绍
1. ConfigMap介绍
-
痛点
image.png
1.1 ConfigMap的功能
- ConfigMap用于容器的配置文件管理。它作为多个properties文件的应用,类似一个专门存储配置文件的目录,里面存放着各种配置文件
- ConfigMap实现了image和应用程序的配置文件、命令行参数和环境变量等信息解耦
-
ConfigMap和Secrets类似,但ConfigMap用于处理不含敏感信息的配置文件
image.png
1.2 创建config-map
1.2.1 从目录创建
1.创建存放configmap的目录和文件
[root@k8s-master ~]# mkdir ~/configmap
[root@k8s-master ~]# cd ~/configmap
[root@k8s-master configmap]# ls
[root@k8s-master configmap]# vi userinfo
[root@k8s-master configmap]# vi dbinfo
[root@k8s-master configmap]# cat ~/configmap/userinfo
username=aaa
password=bbb
[root@k8s-master configmap]# cat ~/configmap/dbinfo
servername=db1
ip=1.1.1.1
2.通过目录创建configmap,目录中所有的文件都作为配置文件进行创建
[root@k8s-master configmap]# k create configmap info --from-file=/root/configmap
configmap/info created
3.查看configmap的创建结果
[root@k8s-master configmap]# k get configmaps
NAME DATA AGE
info 2 8s
[root@k8s-master configmap]# k describe configmaps info
Name: info
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
userinfo:
----
username=aaa
password=bbb
dbinfo:
----
servername=db1
ip=1.1.1.1
BinaryData
====
Events: <none>
[root@k8s-master configmap]# cat ~/configmap/userinfo
username=aaa
password=bbb
[root@k8s-master configmap]# cat ~/configmap/dbinfo
servername=db1
ip=1.1.1.1
1.2.2 通过指定的文件进行创建
[root@k8s-master configmap]# k create configmap info2 --from-file=/root/configmap/userinfo --from-file=/root/configmap/dbinfo
configmap/info2 created
[root@k8s-master configmap]# k get configmaps
NAME DATA AGE
info 2 6m5s
info2 2 9s
[root@k8s-master configmap]# k describe configmaps info2
Name: info2
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
dbinfo:
----
servername=db1
ip=1.1.1.1
userinfo:
----
username=aaa
password=bbb
BinaryData
====
Events: <none>
[root@k8s-master configmap]#
1.2.3 通过命令直接创建
[root@k8s-master configmap]# k create configmap info3 --from-literal=username=zhangsan --from-literal=password=zhangsan1
configmap/info3 created
[root@k8s-master configmap]# k get con
configmaps controllerrevisions.apps
[root@k8s-master configmap]# k get configmaps
NAME DATA AGE
info 2 9m37s
info2 2 3m41s
info3 2 8s
[root@k8s-master configmap]# k describe cm info3
Name: info3
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
password:
----
zhangsan1
username:
----
zhangsan
BinaryData
====
Events: <none>
[root@k8s-master configmap]#
1.2.4 通过yaml文件创建configmap
[root@k8s-master ~]# vi cm.yaml
[root@k8s-master ~]# ll -tr
[root@k8s-master ~]# cat > cm.yaml << EOF
> apiVersion: v1
> kind: ConfigMap
> metadata:
> name: game-demo
> data:
> # 类属性键;每一个键都映射到一个简单的值
> player_initial_lives: "3"
> ui_properties_file_name: "user-interface.properties"
>
> # 类文件键
> game.properties: |
> enemy.types=aliens,monsters
> player.maximum-lives=5
> user-interface.properties: |
> color.good=purple
> color.bad=yellow
> allow.textmode=true
> EOF
[root@k8s-master ~]# vi cm.yaml
[root@k8s-master ~]# cat cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: info4
data:
# 类属性键;每一个键都映射到一个简单的值
username: "user1"
# 类文件键
dbinfo: |
servername: "server2"
dbname: "db2"
[root@k8s-master ~]# k apply -f ~/cm.yaml
configmap/info4 created
[root@k8s-master ~]# k get configmaps
NAME DATA AGE
info 2 21m
info2 2 15m
info3 2 12m
info4 2 5s
[root@k8s-master ~]# k describe configmaps info4
Name: info4
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
dbinfo:
----
servername: "server2"
dbname: "db2"
username:
----
user1
BinaryData
====
Events: <none>
[root@k8s-master ~]#
1.3 使用configmap
1.3.1 通过环境变量使用
[root@k8s-master ~]# cat /root/cmpod.yaml
apiVersion: v1
kind: Pod
metadata:
name: cm-test-pod
spec:
containers:
- name: cm-container
image: busybox
command: ["/bin/sh","-c","sleep 3000"]
env:
# 定义环境变量
- name: accountname # 请注意这里和 ConfigMap 中的键名是不一样的 想要的新的变量的名字
valueFrom:
configMapKeyRef:
name: info4 # 这个值来自 ConfigMap
key: username # 需要取值的键值进行重命名 将info4中username的值给accountname
envFrom:
#将info2的值全部导进来
- configMapRef:
name: info2
restartPolicy: Always
[root@k8s-master ~]# k apply -f ~/cmpod.yaml
pod/cm-test-pod created
[root@k8s-master ~]# k get pod
NAME READY STATUS RESTARTS AGE
cm-test-pod 1/1 Running 0 21s
[root@k8s-master ~]# k exec -it cm-test-pod -- /bin/sh
/ # env
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
dbinfo=servername=db1
ip=1.1.1.1
HOSTNAME=cm-test-pod
SHLVL=1
HOME=/root
userinfo=username=aaa
password=bbb
TERM=xterm
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
HTTPD_SVC_SERVICE_HOST=10.98.110.166
HTTPD_SVC_PORT_8080_TCP_ADDR=10.98.110.166
KUBERNETES_PORT_443_TCP_PROTO=tcp
HTTPD_SVC_PORT_8080_TCP_PORT=8080
HTTPD_SVC_PORT_8080_TCP_PROTO=tcp
accountname=user1
HTTPD_SVC_SERVICE_PORT=8080
HTTPD_SVC_PORT=tcp://10.98.110.166:8080
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
HTTPD_SVC_PORT_8080_TCP=tcp://10.98.110.166:8080
/ # exit
[root@k8s-master ~]# cat /root/cm
cmpod.yaml cm.yaml
[root@k8s-master ~]# cat /root/cmpod.yaml
apiVersion: v1
kind: Pod
metadata:
name: cm-test-pod
spec:
containers:
- name: cm-container
image: busybox
command: ["/bin/sh","-c","sleep 3000"]
env:
# 定义环境变量
- name: accountname # 请注意这里和 ConfigMap 中的键名是不一样的 想要的新的变量的名字
valueFrom:
configMapKeyRef:
name: info4 # 这个值来自 ConfigMap
key: username # 需要取值的键值进行重命名 将info4中username的值给accountname
envFrom:
#将info2的值全部导进来
- configMapRef:
name: info2
restartPolicy: Always
##看到accountname 和 password username都进来了
1.3.2 通过卷使用
起到传参的作用
[root@k8s-master ~]# cat /root/cmpod2.yaml
apiVersion: v1
kind: Pod
metadata:
name: cmpod2
spec:
containers:
- name: cmpod2
image: busybox
args: [ "/bin/sh","-c","sleep 3000" ]
volumeMounts:
- name: db
mountPath: "/etc/db"
readOnly: true
volumes:
- name: db
configMap:
name: info4
[root@k8s-master ~]# k apply -f ~/cmpod2.yaml
pod/cmpod2 created
[root@k8s-master ~]# k get pod
NAME READY STATUS RESTARTS AGE
cmpod2 1/1 Running 0 23s
[root@k8s-master ~]# k exec -it cmpod2 -- /bin/sh
/ # cd /etc/db
/etc/db # ls
dbinfo username
1.4 ConfigMap使用注意事项
- ConfigMap必须在创建Pod前创建完成。如果Pod调用ConfigMap失败,则无法创建。
- Pod只能使用在同一Namespace中的ConfigMap
- ConfigMap创建方式通常使用文件方式。
- ConfigMap使用方式通常使用volume方式。
- 以volume方式挂载ConfigMap,如果更新ConfigMap或删除重建ConfigMap,Pod内挂载的配置信息会热更新。
2 Secret介绍
2.1Secret概述
- Secret 是一种包含少量敏感信息例如密码、token 或 key 的对象。这样的信息可能会被放在 Pod spec 中或者镜像中;将其放在一个 secret 对象中可以更好地控制它的用途,并降低意外暴露的风险。
- ConfigMap主要解决配置文件的存储问题,而Secret主要用来解决密码、token、密钥等敏感数据。
在创建、查看和编辑Pod的流程中Secret暴露风险较小。 系统会对Secret对象采取额外的预防措施,例如避免将其写入磁盘中可能的位置。
只有Pod请求的Secret在其容器中才是可见的,一个Pod不能访问另一个Pod的Secret。
注:secret主要解决的是安全问题,采用secret创建的参数仅在pod内部可见,在pod外不可见。
2.2 创建secret示例,体验安全性管理
结果:describe出来的结果无法看到secret的内容。
[root@k8s-master ~]# cat /root/cmpod2.yaml
[root@k8s-master configmap]# echo -n "abc" > username
[root@k8s-master configmap]# echo -n "111" > password
[root@k8s-master configmap]# k create secret generic db-user-name --from-file=username --from-file=password
secret/db-user-name created
[root@k8s-master configmap]# k get secrets
NAME TYPE DATA AGE
db-user-name Opaque 2 6s
[root@k8s-master configmap]# k describe secrets db-user-name
Name: db-user-name
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 3 bytes
username: 3 bytes
[root@k8s-master configmap]#
2.3 使用yaml创建(参数内容使用base64编码进行书写)
技巧 :vi在编辑模式中使用命令:r! ,作用:执行一段命令,并将结果写到光标所在位置
[root@k8s-master ~]# cat /root/secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaqur
data:
username: YWRtaW4= # 清单中的字段值是 Base64 字符串
password: MTIzMTIz # 清单中的字段值是 Base64 字符串
# :r!+空格+命令 在vi编辑界面执行命令并将命令结果输出到vi光标位置
# eg :r! echo -n "abc" | base64
[root@k8s-master ~]# k apply -f /root/secret.yaml
secret/mysecret created
[root@k8s-master ~]# k get secrets
NAME TYPE DATA AGE
db-user-name Opaque 2 176m
default-token-75t79 kubernetes.io/service-account-token 3 83d
mysecret Opaqur 2 8s
[root@k8s-master ~]# k describe secrets mysecret
Name: mysecret
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaqur
Data
====
username: 5 bytes
password: 6 bytes
2.4 使用volume创建pod
[root@k8s-master ~]# cat /root/spod.yaml
apiVersion: v1
kind: Pod
metadata:
name: spod
spec:
containers:
- name: spod
image: busybox
args: [ "/bin/sh","-c","sleep 3000" ]
volumeMounts:
- name: secrets
mountPath: "/etc/secret"
readOnly: true
volumes:
- name: secrets
secret:
secretName: mysecret
[root@k8s-master ~]# k apply -f /root/spod.yaml
pod/spod created
[root@k8s-master ~]# k get pod
NAME READY STATUS RESTARTS AGE
spod 1/1 Running 0 21s
[root@k8s-master ~]# k exec -it spod -- /bin/sh
/ # cd /etc/secret/
/etc/secret # ls
password username
/etc/secret # cat username
admin/etc/secret # exit
[root@k8s-master ~]#
2.5 使用item参数创建pod,传指定的键值
apiVersion: v1
kind: Pod
metadata:
name: spod2
spec:
containers:
- image: busybox
name: spod2
args: ["/bin/sh","-c","sleep 3000"]
volumeMounts:
- name: secrets
mountPath: "/etc/secret"
readOnly: true
volumes:
- name: secrets
secret:
secretName: mysecret
items:
- key: password
path: my-group/my-passwd

