🤵 个人博客: https://www.tingyinhu.com
🎨 微信公众号:java编程秀
✏️ 记录基础知识,做大家的备忘录。
🚀 分享前沿技术,做大家的加油站。
📝 如果文章对你有帮助的话,欢迎 「分享⏩在看👀点赞👍收藏📂」,不胜感激!
ConfigMap
ConfigMap是一种比较特殊的存储卷,它的主要作用是用来存储配置信息的。
ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文件或者 JSON 二进制等对象
创建方式
使用yaml方式创建
创建firstconfigmap.yaml,内容如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: firstconfigmap
data:
info: |
username:admin
password:123456
使用firstconfigmap.yaml文件创建ConfigMap
[root@master configMap]# kubectl create -f firstconfigmap.yaml
configmap/firstconfigmap created
[root@master configfile]# kubectl get cm firstconfigmap -o yaml
apiVersion: v1
data:
info: |
username:admin
password:123456
kind: ConfigMap
metadata:
creationTimestamp: "2022-11-28T03:55:46Z"
name: firstconfigmap
namespace: default
resourceVersion: "2715136"
selfLink: /api/v1/namespaces/default/configmaps/firstconfigmap
uid: c927e3c5-a344-4557-882b-4df9f071862f
使用目录创建
configfile目录下创建game.file和ui.properties,内容如下:
[root@master configfile]# cat /root/k8sstudy/configMap/configfile/game.file
version=1.17
name=dave
age=18
[root@master configfile]# cat /root/k8sstudy/configMap/configfile/ui.properties
level=2
color=yellow
$ kubectl create configmap game-config --from-file=docs/user-guide/configmap/kubectl
创建ConfigMap
[root@master configfile]# kubectl create configmap game-config --from-file=/root/k8sstudy/configMap/configfile
[root@master configfile]# kubectl get cm game-config -o yaml
apiVersion: v1
data:
game.file: |
version=1.17
name=dave
age=18
ui.properties: |
level=2
color=yellow
kind: ConfigMap
metadata:
creationTimestamp: "2022-11-28T01:10:55Z"
name: game-config
namespace: default
resourceVersion: "2691042"
selfLink: /api/v1/namespaces/default/configmaps/game-config
uid: a2a59ae1-a829-4fe2-b445-5867ebe71074
–from-file 指定在目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对,键的名字就是文件名,值就是文件的内容
使用文件创建
只要指定为一个文件就可以从单个文件中创建 ConfigMap
[root@master configfile]# kubectl create configmap game-config-2 --from-file=game.file
[root@master configfile]# kubectl get cm game-config-2 -o yaml
apiVersion: v1
data:
game.file: |
version=1.17
name=dave
age=18
kind: ConfigMap
metadata:
creationTimestamp: "2022-11-28T06:04:38Z"
name: game-config-2
namespace: default
resourceVersion: "2733972"
selfLink: /api/v1/namespaces/default/configmaps/game-config-2
uid: ba0a4d4c-11f4-4731-a018-ff4a7a972308
–from-file 这个参数可以使用多次,你可以使用两次分别指定上个实例中的那两个配置文件,效果就跟指定整个目录是一样的
使用字面值创建
使用文字值创建,格式如下:
[root@master configfile]# kubectl create cm ll-config --from-literal=name=dave-l --from-literal=password=pass-l
[root@master configfile]# kubectl get cm ll-config -o yaml
apiVersion: v1
data:
name: dave-l
password: pass-l
kind: ConfigMap
metadata:
creationTimestamp: "2022-11-28T06:18:45Z"
name: ll-config
namespace: default
resourceVersion: "2736035"
selfLink: /api/v1/namespaces/default/configmaps/ll-config
uid: 36a00a9c-a6b5-4651-a332-61a73ab2c690
利用 --from-literal 参数传递配置信息,该参数可以使用多次.
Pod 中使用
使用 ConfigMap 来替代环境变量
创建 cm-env-pod.yaml,内容如下:
apiVersion: v1
kind: Pod
metadata:
name: cm-env-pod
spec:
containers:
- name: cm-env-nginx
image: nginx:1.17.1
command: [ "/bin/sh", "-c", "env" ]
env:
- name: USERNAME
valueFrom:
configMapKeyRef:
name: ll-config
key: name
- name: PASSWORD
valueFrom:
configMapKeyRef:
name: ll-config
key: password
envFrom:
- configMapRef:
name: ll-config
restartPolicy: Never
用 ConfigMap 设置命令行参数
创建 cm-command-pod.yaml,内容如下:
apiVersion: v1
kind: Pod
metadata:
name: cm-command-pod
spec:
containers:
- name: cm-command-nginx
image: nginx:1.17.1
command: [ "/bin/sh", "-c", "echo $(USERNAME) $(PASSWORD)" ]
env:
- name: USERNAME
valueFrom:
configMapKeyRef:
name: ll-config
key: name
- name: PASSWORD
valueFrom:
configMapKeyRef:
name: ll-config
key: password
restartPolicy: Never
通过数据卷使用ConfigMap
在数据卷里面使用 ConfigMap,就是将文件填入数据卷,在这个文件中,键就是文件名,键值就是文件内容
创建 cm-volume-pod.yaml,内容如下:
apiVersion: v1
kind: Pod
metadata:
name: cm-volume-pod
spec:
containers:
- name: cm-volume-pod-nginx
image: nginx:1.17.1
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: game-config
restartPolicy: Never
[root@master configMap]# kubectl exec -it cm-volume-pod /bin/sh
# cd /etc/config
# ls
game.file ui.properties
# cat game.file
version=1.17
name=dave
age=18
# cat ui.properties
level=2
color=yellow
ConfigMap 的热更新
创建 hot-update-deploy.yaml 文件,内容如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: log-config
namespace: default
data:
log_level: INFO
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: hot-update
spec:
replicas: 1
selector:
matchLabels:
run: my-nginx
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx:1.17.1
ports:
- containerPort: 80
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: log-config
[root@master configMap]# kubectl exec `kubectl get pods -l run=my-nginx -o=name|cut -d "/" -f2` cat /etc/config/log_level
INFO
修改 ConfigMap
[root@master configMap]# kubectl edit configmap log-config
configmap/log-config edited
修改 log_level
的值为 DEBUG
等待大概 10 秒钟时间,再次查看环境变量的值
[root@master configMap]# kubectl exec `kubectl get pods -l run=my-nginx -o=name|cut -d "/" -f2` cat /etc/config/log_level
DEBUG
特别注意 :
configMap 如果以 ENV 的方式挂载至容器,修改 configMap 并不会实现热更新
ConfigMap 更新后滚动更新 Pod
更新 ConfigMap 目前并不会触发相关 Pod 的滚动更新,可以通过修改 pod annotations 的方式强制触发滚动更新
[root@master configMap]# kubectl patch deployment hot-update --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20221128001" }}}}}'
在 .spec.template.metadata.annotations
中添加 version/config
,每次通过修改 version/config
来触发滚动更新
更新 ConfigMap 后:
- 使用该 ConfigMap 挂载的 Env 不会同步更新
- 使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新
Secret
Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec 中。Secret 可以以 Volume 或者环境变量的方式使用。
Secret 有三种类型:
- Service Account :用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod 的
/run/secrets/kubernetes.io/serviceaccount
目录中 - Opaque :base64 编码格式的 Secret,用来存储密码、密钥等
- kubernetes.io/dockerconfigjson :用来存储私有 docker 仓库的认证信息
Service Account
Service Account 用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod的 /run/secrets/kubernetes.io/serviceaccount
目录中
[root@master configMap]# kubectl run my-nginx --image nginx:1.17.1
deployment.apps/my-nginx created
[root@master configMap]# kubectl get pods
NAME READY STATUS RESTARTS AGE
my-nginx-867d94c55f-mnc9w 1/1 Running 0 32s
[root@master configMap]# kubectl exec my-nginx-867d94c55f-mnc9w ls /run/secrets/kubernetes.io/serviceaccount
ca.crt
namespace
token
Opaque Secret
创建
Opaque 类型的数据是一个 map 类型,要求 value 是 base64 编码格式:
[root@master secret]# echo -n "admin" | base64
YWRtaW4=
[root@master secret]# echo -n "1a2b3c4d5f6g" | base64
MWEyYjNjNGQ1ZjZn
my-secrets.yml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
password: MWEyYjNjNGQ1ZjZn
username: YWRtaW4=
[root@master secret]# kubectl create -f my-secrets.yml
secret/mysecret created
[root@master secret]# kubectl get secret
NAME TYPE DATA AGE
default-token-dzwqk kubernetes.io/service-account-token 3 47d
mysecret Opaque 2 31s
tls-secret kubernetes.io/tls 2 17d
[root@master secret]# kubectl describe secret mysecret
Name: mysecret
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 12 bytes
username: 5 bytes
使用
Secret 挂载到 Volume 中
apiVersion: v1
kind: Pod
metadata:
labels:
name: seret-pod
name: seret-pod
spec:
volumes:
- name: volumes12
secret:
secretName: mysecret
containers:
- image: nginx:1.17.1
name: secret-nginx
volumeMounts:
- name: volumes12
mountPath: "/data"
[root@master secret]# kubectl exec -it seret-pod /bin/sh
# cd /data
# ls
password username
# cat password
1a2b3c4d5f6g
# cat username
admin
Secret 导出到环境变量中
创建 secret-deploy.yaml 文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: secret-deploy
spec:
replicas: 2
selector:
matchLabels:
app: secret-deploy
template:
metadata:
labels:
app: secret-deploy
spec:
containers:
- name: pod-1
image: nginx:1.17.1
ports:
- containerPort: 80
env:
- name: TEST_USER
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: TEST_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
kubernetes.io/dockerconfigjson
使用 Kuberctl 创建 docker 仓库认证的 secret
[root@master secret]# kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
secret/myregistrykey created
[root@master secret]# kubectl get secret
NAME TYPE DATA AGE
default-token-dzwqk kubernetes.io/service-account-token 3 47d
myregistrykey kubernetes.io/dockerconfigjson 1 50s
mysecret Opaque 2 25m
tls-secret kubernetes.io/tls 2 17d
[root@master secret]# kubectl describe secret myregistrykey
Name: myregistrykey
Namespace: default
Labels: <none>
Annotations: <none>
Type: kubernetes.io/dockerconfigjson
Data
====
.dockerconfigjson: 161 bytes
在创建 Pod 的时候,通过 imagePullSecrets
来引用刚创建的 myregistrykey
apiVersion: v1
kind: Pod
metadata:
name: pull-secret-pod
spec:
containers:
- image: nginx:1.17.1
name: pull-secret-nginx
imagePullSecrets:
name: myregistrykey