目录
????????是k8s的一种资源对象,可以将配置一key-value的形式传递,用来保存不需要加密的配置信息,使用时,Pod可以将其用作环境变量、命令行参数或者存储卷中的配置文件,如果想保存需要加密的数据,使用Secret
????????使用ConfigMap将配置数据和应用程序代码分开
????????官网示例:k8s-configMap
????????创建方式:可以使用kuberctl create configmap 命令基于目录、文件、或者键值对来创建ConfigMap
1、通过目录,创建configMap,先创建目录
[root@k8s-master-1 test]# mkdir -p configmap/configure-pod-container/configmap/
将示例文件下载到目录下
wget https://kubernetes.io/examples/configmap/game.properties --no-check-certificate -O /k8s/kubernetes/cfg/test/configmap/configure-pod-container/configmap/game.properties
wget https://kubernetes.io/examples/configmap/ui.properties --no-check-certificate -O /k8s/kubernetes/cfg/test/configmap/configure-pod-container/configmap/ui.properties
#创建ConfigMap
[root@k8s-master-1 configmap]# kubectl create configmap game-config --from-file=/k8s/kubernetes/cfg/test/configmap/configure-pod-container/configmap/
\configmap/game-config created
[root@k8s-master-1 configmap]# kubectl get cm
NAME DATA AGE
game-config 2 11s
可以看到刚才两个文件的内容被写到configmap里,就可以把configmap挂在到容器里使用
[root@k8s-master-1 configmap]# kubectl describe cm game-config
Name: game-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
game.properties:
----
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
ui.properties:
----
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
Events: <none>
2、------通过单个文件创建configMap-----
[root@k8s-master-1 configmap]# kubectl create cm game-ui-cm --from-file=/k8s/kubernetes/cfg/test/configmap/configure-pod-container/configmap/ui.properties
configmap/game-ui-cm created
[root@k8s-master-1 configmap]# kubectl get cm
NAME DATA AGE
game-config 2 10m
game-ui-cm 1 12s
#创建成功,可以看到configmap里只有ui的配置内容
[root@k8s-master-1 configmap]# kubectl describe cm game-ui-cm 也可以使用[root@k8s-master-1 configmap]# kubectl get cm game-config -oyaml查看
Name: game-ui-cm
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
ui.properties:
----
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
可以修改data部分的键名:--from-file=<我的键名>=<文件路径>,如果不指定名称是按照文件名来命名的。
kubectl create cm game-ui-cm --from-file=ui-pro=/k8s/kubernetes/cfg/test/configmap/configure-pod-container/configmap/ui.properties
3、----也可以通过env环境变量来创建,使用 --from-env-file 创建 在k8s1.23版本之前使用多指定--from-env-file 创建的话,第二个文件会把第一个文件的env替换调,
1.23版本之后,就会叠加到一起,不在被替换调。再此不做演示可以查看官网示例
4、------基于写好的ConfigMao文件创建configmap------
# 创建包含 ConfigMapGenerator 的 kustomization.yaml 文件
[root@k8s-master-1 configmap]# vim kustomization.yaml
configMapGenerator:
- name: game-config-4
labels:
game-config: config-4
files:
- configure-pod-container/configmap/game.properties
或者指定一个键名:比如名为 asd
-asd=configure-pod-container/configmap/game.properties
使用 kubectl apply -f . 来创建
5、------ 基于字面创建configmap ------
[root@k8s-master-1 configmap]# vim kustomization.yaml
configMapGenerator:
- name: special-config-2
literals:
- special.how=very
- special.type=charm
6、基于键值对创建 :使用--from-literal参数,指定键值对内容,可以有多个
语法:
kubectl create cm cm_name --from-literal=key1=valus1 --from-literal=key2=value2
示例:kubectl create cm cm_name --from-literal=prot=3306 --from-literal=hostname=root
7、清理configmap
[root@k8s-master-1 configmap]# kubectl delete configmap game-config-env-file
1、#示例:
#通过命令行方式先创建一个configmap,使用参数:--from-literal
[root@k8s-master-1 configmap]# kubectl create configmap special-config --from-literal=special.how=very
configmap/special-config created
2、#创建一个包含多个键值对的 ConfigMap。
apiVersion: v1
kind: ConfigMap
metadata:
name: special-config
namespace: default
data:
SPECIAL_LEVEL: very
SPECIAL_TYPE: charm
------------使用envFrom 将所有 ConfigMap 的数据定义为容器环境变量,ConfigMap 中的键成为 Pod 中的环境变量名称
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
nodeName: k8s-node-2 #指定到node-2节点
containers:
- name: test-container
image: busybox
imagePullPolicy: IfNotPresent
command: [ "/bin/sh", "-c", "env" ]
envFrom:
- configMapRef:
name: special-config #configMap 名称
env: - - - #或者在pod中直接定义环境变量
- - -
- name: test
value: test-value
- name: mysqlHost
value: 10.10.10.10
- name: port
value: "3306"
restartPolicy: Never
创建完成查看日志就可以看到输出一下环境变量
[root@k8s-master-1 configmap]# kubectl logs -f dapi-test-pod
SPECIAL_LEVEL=very
SPECIAL_TYPE=charm
test=test-value
mysqlHost=10.10.10.10
port=3306
????????在 Pod 规约的?volumes?部分下添加 ConfigMap 名称。 这会将 ConfigMap 数据添加到?volumeMounts.mountPath?所指定的目录 (在本例中为?/etc/config)。?command?部分列出了名称与 ConfigMap 中的键匹配的目录文件。
1、使用上边的configMap
2、创建pod env的多种编写方式
[root@k8s-master-1 configmap]# vim pod-config-volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
nodeName: k8s-node-2
containers:
- name: test-container
image: busybox:1.28.4
imagePullPolicy: IfNotPresent
command: [ "sleep", "3600" ]
volumeMounts:
- name: config-volume #这个是下边自定义的volumes的名字
mountPath: /mnt
- name: xxx
mountPath: /mnt
envFrom:
- configMapRef:
name: special-config
env:
#定义环境变量
- name: SPECIAL_LEVEL # 请注意这里和 ConfigMap 中的键名是不一样的
valueFrom:
configMapKeyRef:
name: special-config # 这个值来自 ConfigMap
key: special_level
- name: SPECIAL_TYPE # 请注意这里和 ConfigMap 中的键名是不一样的
valueFrom:
configMapKeyRef:
name: special-config # 这个值来自 ConfigMap
key: special_type
env:
- name: test
value: test-value
- name: mysqlHost
value: 10.10.10.10
- name: port
value: "3306"
restartPolicy: Never
volumes:
- name: config-volume #自定义
configMap:
name: special-config # 提供你想要挂载的 ConfigMap 的名字
#将 ConfigMap 数据添加到卷中的特定路径,在这里,ConfigMap 中键 SPECIAL_LEVEL 的内容将挂载在 config-volume 卷中 /mnt/keys 文件中。
items:
- key: SPECIAL_LEVEL
path: keys
#可以挂载多个
- name: config-volume2 #自定义
configMap:
name: xxx
[root@k8s-master-1 configmap]# kubectl apply -f pod-config-volume.yaml
pod/dapi-test-pod created
#创建完成进入容器查看
[root@k8s-master-1 configmap]# kubectl exec -it dapi-test-pod sh
/ # cd mnt/
/mnt # cat SPECIAL_TYPE
charm/mnt #显示的是SPECIAL_TYPE 的值
????????Secret:用于存储和管理一些敏感数据,它把想要访问的加密数据存放到Etcd中,然后用户就可以通过在Pod的容器里挂载Volume的方式或者环境变量的方式访问到这些Secret里保存的信息了。
类型:3种
?Secret 特殊字符处理
特殊字符(例如?$、\、*、=?和?!)因此需要转义。在大多数 Shell 中,对密码进行转义的最简单方式是用单引号(')将其括起来,
例如:password='S!B\*d$zDsb='无需转义 或者使用转义字符\ :password="S!B\\\*d\$zDsb="
#创建Secret的几种方式 generic:通用的,一般的加密方式
1、使用命令创建 --from-literal
kubectl create secret generic mysecret1 --from-literal=username=admin --from-literal=password=123456
[root@k8s-master-1 secret]# kubectl get secret
NAME TYPE DATA AGE
default-token-6xh94 kubernetes.io/service-account-token 3 41d
mysecret1 Opaque 2 7s
#查看yaml文件,可以看到已加密
[root@k8s-master-1 secret]# kubectl get secret mysecret1 -oyaml
apiVersion: v1
data:
password: MTIzNDU2
username: YWRtaW4=
2、通过from-file(文件)创建
[root@k8s-master-1 secret]# echo -n 'admin' > ./username.txt
[root@k8s-master-1 secret]#
[root@k8s-master-1 secret]# echo -n '123456' > ./password.txt
[root@k8s-master-1 secret]# kubectl create secret generic mysecret2 --from-file=username.txt --from-file=password.txt
secret/mysecret2 created
#创建成功 结果同上
3、通过--from-env-file创建
创建一个文件,写入信息
[root@master secret]#vim env.txt
username=admin
password=123456
[root@k8s-master-1 secret]# kubectl create secret generic mysecret3 --from-env-file=env.txt
secret/mysecret3 created
#创建成功,查询结果同上
4、通过yaml文件创建
4.1把需要保存的数据加密
[root@k8s-master-1 secret]# echo admin |base64
YWRtaW4K
4.2编写secret 的yaml文件。如果你不希望执行 base64 编码转换,可以使用 stringData 字段代替,如果同时写了data和stringData,则stringData的优先级高,data会被忽略
[root@k8s-master-1 secret]# vim mysecret4.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret4
data:
username: YWRtaW4=
password: MTIzNDU2
#或者使用stringData
stringData:
username: admin
password: "123456" #注意一定要加引号,不然报错,规范问题
1、以volume挂载的方式使用Secret
Secret可以作为数据卷挂载或者作为环境变量暴露给Pod中的容器使用,也可以被系统中的其他资源使用。
在Pod中以文件形式使用secret
1、创建一个Secret,多个Pod可以应用一个Secret
2、修改Pod的定义,在spec.volumes[]加一个volume,给这个volume起个名字,spec.volumes[].volume.secretName记录的是要引用Secret的名字
3、在每个需要使用Secret的容器中添加一项spec.containers[].columeMounts[],指定spec.containers[].volumeMounts[].readOnly=true,spec.containers[].columeMounts[].mountPath要指向一个未被使用的系统路径
4、修改镜像或者命令行使系统可以找到上一步指定的路径,此时Secret中data字段的每一个key都是指定路径下的一个文件名
创建yaml文件
apiVersion: v1
kind: Pod
metadata:
name: secret-test-pod
spec:
nodeName: k8s-node-2
containers:
- name: test-container
image: busybox:1.28.4
imagePullPolicy: IfNotPresent
command: [ "/bin/sh", "-c", "sleep 3600" ]
volumeMounts:
- name: secret-test #这个是自定义的volumes的名字
mountPath: /mnt
readOnly: true #是否只读
restartPolicy: Never
volumes:
- name: secret-test #自定义
secret:
secretName: mysecret2 #要使用的Secret名字
[root@k8s-master-1 secret]# kubectl apply -f secret-pod.yaml
创建完成 进入容器,在/mnt下就可以看到两个文件
/mnt # ls
password.txt username.txt
#测试是否为只读
/mnt # echo admin > username.txt
sh: can't create username.txt: Read-only file system
1.1 自定义容器中的目录
volumes:
- name: secret-test #自定义
secret:
secretName: mysecret2 #要使用的Secret名字
items:
- key: username
path: my-group/my-username #自定义的容器中的目录
- key: password
path: my-group/my-password #自定义的容器中的目录
1.2 如果,现在将secret资源内保存的数据进行更新,那么,使用次数据的应用内,数据是否也会被更新?
会实时更新
示例:更新mysecret2文件,把密码改成admin然后在进入使用secret的容器secret-test-pod 中,看看密码是否被更新
[root@k8s-master-1 secret]# kubectl edit secret mysecret2
secret/mysecret2 edited
[root@k8s-master-1 secret]# kubectl exec -it secret-test-pod -- sh
/mnt # cat password.txt
admin/mnt #此时密码已经被更新了
imagePullSecrets:Pod拉去私有镜像仓库时使用的账户密码,里边的账户信息,会传递给kubelet,然后kubelet就可以拉取有密码仓库里面的镜像
[root@k8s-master-1 secret]# kubectl create secret docker-registry docker-secret \
> --docker-server=hub.docker.com \
> --docker-username=DOCKER_USER \
> --docker-password=DOCKER_PASSWORD \
> --docker-email=DOCKER_EMAIL
secret/docker-secret created
[root@k8s-master-1 secret]# kubectl get secret
NAME TYPE DATA AGE
docker-secret kubernetes.io/dockerconfigjson 1 8s
使用:
在pod中加入imagePullSecrets 和containers是同级
containers:
imagePullSecrets:
- name: docker-secret #创建的docker-registry 名字
2、以环境变量的方式创建secret,多个Pod可以引用同一个Secret,
修改Pod的定义,定义环境变量并使用env[].valueFrom.secretKeyRef指定secret和相应的KEY
[root@k8s-master-1 secret]# vim env-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: env-secret-pod
spec:
nodeName: k8s-node-2
containers:
- name: test-container
image: busybox:1.28.4
imagePullPolicy: IfNotPresent
command: [ "/bin/sh", "-c", "sleep 3600" ]
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret3
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret3
key: passwordd
创建成功,进入容器查看环境变量
[root@k8s-master-1 secret]# kubectl exec -it env-secret-pod -- sh
/ #echo $SECRET_USERNAME
admin
/ # echo $SECRET_PASSWORD
123456
此时 修改secret文件的内容,在进入容器查看的时候,发现容器的信息并没有被更新
????????如果引用Secret数据的应用,会随着secret资源对象内保存的数据的更新,而实时更新,那么应该使用volumes挂载的方式引用资源,因为环境变量的方式引用不会实时更新数据。
ConfigMap和Secret的区别:
相同点:
不同点: