一、Secret定义
由于configMap保存的配置参数都是明文,对于一些用户名密码等需要保密内容显得不那么友好,那么Secret就是用来对敏感性内容进行编码,避免明文,更加安全。
二、Secret特性
三、Secret类型
目前dockercfg新版本废弃了,采用了dockerconfigjson这个类型。
1、Opaque
(1)env环境变量方式
我们对用户名和密码分别通过base64进行编码:
[root@k8s-master01 configmap-update]# echo -n "admin" | base64
YWRtaW4=
[root@k8s-master01 configmap-update]# echo -n "123456789" | base64
MTIzNDU2Nzg5
1)创建secret资源对象
vim 7.secret.yaml
apiVersion: v1
kind: Secret
metadata:name: mysecret
type: Opaque
data:password: MTIzNDU2Nzg5username: YWRtaW4=
[root@k8s-master01 7]# kubectl create -f 7.secret.yaml
secret/mysecret created
[root@k8s-master01 7]# kubectl get secret
NAME TYPE DATA AGE
mysecret Opaque 2 11s
查看mysecret:
[root@k8s-master01 7]# kubectl describe secret mysecret
Name: mysecret
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
username: 5 bytes
password: 9 bytes
[root@k8s-master01 7]# kubectl get secret mysecret -o yaml
apiVersion: v1
data:
password: MTIzNDU2Nzg5
username: YWRtaW4=
kind: Secret
metadata:
creationTimestamp: "2025-02-01T07:31:52Z"
name: mysecret
namespace: default
resourceVersion: "924842"
uid: 3559a248-d669-4185-9022-9533a7ed38f6
type: Opaque
2)创建Deployment控制器
vim 8.deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: opaque-secret-envname: opaque-secret-env-deploy
spec:replicas: 5selector:matchLabels:app: op-se-env-podtemplate:metadata:labels:app: op-se-env-podspec:containers:- image: nginx:v1name: myapp-continaerports:- containerPort: 80env:- name: TEST_USERvalueFrom:secretKeyRef:name: mysecretkey: username- name: TEST_PASSWORDvalueFrom:secretKeyRef:name: mysecretkey: password
进入某一个opaque-secret-env-deploy容器内部查看环境变量:
从结果显示,所创建deployment资源清单文件指明的环境变量都应用到了pod容器内部,并且将secret对象里面的vaule编码后的值给反编码回了明文内容。
(2)Volumen卷挂载方式
实验1:
vim 9.pod.yaml
apiVersion: v1
kind: Pod
metadata:labels:name: secret-volumename: secret-volume-pod
spec:volumes:- name: volumes12secret:secretName: mysecret #secret下面没有items指明把哪些key-vaule挂载的话,就是把整个scret整个内容挂载containers:- image: nginx:v1name: myapp-containervolumeMounts:- name: volumes12mountPath: "/data"
创建pod成功后,进入pod查看在/data目录下是否成功挂载。
可以看出,通过secret将其形成卷,然后在pod中挂载该卷到内部目录中。并且在内部目录文件数据里面已经是明文方式了,也就是说pod挂载的时候会将其解码成明文。
实验2:
另外,也可以通过在创建pod的时候在资源清单中,指明读写模式defaultMode:256
我们删除原来的pod,重新创建新的pod。
结果:确实修改文件读写权限。
实验3:
我们验证下在volume挂载项中,指明只要特定参数。在pod中查看是否确实只挂载到了特定参数。
首先修改之前的yaml文件,指定只挂载username参数。并且指定挂载到my-group/my-username文件上面。由于在卷挂载volumenMounts有mountPaht: "/data",所以连起来最终挂载路径为:
/data/my-group/my-username
结果:确实只把username挂载到了pod内部目录上。并把username值写入了文件里面。
注意:选择其中一部分进行挂载,是不支持热更新的。从我们截图上可以看到my-username不是软链接文件。
热更新实验
1)删除当前的pod,使用9.pod.yaml创建pod。
[root@k8s-master01 7]# kubectl create -f 9.pod.yaml
pod/secret-volume-pod created
[root@k8s-master01 7]# kubectl get pod
NAME READY STATUS RESTARTS AGE
secret-volume-pod 1/1 Running 0 5s
2)进入pod,查看数据。
3)base64编码新的username
[root@k8s-master01 configmap-update]# echo -n 'flyinlinux' | base64
Zmx5aW5saW51eA==
4)修改secret中的username的值。
保存退出。
通过get secret -o yaml命令查看修改的结果:
我们等待一段时间后,在pod里面查看username的值。
(3)可设置不可更改
同configMap一样,可以在资源清单中通过增加immutable: true的参数设定secret不可更改。
具体就不演示了。