Configmap配置管理、Secret配置管理
一、Configmap配置管理
1.简介
- Configmap用于保存配置数据,以键值对形式存储。
configMap 资源提供了向 Pod 注入配置数据的方法。
旨在让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。
典型的使用场景:
1.填充环境变量的值
2.设置容器内的命令行参数
3.填充卷的配置文件 ##使用较多
- 创建ConfigMap的方式有4种:
1.使用字面值创建
2.使用文件创建
3.使用目录创建
4.编写configmap的yaml文件创建
- 1.使用字面值创建
$ kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2
- 2.使用文件创建
$ kubectl create configmap my-config-2 --from-file=/etc/resolv.conf
key的名称是文件名称,value的值是这个文件的内容
- 3.使用目录创建
$ kubectl create configmap my-config-3 --from-file=test
目录中的文件名为key,文件内容是value
- 4.编写configmap的yaml文件
$ vim cm1.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm1-config
data:
db_host: "172.25.0.250"
db_port: "3306"
$ kubectl create -f cm1.yaml
2.创建ConfigMap的方式
2.1使用字面值创建
[root@server4 ~]# kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2
configmap/my-config created
[root@server4 ~]# cat /etc/resolv.conf
nameserver 114.114.114.114
[root@server4 ~]# kubectl get cm
NAME DATA AGE
kube-root-ca.crt 1 5d2h
my-config 2 40s
[root@server4 ~]# kubectl describe cm my-config
2.2使用文件创建
[root@server4 ~]# kubectl create configmap my-config-2 --from-file=/etc/resolv.conf #key的名称是文件名称,value的值是这个文件的内容
[root@server4 ~]# kubectl describe cm my-config-2
2.3使用目录创建
[root@server4 ~]# mkdir configmap #放在一个目录方便区分
[root@server4 ~]# cd configmap/
[root@server4 configmap]# mkdir test
[root@server4 configmap]# cp /etc/passwd test/
[root@server4 configmap]# cp /etc/fstab test/
[root@server4 configmap]# ls test/
fstab passwd
[root@server4 configmap]# kubectl create configmap my-config-3 --from-file=test
configmap/my-config-3 created
[root@server4 configmap]# kubectl get cm
[root@server4 configmap]# kubectl describe cm my-config-3
2.4编写configmap的yaml文件
[root@server4 configmap]# vim cm1.yaml
[root@server4 configmap]# cat cm1.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm1-config
data:
db_host: "172.25.15.250"
db_port: "3306"
[root@server4 configmap]# kubectl apply -f cm1.yaml
configmap/cm1-config created
[root@server4 configmap]# kubectl describe cm cm1-config #描述详细信息
3.如何使用configmap
通过环境变量的方式直接传递给pod
通过在pod的命令行下运行的方式
作为volume的方式挂载到pod内
3.1 使用configmap设置环境变量
[root@server4 configmap]# vim pod.yaml
[root@server4 configmap]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: pod1
image: busybox
command: ["/bin/sh", "-c", "env"]
env:
- name: key1
valueFrom:
configMapKeyRef:
name: cm1-config
key: db_host
- name: key2
valueFrom:
configMapKeyRef:
name: cm1-config
key: db_port
restartPolicy: Never
[root@server4 configmap]# kubectl apply -f pod.yaml
pod/pod1 created
[root@server4 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod1 0/1 Completed 0 4m18s
[root@server4 pod]# kubectl logs pod1
3.2 使用conigmap设置命令行参数
[root@server4 pod]# vim pod2.yaml
[root@server4 pod]# cat pod2.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod2
spec:
containers:
- name: pod2
image: busyboxplus
command: ["/bin/sh", "-c", "echo $(db_host) $(db_port)"]
envFrom:
- configMapRef:
name: cm1-config
restartPolicy: Never
[root@server4 pod]# kubectl apply -f pod2.yaml
pod/pod2 created
[root@server4 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod1 0/1 Completed 0 10m
pod2 0/1 Completed 0 5s
[root@server4 pod]# kubectl logs pod2
172.25.15.250 3306
3.3 通过数据卷使用configmap
[root@server4 pod]# vim pod3.yaml
[root@server4 pod]# cat pod3.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod3
spec:
containers:
- name: pod3
image: busyboxplus
command: ["/bin/sh", "-c", "cat /config/db_host"]
volumeMounts:
- name: config-volume
mountPath: /config
volumes:
- name: config-volume
configMap:
name: cm1-config
restartPolicy: Never
[root@server4 pod]# kubectl apply -f pod3.yaml
pod/pod3 created
[root@server4 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod1 0/1 Completed 0 13m
pod2 0/1 Completed 0 2m39s
pod3 0/1 Completed 0 3s
[root@server4 pod]# kubectl logs pod3
4.configmap热更新
[root@server4 configmap]# kubectl delete pod pod3
pod "pod3" deleted
[root@server4 configmap]# vim pod3.yaml
[root@server4 configmap]# cat pod3.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod3
spec:
containers:
- name: pod3
image: busyboxplus
command: ["/bin/sh", "-c", "cat /config/db_host"]
volumeMounts:
- name: config-volume
mountPath: /config
volumes:
- name: config-volume
configMap:
name: cm1-config
restartPolicy: Never
[root@server4 configmap]# kubectl apply -f pod3.yaml
pod/pod3 created
[root@server4 configmap]# kubectl get pod
4.1 vim nginx.conf
[root@server4 configmap]# vim nginx.conf
[root@server4 configmap]# cat nginx.conf
server {
listen 8000;
server_name _;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
[root@server4 configmap]# kubectl create configmap nginxconf --from-file=nginx.conf
configmap/nginxconf created
[root@server4 configmap]# kubectl describe cm nginxconf
4.2 配置 nginx.yaml 热更新
[root@server4 configmap]# vim nginx.yaml
[root@server4 configmap]# kubectl apply -f nginx.yaml
deployment.apps/my-nginx created
[root@server4 configmap]# kubectl get pod -o wide
[root@server4 configmap]# curl 10.244.179.87:8000 #端口8000
[root@server4 configmap]# kubectl edit cm nginxconf
configmap/nginxconf edited
[root@server4 configmap]# kubectl patch deployments.apps my-nginx --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20200219"}}}}}'
deployment.apps/my-nginx patched
[root@server4 configmap]# kubectl get pod -o wide
[root@server4 configmap]# curl 10.244.141.192:8080 #热更新端口为8080
文件
二、Secret配置管理
1.简介
- Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 ssh key。
- 敏感信息放在 secret 中比放在 Pod 的定义或者容器镜像中来说更加安全和灵活。
- Pod 可以用两种方式使用 secret:
作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里。
当 kubelet 为 pod 拉取镜像时使用。
- Secret的类型:
Service Account:Kubernetes 自动创建包含访问 API 凭据的 secret,并自动修改 pod 以使用此类型的 secret。
Opaque:使用base64编码存储信息,可以通过base64 --decode解码获得原始数据,因此安全性弱。
kubernetes.io/dockerconfigjson:用于存储docker registry的认证信息。
2.从文件中创建Secret
[root@server4 configmap]# echo -n 'admin' > ./username.txt
[root@server4 configmap]# echo -n 'westos' > ./password.txt
[root@server4 configmap]# kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
secret/db-user-pass created
[root@server4 configmap]# kubectl get secrets
NAME TYPE DATA AGE
basic-auth Opaque 1 3h13m
db-user-pass Opaque 2 13s
default-token-rnpl9 kubernetes.io/service-account-token 3 5d3h
tls-secret kubernetes.io/tls 2 3h31m
[root@server4 configmap]# kubectl get secrets db-user-pass -o yaml
默认情况下 kubectl get和kubectl describe 为了安全是不会显示密码的内容,可以通过以下方式查看:
3.编写一个 secret 对象
[root@server4 configmap]# echo -n 'admin' | base64
YWRtaW4=
[root@server4 configmap]# echo -n 'westos' | base64
d2VzdG9z
[root@server4 configmap]# vim mysecret.yaml
[root@server4 configmap]# cat mysecret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: d2VzdG9z
[root@server4 configmap]# kubectl create -f mysecret.yaml
secret/mysecret created
[root@server4 configmap]# kubectl get secrets
[root@server4 configmap]# kubectl describe secrets mysecret
4.将Secret挂载到Volume中
[root@server4 configmap]# vim secret1.yaml
[root@server4 configmap]# cat secret1.yaml
apiVersion: v1
kind: Pod
metadata:
name: mysecret
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: secrets
mountPath: "/secret"
readOnly: true
volumes:
- name: secrets
secret:
secretName: mysecret
[root@server4 configmap]# kubectl apply -f secret1.yaml
[root@server4 configmap]# kubectl exec mysecret -- cat /secret/password
westos[root@server4 configmap]#
5. 向指定路径映射 secret 密钥
[root@server4 configmap]# kubectl delete pod mysecret
pod "mysecret" deleted
[root@server4 configmap]# vim secret3.yaml
[root@server4 configmap]# cat secret3.yaml
apiVersion: v1
kind: Pod
metadata:
name: mysecret
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: secrets
mountPath: "/secret"
readOnly: true
volumes:
- name: secrets
secret:
secretName: mysecret
items:
- key: username
path: my-group/my-username
[root@server4 configmap]# kubectl apply -f secret3.yaml
pod/mysecret created
[root@server4 configmap]# kubectl exec mysecret -- cat /secret/my-group/my-username
6.将Secret设置为环境变量
[root@server4 configmap]# kubectl delete pod mysecret
pod "mysecret" deleted
[root@server4 configmap]# vim secret4.yaml
[root@server4 configmap]# cat secret4.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-env
spec:
containers:
- name: nginx
image: nginx
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
[root@server4 configmap]# kubectl apply -f secret4.yaml
pod/secret-env created
[root@server4 configmap]# kubectl get pod
[root@server4 configmap]# kubectl exec secret-env env
环境变量读取Secret很方便,但无法支撑Secret动态更新。
7.kubernetes.io/dockerconfigjson用于存储docker registry的认证信息
访问私有仓库
[root@server4 configmap]# kubectl create secret docker-registry myregistrykey --docker-server=reg.westos.org --docker-username=admin --docker-password=westos --docker-email=
[root@server4 configmap]# vim mypod.yaml
[root@server4 configmap]# cat mypod.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: game2048
image: reg.westos.org/westos/game2048
imagePullSecrets:
- name: myregistrykey #提前写好访问密码
[root@server4 configmap]# kubectl create -f mypod.yaml
pod/mypod created
[root@server4 configmap]# kubectl get pod