1.Secret
存储密钥信息资源
Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源,这类数据虽然也可以存放在 Pod 或者镜像中,但是放在 Secret 中是为了更方便的控制如何使用数据,并减少暴露的风险。
Secret 有四种类型:
●kubernetes.io/service-account-token:由 Kubernetes 自动创建,用来访问 APIServer 的 Secret,Pod 会默认使用这个 Secret 与 APIServer 通信, 并且会自动挂载到 Pod 的 /var/run/secrets/kubernetes.io/serviceaccount 目录中;
●Opaque :base64 编码格式的 Secret,用来存储用户自定义的密码、密钥等,默认的 Secret 类型;
●kubernetes.io/dockerconfigjson :用来存储私有 docker registry 的认证信息。
●kubernetes.io/tls :用来存储 TLS 证书和私钥信息。
Pod 需要先引用才能使用某个 secret,Pod 有 3 种方式来使用 secret:
●作为挂载到一个或多个容器上的卷 中的文件。
●作为容器的环境变量。
●由 kubelet 在为 Pod 拉取镜像时使用
1.1 Opaque的创建、使用
kubectl create -n xy101 secret generic liliang-cecret --from-file=./username.txt --from-file=./password.txt
![](https://i-blog.csdnimg.cn/direct/eefbebad1c1049fd9a6ba3d0e4a70257.png)
kubectl create secret -n xy101 generic li-secret --from-file=demo/
![](https://i-blog.csdnimg.cn/direct/76a7d4d405124c1ab5000b5016b47350.png)
kubectl create -n xy101 secret generic scj-secret --from-literal=myname=scj --from-literal=myclass=xy101
![](https://i-blog.csdnimg.cn/direct/2cb0ed0d66264a398de1204fd34d9744.png)
挂载方式引用Opaque
vim demo1-pod.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: demo1-pod
name: demo1-pod
namespace: xy101
spec:
volumes:
- name: secret-vol
secret:
secretName: liliang-cecret
containers:
- image: nginx
name: myapp
ports:
- containerPort: 80
resources: {}
volumeMounts:
- name: secret-vol
mountPath: /mnt
dnsPolicy: ClusterFirst
restartPolicy: Always
![](https://i-blog.csdnimg.cn/direct/ab4f6d6320f44061a224397c46e6176e.png)
环境变量方式引用
diff
vim demo2-pod.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: demo2-pod
name: demo2-pod
namespace: xy101
spec:
containers:
- image: nginx
name: myapp
ports:
- containerPort: 80
resources: {}
env:
- name: MYSCHOOL
valueFrom:
secretKeyRef:
name: scj-secret
key: myname
envFrom:
- secretRef:
name: scj-secret
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
![](https://i-blog.csdnimg.cn/direct/b65397cd13ad49f889990f113a30368d.png)
2.ConfigMap
存储配置资源
与Secret类似,区别在于ConfigMap保存的是不需要加密配置的信息。
ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API 给我们提供了向容器中注入配置信息的机制,ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON二进制大对象。
应用场景:应用配置
2.1 创建 ConfigMap
方法1:
只要指定为一个文件就可以从单个文件中创建 ConfigMap
--from-file 这个参数可以使用多次,即可以使用两次分别指定上个实例中的那两个配置文件
kubectl create cm demo-cm --from-file=chen.cfg --from-file=tan.cfg
![](https://i-blog.csdnimg.cn/direct/3683b1b9fc304ae58a8cf9365e2a01b7.png)
--from-file 指定在目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对,键的名字就是文件名,值就是文件的内容
kubectl create cm demo1-cm --from-file=configmap/
![](https://i-blog.csdnimg.cn/direct/8a4c82ea16264577bd3ee49948f30a26.png)
方法2:
使用文字值创建,利用 --from-literal 参数传递配置信息
kubectl create cm kv-cm --from-literal=myname=scj --from-literal=myclass=xy101 --from-literal=mylove=tangjun
![](https://i-blog.csdnimg.cn/direct/d18d085e154f4f0dabc5297400974b57.png)
2.2 Pod 中使用 ConfigMap
作为数据卷挂载使用
vim demo1-pod.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: demo-pod
name: demo-pod
spec:
volumes:
- name: cm-vol #定义存储卷名称
configMap:
name: demo-cm #指定cm资源名称
containers:
- image: soscscs/myapp:v1
name: myapp
ports:
- containerPort: 80
resources: {}
volumeMounts: #指定挂载容器信息
- name: cm-vol
mountPath: /mnt
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
![](https://i-blog.csdnimg.cn/direct/ac32e2a9bd7740ffafe1ad0183bbf6f4.png)
作为环境变量引用使用
vim demo2-pod.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: demo2-pod
name: demo2-pod
spec:
containers:
- image: soscscs/myapp:v1
name: myapp
ports:
- containerPort: 80
resources: {}
env: #指定环境变量
- name: MYNAME
value: tc
- name: MYCLASS
valueFrom: #变量值从什么地方而来
configMapKeyRef:
name: kv-cm
key: myclass
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
![](https://i-blog.csdnimg.cn/direct/b482caa79ce745bfa10c98ee59fbf08d.png)
vim demo3-pod.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: demo3-pod
name: demo3-pod
spec:
containers:
- image: soscscs/myapp:v1
name: myapp
ports:
- containerPort: 80
resources: {}
envFrom:
- configMapRef:
name: kv-cm
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
![](https://i-blog.csdnimg.cn/direct/6f95ad7d23ea4fa39c270332fa329da6.png)
补充
kubectl create cm web-cm --from-file=./
vim demo4-pod.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: demo4-pod
name: demo4-pod
spec:
volumes:
- name: web-vol
configMap:
name: web-cm
containers:
- image: soscscs/myapp:v1
name: myapp
ports:
- containerPort: 80
resources: {}
volumeMounts:
- name: web-vol
mountPath: /usr/share/nginx/html
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
kubectl apply -f demo4-pod.yaml
kubectl edit cm web-cm 修改其中的chen.html为tc
通过数据卷挂载使用的支持热更新
vim demo3-pod.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: demo3-pod
name: demo3-pod
spec:
containers:
- image: soscscs/myapp:v1
name: myapp
ports:
- containerPort: 80
resources: {}
envFrom:
- configMapRef:
name: kv-cm
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
![](https://i-blog.csdnimg.cn/direct/1180b88c2fc0496e829338b0a70133d0.png)
kubectl edit cm kv-cm
需改其中myclass为xy102
环境变量引用的方式使用configmap在线修改内容不会进行更新
![](https://i-blog.csdnimg.cn/direct/2c13c4eba4d0403fb26aeba94160be37.png)
挂载时如何不覆盖原本目录的内容进行挂载?
此种方法也不支持热更新
![](https://i-blog.csdnimg.cn/direct/9d16e5a000ef4dd28667fbab2da2244f.png)