一、Secret
1.1 Secret定义
Secret是用来保存密码、token、密钥等敏感数据的k8s资源,这类数据虽然也可以存放在Pod或者镜像中,但是放在Secret中是为了更方便的控制如何使用数据,并减少暴露的风险。
1.2 Secret类型
- kubernetes.io/service-account-token:由Kubernetes自动创建,用来访问APIServer的 Secret,Pod 会默认使用这个Secret与APIServer通信, 并且会自动挂载到Pod的 /run/secrets/kubernetes.io/serviceaccount目录中
- Opaque:base64 编码格式的Secret,用来存储用户自定义的密码、密钥等,默认的Secret 类型
- kubernetes.io/dockerconfigjson:用来存储私有docker registry的认证信息
1.3 使用secret方式
- 作为挂载到一个或多个容器上的卷中的文件。
- 作为容器的环境变量。
- 由 kubelet 在为Pod拉取镜像时使用。
1.4 Secret应用场景
Secrets | KubernetesA Secret is an object that contains a small amount of sensitive data such as a password, a token, or a key. Such information might otherwise be put in a Pod specification or in a container image. Using a Secret means that you don't need to include confidential data in your application code.Because Secrets can be created independently of the Pods that use them, there is less risk of the Secret (and its data) being exposed during the workflow of creating, viewing, and editing Pods.https://kubernetes.io/docs/concepts/configuration/secret/
二、Secret应用实例
2.1 创建Secret
2.1.1 用kubectl create secret命令创建Secret,在Kubernetes集群中创建一个名为mysecret的通用(generic)类型的Secret对象,并从本地文件中加载用户名和密码信息作为Secret的数据
这个命令执行的操作包括:
- 创建一个名为mysecret的通用类型的Secret对象。
- 使用--from-file选项从本地文件中加载数据,其中username.txt文件的内容将作为Secret对象中的用户名数据,而password.txt文件的内容将作为Secret对象中的密码数据。
这样,Kubernetes将会创建一个包含用户名和密码信息的Secret对象,可以在容器中挂载并使用这些敏感数据,而无需明文暴露在Pod的配置文件中。
get或describe指令都不会展示secret的实际内容,这是出于对数据的保护的考虑
2.1.2 内容用base64编码,创建Secret
2.1.2.1 base64编码
echo -n zhangsan | base64
echo -n bac1234 | base64
2.1.2.2 编辑yaml文件
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: secrets
mountPath: "/etc/secrets"
readOnly: true
volumes:
- name: secrets
secret:
secretName: mysecret
#指定了一个名为secrets的卷(volume),并将一个名为mysecret的Secret对象挂载到这个卷上。这样,Pod 中的容器就可以访问这个Secret对象中存储的敏感数据。
2.1.2.3 运行yaml文件
2.1.2.4 加密显示secret
2.2 使用Secret方式
2.2.1 将Secret挂载到Volume中,以Volume的形式挂载到Pod的某个目录下
2.2.1.1 编辑yaml文件
apiVersion: v1
kind: Pod
metadata:
name: mypod1
spec:
containers:
- name: nginx
image: nginx
env:
- name: TEST_USER
valueFrom:
secretKeyRef:
name: mysecret1
key: username
- name: TEST_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret1
key: password
2.2.1.2 运行yaml文件
kubectl create -f secret-test.yaml
kubectl get pod
2.2.1.3 运行mypod,查看账户密码
kubectl exec -it mypod sh
2.2.2 将secret挂载到环境变量调用
2.2.2.1 编辑yaml文件
apiVersion: v1
kind: Pod
metadata:
name: mypod1
spec:
containers:
- name: nginx
image: nginx
env:
- name: TEST_USER
valueFrom:
secretKeyRef: #调用,此处调用的是kubectl get secret创建出来的mysecret1
name: mysecret1
key: username
- name: TEST_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret1
key: password
2.2.2.2 运行yaml文件
2.2.2.3 运行mypod,查看账户密码
三、ConfigMap
3.1 configmap定义
与Secret类似,区别在于ConfigMap保存的是不需要加密配置的信息。
3.2 configmap应用场景
- ConfigMap功能在Kubernetes1.2版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API给我们提供了向容器中注入配置信息的机制,ConfigMap可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON二进制对象。
- 应用场景:应用配置
3.3 应用示例
3.3.1 创建Configmap
3.3.1.1 导入nginx.conf配置文件
导入配置文件方式
导入nginx.conf配置文件
kubectl create configmap nginx-config -h(不会后面的参数可以使用h)查看
kubectl create configmap nginx-config --from-file=nginx.conf
列出当前集群中的所有ConfigMap对象,并显示它们的名称、命名空间、数据等信息——kubectl get cm
含义:
kubectl create configmap nginx-config --from-file=nginx.conf:在当前创建一个名为nginx-config的configmap对象并将nginx.conf中的内容转移到该对象中。如果当前目录下没有nginx.conf文件,则会出现错误
kubectl get cm——列出当前集群中的所有ConfigMap对象,并显示它们的名称、命名空间、数据等信息
3.3.1.2 查看nginx-config详细信息
3.3.1.3 使用目录创建
3.3.1.3.1 编辑game.properties
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
3.3.1.3.2 编辑
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
3.3.1.3.3 指定在目录下的所有文件都会被用在ConfigMap里面创建一个键值对
3.3.1.3.4 以yaml格式查看game-config详细信息
3.3.1.4 使用文件创建
只要指定为一个文件就可以从单个文件中创建ConfigMap,–from-file 这个参数可以使用多次,即可以使用两次分别指定上个实例中的那两个配置文件,效果就跟指定整个目录是一样的
3.3.1.4.1 --from-file用来分别指定配置文件
3.3.1.4.2 以yaml查看game-config-2
3.3.1.4.3 详细查看game-config-2
3.3.1.5 使用字面值创建
3.3.1.5.1 使用文字值创建,利用--from-literal参数传递配置信息,该参数可以使用多次
3.3.1.5.2 清除所有cm和pod
3.3.1.5.3 举例说明
3.3.1.5.3.1 编辑内容,使用文字值创建,利用--from-literal参数传递配置信息
3.3.1.5.3.2 查看详细信息
3.3.1.5.4 调用方式
3.3.1.5.4.1 编辑web-blue.yaml文件
apiVersion: v1
kind: Pod
metadata:
name: mypod-cm-web
labels:
run: myapp-cm-web
spec:
volumes:
- name: web-cm
configMap:
name: web-nj
containers:
- name: myapp-cm-web
image: soscscs/myapp:v1
ports:
- containerPort: 80
volumeMounts:
- name: web-cm
mountPath: /usr/share/nginx/html
3.3.1.5.4.2 运行yaml文件
3.3.2 Pod中使用ConfigMap
3.3.2.1 使用ConfigMap来替代环境变量
3.3.2.1.1 编辑env.yaml文件
apiVersion: v1
kind: ConfigMap
metadata:
name: special-config
namespace: default
data:
special.how: very
special.type: good
---
apiVersion: v1
kind: ConfigMap
metadata:
name: env-config
namespace: default
data:
log_level: INFO #记录信息level(正常级别)日志
3.3.2.1.2 运行env.yaml文件
3.3.2.1.3 编辑test-pod文件
3.3.2.1.4 运行yaml文件
3.3.2.1.5 查看test-pod日志信息
3.3.2.2 用ConfigMap设置命令行参数
3.3.2.2.1 编辑test-pod2.yaml文件
apiVersion: v1
kind: Pod
metadata:
name: test-pod2
spec:
containers:
- name: busybox
image: busybox:1.28.4
command:
- /bin/sh
- -c
- echo "$(SPECIAL_HOW_KEY) $(SPECIAL_TYPE_KEY)"
env:
- name: SPECIAL_HOW_KEY
valueFrom:
configMapKeyRef:
name: special-config
key: special.how
- name: SPECIAL_TYPE_KEY
valueFrom:
configMapKeyRef:
name: special-config
key: special.type
envFrom:
- configMapRef:
name: env-config
restartPolicy: Never
3.3.2.2.2 运行yaml文件
3.3.2.2.3 查看test-pod日志信息
3.3.2.3 通过数据卷插件使用ConfigMap
在数据卷里面使用ConfigMap,就是将文件填入数据卷,在这个文件中,键就是文件名,键值就是文件内容
3.3.2.3.1 编辑test-pod.yaml文件
apiVersion: v1
kind: Pod
metadata:
name: test-pod3
spec:
containers:
- name: busybox
image: busybox:1.28.4
command: [ "/bin/sh", "-c", "sleep 36000" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: special-config
restartPolicy: Never
3.3.2.3.2 运行yaml文件
3.3.2.3.3 进入test-pod3查看内容
3.3.2.4 ConfigMap的热更新
相关标签查看可用命令——kubectl api-resources
3.3.2.4.1 编辑test-pod4文件
#ConfigMap 的热更新(如果少加参数可以在外面直接热更新)
apiVersion: v1
kind: ConfigMap
metadata:
name: log-config
namespace: default
data:
log_level: INFO
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
replicas: 1
selector:
matchLabels:
app: my-nginx
template:
metadata:
labels:
app: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: log-config
3.3.2.4.2 运行yaml文件
3.3.2.4.3 进入my-nginx-xxxx查看内容
3.3.2.4.4 查看log-config
3.3.2.4.5 数据同步更新
3.3.2.4.6 ConfigMap更新后滚动更新Pod
更新ConfigMap目前并不会触发相关Pod的滚动更新,可以通过在 .spec.template.metadata.annotations中添加version/config ,每次通过修改version/config来触发滚动更新
更新ConfigMap后:
- 使用该ConfigMap挂载的Env不会同步更新。
- 使用该ConfigMap挂载的Volume中的数据需要一段时间(实测大概10秒)才能同步更新。