一、ConfigMap
什么是configmap
- kubernetes集群可以使用ConfigMap来实现对容器中应用的配置管理。
- 可以把ConfigMap看作是一个挂载到pod中的存储卷
创建ConfigMap的4种方式
创建ConfigMap的方式有4种:
1, 通过直接在命令行中指定configmap参数创建
即(--from-literal=key=value)
kubectl create configmap cm1 --from-literal=host=127.0.0.1 --from-literal=port=3306 kubectl get cm
kubectl describe cm cm1
2, 通过指定文件创建,
即将一个配置文件创建为一个ConfigMap,--from-file=文件路径 echo -n 127.0.0.1 > host echo -n 3306 > port kubectl create configmap cm2 --from-file=./host --from-file=./port kubectl get cm
kubectl describe cm cm2
3, 通过一个文件内多个键值对
( --from-env-file=文件路径 )
vim env.txt
host=127.0.0.1
port=3306
kubectl create configmap cm3 --from-env-file=env.txt kubectl get cm
kubectl describe cm cm3
4, 通过YMAL文件创建
vim cm4.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm4
data:
host: 127.0.0.1
port: "3306"
kubectl apply -f cm4.yml kubectl get cm kubectl describe cm cm4
ConfigMap的2种使用方式
使用ConfigMap有2种方式:
1.通过环境变量的方式传递给pod
vim pod-cm1.yml
apiVersion: v1
kind: Pod
metadata:
name: pod-cm1
spec:
containers:
- name: busybox
image: busybox
args: [ "/bin/sh", "-c", "sleep 10000" ]
envFrom: # env方式
- configMapRef:
name: cm1 # configmap名称
kubectl apply -f pod-cm1.yml
kubectl get pods
kubectl exec pod-cm1 -- env
2.通过volume的方式挂载到pod内
vim pod-cm2.yml
apiVersion: v1
kind: Pod
metadata:
name: pod-cm2
spec:
containers:
- name: busybox
image: busybox
args: [ "/bin/sh", "-c", "sleep 10000" ]
volumeMounts: # 用volume挂载方式
- name: vol-cm # 对应下面的volume名
mountPath: "/etc/mysql" # 挂载到容器内部的路径
readOnly: true # 只读
volumes:
- name: vol-cm # 卷名称
configMap:
name: cm2 # configmap的名称
kubectl apply -f pod-cm2.yml kubectl get pod
kubectl exec pod-cm2 -- ls /etc/mysql
kubectl exec pod-cm2 -- cat /etc/mysql/host
kubectl exec pod-cm2 -- cat /etc/mysql/port
subpath参数拓展讨论
1, 准备一个配置文件
cat index.html
haha
2, 创建configmap
kubectl create configmap nginx-index --from-file=index.html
3, 创建测试pod
vim subpath-cm.yaml
apiVersion: v1
kind: Pod
metadata:
name: subpath-cm
spec:
containers:
- name: c1
image: nginx:1.15-alpine
volumeMounts:
- name: nginx-config
mountPath: /usr/share/nginx/html/index.html # configmap要挂载并覆盖的绝对路径
subPath: index.html # 这里要写相对路径
volumes:
- name: nginx-config
configMap:
name: nginx-index # 对应上面创建的configmap
kubectl apply -f subpath-cm.yaml
4, 进去测试
kubectl exec -it subpath-cm -- /bin/sh
/ # cat /usr/share/nginx/html/index.html
haha # 可以看到主面文件被覆盖了
/ # exit
补充说明: 也可以用nginx.conf做成configmap覆盖/etc/nginx/nginx.conf,但必须是nginx.conf配置文件要能启动容器,否则启不了容器造成测试问题。
ConfigMap的热更新
提问:如果我在宿主机上修改了value, 那么容器内部会不会更新?
- 通过环境变量的方式传递给pod。这种方式不会热更新
- 通过volume的方式挂载到pod内。这种方式会热更新,大概需要半分钟左右。
- 但是使用subpath挂载文件,也不能热更新
验证第1种方式
1, 编辑修改对应的configmap
kubectl edit cm cm1
apiVersion: v1
data:
host: 127.0.0.1
port: "3307" 3306修改成3307
kind: ConfigMap
metadata:
creationTimestamp: "2020-11-07T12:07:04Z"
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:data:
.: {}
f:host: {}
f:port: {}
manager: kubectl
operation: Update
time: "2020-11-07T12:07:04Z"
name: cm1
namespace: default
resourceVersion: "169386"
selfLink: /api/v1/namespaces/default/configmaps/cm1
uid: f06cd44d-2ef9-48f2-9ccc-995f9d9ea2ad
2, 验证对应的pod里的变化,发现很久都不会改变
(环境变量方式)
kubectl exec pod-cm1 -- env |grep port
验证第2种方式
1, 编辑修改对应的configmap
kubectl edit cm cm2
apiVersion: v1
data:
host: 127.0.0.1
port: "3308" 修改成3308
kind: ConfigMap
metadata:
creationTimestamp: "2020-11-07T12:09:15Z"
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:data:
.: {}
f:host: {}
f:port: {}
manager: kubectl
operation: Update
time: "2020-11-07T12:09:15Z"
name: cm2
namespace: default
resourceVersion: "169707"
selfLink: /api/v1/namespaces/default/configmaps/cm2
2, 验证对应的pod里的变化,一段时间后会改变
(卷挂载方式)
kubectl exec pod-cm2 -- cat /etc/mysql/port
二、Secret
什么是secret
Secret与ConfigMap类似,主要的区别是Secret存储的是密文,而ConfigMap存储的是明文。 所以ConfigMap可以用配置文件管理,而Secret可用于密码,密钥,token等敏感数据的配置管理。 kubectl create secret -h
Secret有4种类型:
- Opaque: base64编码格式的Secret,用来存储密码、密钥、信息、证书等,类型标识符为generic
- Service Account: 用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录中
- kubernetes.io/dockerconfigjson: 用来存储私有docker registry的认证信息,类型标识为docker-registry。
- kubernetes.io/tls: 用于为SSL通信模式存储证书和私钥文件,命令式创建类型标识为tls。
创建mysql管理员密码Secret
我们使用Opaque类型来创建mysql密码Secret
1, 将明文密码进行base64编码
Opaque类型密码需要进行base64编码 echo -n 123 |base64
2, 编写创建secret的YAML文件
vim secret-mysql.yml
apiVersion: v1
kind: Secret
metadata:
name: secret-mysql
data:
password: MTIz
3, 创建secret并确认
kubectl apply -f secret-mysql.yml kubectl get secret |grep secret-mysql
Secret的2种使用方式
使用ConfigMap有2种方式:
1.通过环境变量的方式传递给pod**
1, 编写pod的YAML文件使用Secret
vim pod-mysql-secret.yml
apiVersion: v1
kind: Pod
metadata:
name: pod-mysql-secret1
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: secret-mysql # 对应创建的secret名字
key: password
2, 创建pod
kubectl apply -f pod-mysql-secret.yml
3, 验证pod
kubectl get pods
4, 验证传入pod的变量效果
kubectl exec -it pod-mysql-secret1 -- /bin/bash root@pod-mysql-secret1:/# env |grep MYSQL_ROOT_PASSWORD
root@pod-mysql-secret1:/# mysql -p123
2.通过volume的方式挂载到pod内
1, 编写pod的YAML文件使用Secret
[root@master1 ~]# vim pod-mysql-secret2.yml
apiVersion: v1
kind: Pod
metadata:
name: pod-mysql-secret2
spec:
containers:
- name: busybox
image: busybox
args:
- /bin/sh
- -c
- sleep 100000
volumeMounts:
- name: vol-secret # 定义挂载的卷,对应下面定义的卷名
mountPath: "/opt/passwd" # 挂载目录(支持热更新),也可以使用subPath挂载文件(但不支持热更新)
readOnly: true # 只读
volumes:
- name: vol-secret # 定义卷名
secret: # 使用secret
secretName: secret-mysql # 对应创建好的secret名
2, 创建pod
kubectl apply -f pod-mysql-secret2.yml
3, 验证pod
kubectl get pods
4, 验证
kubectl exec pod-mysql-secret2 -- cat /opt/passwd/password
5, 热更新测试
echo -n haha123 |base64
kubectl edit secret secret-mysql
apiVersion: v1
data:
password: aGFoYTEyMw== 密码改成haha123的base64编码
kind: Secret
metadata:
...
kubectl exec pod-mysql-secret2 -- cat /opt/passwd/password