Secret
Secret用来保存密码、token密钥以及一些敏感的k8s资源。这类数据虽然可以存放在镜像当中,但是放在secret当中可以更方便控制。减少暴露的风险。
Secret的作用:保存加密的信息
Secret的类型
docker-registry主要用于存储docker仓库的认证信息,以及docker组件认证信息。(私有)
generic是Secret的默认模式。类型是Opaque。是base64加密编码的secret。用于用户自定义的密码、密钥等等。
tls表示TLS/SSL,用于存储证书和密钥、存储https证书和密钥队
如何创建secret?
1、指定文件提取信息
陈述式的创建方式:
bash
kubectl create secret generic mysecret --from-file=/opt/username.txt --from-file=/opt/passwd.txt
#创建命令
kubectl get secrets
#查看有哪些secret文件
kubectl describe secrets mysecret
#查看指定secret的详细信息
echo username.txt | base64
#以base64的加密方式生成文件内部数据
echo passwd.txt | base64
陈述式需要指定资源创建
默认类型的加密方式:Opaque加密类型
声明式的创建方式:
bash
[root@master01 configmap]# echo "zyg" | base64
enlnCg==
[root@master01 configmap]# echo "hmbb" | base64
aG1iYgo=
#将格式转换为base64格式
创建yaml文件
apiVersion: v1
kind: Secret
metadata:
name: mysecret1
type:
Opaque
data:
username: dXNlcm5hbWUudHh0Cg==
password: cGFzc3dkLnR4dAo=
data内保存的是加密的内容
pod如何来引用Secret?
1、 挂载方式。将secret挂载到pod当中的一个或者多个容器上的卷里面。
2、 把secret作为容器的环境变量
3、 docker-registry可以作为集群拉取镜像时使用。使用secret可以实现免密登录。
挂载的方式来实现
实验举例:
bash
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx:1.22
volumeMounts:
- name: secrets
mountPath: "/etc/secret"
readOnly: false
volumes:
- name: secrets
secret:
secretName: mysecret1
#将创建好的mysecret内的加密内容和容器内的指定目录进行挂载。
kubectl apply -f secret-pod.yaml
kubectl exec -it mypod bash
root@mypod:/etc/secret# cat username
zyg
root@mypod:/etc/secret# cat username1
hmbb
保存内容是加密内容,容器内部可以解密直接引用
把secret作为容器的环境变量
bash
[root@master01 opt]# echo "章鱼哥" | base64
56ug6bG85ZOlCg==
[root@master01 opt]# echo "海绵宝宝" | base64
5rW357u15a6d5a6dCg==
创建secret:
apiVersion: v1
kind: Secret
metadata:
name: mysecret1
type:
Opaque
data:
username: 56ug6bG85ZOlCg==
username1: 5rW357u15a6d5a6dCg==
创建pod:
apiVersion: v1
kind: Pod
metadata:
name: mypod1
spec:
containers:
- name: nginx
image: nginx:1.22
env:
- name: USER
valueFrom:
secretKeyRef:
name: mysecret1
#这里的name指的是secret的名称。
#表示需要用哪个secret来赋值给USER
key: username
- name: USER1
valueFrom:
secretKeyRef:
name: mysecret1
key: username1
#给nginx:1.22这个容器里面传了两个环境变量。这两个变量的值从secret来。分别是两条mysecret1的加密信息
docker-registry
bash
kubectl create secret docker-registry myharbor --docker-server=20.0.0.36 --docker-username=admin --docker-password=123456
#创建docker-registry。指向harbur仓库的IP主机以及账号密码
kubectl describe secrets myharbor
#查看docker-registry的详细信息
apiVersion: v1
kind: Pod
metadata:
name: mypod2
spec:
containers:
- name: nginx2
image: hub.test.com/library/nginx:v1
imagePullSecrets:
- name: myharbor
nodeName: node01
#指定node不走调度策略
ConfigMap
保存的是不需要加密的信息。configmap是1.2引用的功能,应用程序会配置文件,命令参数。以及环境变量中读取信息。
通过configmap在创建容器时,给他注入我们需要的配置信息。既可以是单个的属性也可也是整个文件的配置文件。
陈述式
bash
kubectl create configmap game --from-file=/opt/configmap/zyg.txt --from-file=/opt/configmap/hmbb.txt
#创建configmap
kubectl get cm
#查看configmap有多少个
kubectl describe cm game
#查看指定configmap的详细信息
指定文件创建,可以是一个,也可以是多个。
声明式
bash
apiVersion: v1
kind: ConfigMap
metadata:
name: bqb
data:
zyg: shuai
hmbb: sao
#configmap是键值对形式。一个键对应一个值
kubectl describe cm game
#查看详细信息
引用方式
bash
apiVersion: v1
kind: Pod
metadata:
name: mypod2
spec:
containers:
- name: nginx2
image: nginx:1.22
env:
- name: USER1
valueFrom:
configMapKeyRef:
name: bqb
#这里的name是configmap的名称
key: zyg
- name: USER2
valueFrom:
conigfMapKeyRef:
name: bqb
key: hmbb
挂载的方式
数据卷使用comfigmap
bash
准备一个nginx.conf的配置文件
kubectl create configmap nginx-con --from-file=/opt/configmap/nginx.conf
创建yaml文件
开始修改nginx的html访问页面
使用version/config触发滚动更新机制
bash
kubectl patch deployment nginx1 --patch '{"spec": {"template":{"metadata": {"annotations": {"version/config": "20240116"}}}}}'
实现重启容器
configmap的热更新
热更新的特点:
1、 通过数据卷的形式将配置文件传给pod内的容器
2、 在pod运行的情况下对configmap的配置信息进行修改。直接生效反应到容器当中。
热更新pod不会重启。如果有pod有副本都会一并更改。
3、 configmap的热更新不会触发pod的滚动更新机制。
version/config触发滚动更新机制
bash
kubectal patch deployment nginx1 --path '{"spec": {"template":{"metadata": {"annotations": {"version/config": "20240116"}}}}}'
通过命令触发pod滚动更新,将pod重新拉起,将修改过的configmap重新传递给pod内重新拉起的容器。
secret:主要作用是保存加密文件。使用的方式就是挂载方式。
configMap:把配置信息传递给容器。主要使用方式也是挂载。
configMap热更新机制:热更新可以直接反应到容器的内部。也不会触发pod的更新机制。如果不是需要重启的配置。都可以直接生效。
可以通过version/config的方式来触发滚动更新机制
需要重启的,可以重启pod
更新:就是把配置信息重新传递到容器内。重启也是一样的。
在工作中configMap就是将配置信息传递给容器。通过键值对形式保存的非加密信息。
secret和configMap的区别
secret是加密的信息。
configMap是非加密信息。可以传递配置信息给容器