secret
secret的主要作用是存储密码信息,以及往pod里传递文件。secret以键值对的方式存储,
键=值或者是key=value
其中值是通过base64编码过的
创建secret的方法有很多,可以直接指定key,value,也可以把一个文件的内容作为value,还可以直接写yaml文件
secret/mysecret1 created
root@k8sdbamaster:/data/secert# kubectl get secret -n nssec
NAME TYPE DATA AGE
mysecret1 Opaque 2 10s
secret有三种类型
- Opaque : base64编码格式的secret,用来存储密码,密钥等,但数据也通过base64-decode解码得到原始数据,加密性很弱。
- kubernetes.io/dockerconfigjson: 用来存储私有docker registry的认证信息
- kubernetes.io/service-account-token: 用于被serviceaccount引用 创建serviceaccount的时候,kubernetes会默认创建对应的secret.pod如果使用了serviceaccount对应的secret会自动挂载到pod目录/run/secrets/kubernetes.io/serviceaccount
--查看secret的属性和键值对
root@k8sdbamaster:/data/secert# kubectl describe secrets mysecret1 -n nssec
Name: mysecret1
Namespace: nssec
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
xx: 3 bytes
yy: 6 bytes
root@k8sdbamaster:/data/secert# kubectl get secret mysecret1 -n nssec -o yaml
apiVersion: v1
data:
xx: dG9t
yy: cmVkaGF0
kind: Secret
metadata:
creationTimestamp: "2023-09-09T11:06:42Z"
name: mysecret1
namespace: nssec
resourceVersion: "2997695"
uid: 324a18a7-4878-4185-88d3-73b5057bad79
type: Opaque
--通过base64 --decode解码查看键值对的具体值
root@k8sdbamaster:/data/secert# echo "dG9t" | base64 --decode
tomroot@k8sdbamaster:/data/secert# echo "cmVkaGF0" | base64 --decode
redhatroot@k8sdbamaster:/data/secert#
把文件创建为secret,此时文件名作为Key,文件的内容作为value,这种创建secret的作用是把一个文件的内容写入secret中,后面通过卷的方式来引用这个secret
root@k8sdbamaster:/data/secert# kubectl create secret generic mysecret2 --from-file=/etc/hosts -n nssec
--以yaml格式查看secret内容
root@k8sdbamaster:/data/secert# kubectl get secrets mysecret2 -n nssec -o yaml
apiVersion: v1
data:
hosts: MTI3LjAuMC4xIGxvY2FsaG9zdAoxMC4yNy4xMC40NyBrOHNkYmFtYXN0ZXIKMTAuMjcuMTAuNDkgazhzZGJhd29ya2VyMQoxMC4yNy4xMC41MCBrOHNkYmF3b3JrZXIyCgojIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGRlc2lyYWJsZSBmb3IgSVB2NiBjYXBhYmxlIGhvc3RzCjo6MSAgICAgaXA2LWxvY2FsaG9zdCBpcDYtbG9vcGJhY2sKZmUwMDo6MCBpcDYtbG9jYWxuZXQKZmYwMDo6MCBpcDYtbWNhc3RwcmVmaXgKZmYwMjo6MSBpcDYtYWxsbm9kZXMKZmYwMjo6MiBpcDYtYWxscm91dGVycwoK
kind: Secret
metadata:
creationTimestamp: "2023-09-09T11:19:26Z"
name: mysecret2
namespace: nssec
resourceVersion: "2998842"
uid: 4cc010c1-c1e7-47b8-8c5c-0cefa4478583
type: Opaque
--json文件格式查看secret内容
root@k8sdbamaster:/data/secert# kubectl get secrets mysecret2 -n nssec -o jsonpath='{.data.hosts}'
MTI3LjAuMC4xIGxvY2FsaG9zdAoxMC4yNy4xMC40NyBrOHNkYmFtYXN0ZXIKMTAuMjcuMTAuNDkgazhzZGJhd29ya2VyMQoxMC4yNy4xMC41MCBrOHNkYmF3b3JrZXIyCgojIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGRlc2lyYWJsZSBmb3IgSVB2NiBjYXBhYmxlIGhvc3RzCjo6MSAgICAgaXA2LWxvY2FsaG9zdCBpcDYtbG9vcGJhY2sKZmUwMDo6MCBpcDYtbG9jYWxuZXQKZmYwMDo6MCBpcDYtbWNhc3RwcmVmaXgKZmYwMjo6MSBpcDYtYWxsbm9kZXMKZmYwMjo6MiBpcDYtYWxscm91dGVycwoKroot@k8sdbamaster:/data/secert#
--获取具体值
root@k8sdbamaster:/data/secert# kubectl get secrets mysecret2 -n nssec -o jsonpath='{.data.hosts}' | base64 -d
通过创建变量文件的方式创建一个文件来创建secret
变量1=值1
变量2=值2
root@k8sdbamaster:/data/secert# cat env.txt xx=tom yy=redhat root@k8sdbamaster:/data/secert# kubectl create secret generic mysecret4 -n nssec --from-env-file=env.txt secret/mysecret4 created
通过创建yaml文件的方式
root@k8sdbamaster:/data/secert# echo -n 'tom' | base64
dG9t
root@k8sdbamaster:/data/secert# echo -n 'redhat' | base64
cmVkaGF0
root@k8sdbamaster:/data/secert# cat secret5.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret5
namespace: nssec
type: Opaque
data:
xx: dG9t
yy: cmVkaGF0
root@k8sdbamaster:/data/secert# kubectl apply -f secret5.yaml
使用secret
以卷的方式
这种方式主要是在pod的yaml文件中创建一个类型为secret的卷,然后挂载到容器里某个指定的目录。容器创建好之后,会在容器的挂载目录创建一个文件,文件的名字是secret里的key,文件的内容是key对应的value。这种以卷的方式引用secret的主要作用是往pod里传递文件
root@k8sdbamaster:/data/secert# cat pod1.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: pod1
name: pod1
namespace: nssec
spec:
volumes:
- name: xx
secret:
secretName: mysecret2
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: pod1
volumeMounts:
- name: xx
mountPath: "/etc/test"
subPath: issue //如果secret中有多个文件,subPath可以指定从secret中引用哪个文件
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
以变量的方式
变量的值将会使用secretX里的keyX这个键对应的值
env:
- name:
valueFrom:
secretKeyRef:
name: secretX
key: keyX
secret和configmap的区别是secret的值使用base64编码,而configmap不需要