目錄
一、Secret概述
二、Secret 類型
kubectl 創建類型
三、Secret 使用
Opaque 類型 Secret 的使用
創建
yaml
一、Secret概述
k8s secrets用于存儲和管理一些敏感數據,比如密碼,token,密鑰等敏感信息。它把 Pod 想要訪問的加密數據存放到 Etcd 中。然后用戶就可以通過在 Pod 的容器里掛載 Volume 的方式或者環境變量的方式訪問到這些 Secret 里保存的信息了。
Secret 類似于 ConfigMap,但專門用于保存機密數據。
二、Secret 類型
內置類型 | 用法 |
---|---|
Opaque | 用戶定義的任意數據 |
kubernetes.io/service-account-tokensymotion | 服務賬號令牌 |
kubernetes.io/dockercfg | ~/.dockercfg 文件的序列化形式 |
kubernetes.io/dockerconfigjson | ~/.docker/config.json 文件的序列化形式 |
kubernetes.io/basic-auth | 用于基本身份認證的憑據 |
kubernetes.io/ssh-auth | 用于 SSH 身份認證的憑據 |
kubernetes.io/tls | 用于 TLS 客戶端或者服務器端的數據 |
bootstrap.kubernetes.io/token | 啟動引導令牌數據 |
kubectl 創建類型
[root@k8s-master01 ~]# kubectl create secret dotfile -h
Create a secret using specified subcommand.
?
Available Commands:docker-registry ? 創建一個給 Docker registry 使用的 secretgeneric ? ? ? ? ? Create a secret from a local file, directory, or literal valuetls ? ? ? ? ? ? ? 創建一個 TLS secret
?
Usage:kubectl create secret [flags] [options]
?
Use "kubectl <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).
-
docker-registry
: 連接私有鏡像倉庫的憑證(據) -
generic
: 常見 secret, 該類型 secret 與 configmap使用相同 -
tls
: 提供 tls 證書, 在 service mesh 中自動掛載
三、Secret 使用
使用場景:
-
設置容器的環境變量
-
向 Pod 提供 SSH 密鑰或密碼等憑據
-
允許 kubelet 從私有鏡像倉庫中拉取鏡像
Opaque 類型 Secret 的使用
創建
[root@k8s-master ~]# kubectl get secrets -n calico-apiserver
NAME TYPE DATA AGE
calico-apiserver-certs Opaque 2 7d[root@k8s-master ~]# kubectl describe secrets -n calico-apiserver
Name: calico-apiserver-certs
Namespace: calico-apiserver
Labels: <none>
Annotations: <none>Type: OpaqueData
====
tls.crt: 2530 bytes
tls.key: 1679 bytes[root@k8s-master ~]# kubectl create secret
docker-registry (創建一個給 Docker registry 使用的 Secret)
generic (Create a secret from a local file, directory, or literal value)
tls (創建一個 TLS secret)#它的選項跟configmap是一樣的
[root@k8s-master ~]# kubectl create secret generic s1 --from-
--from-env-file (Specify the path to a file to read lines of key=val pairs to create a secret.)
--from-file (Key files can be specified using their file path, in which case a default name will b…)
--from-literal (Specify a key and literal value to insert in secret (i.e. mykey=somevalue))#創建的secret的名字可以自定義,這里定義名稱為s1
[root@k8s-master ~]# kubectl create secret generic s1 --from-literal k1=v1
secret/s1 created[root@k8s-master ~]# kubectl describe secrets s1
Name: s1
Namespace: default
Labels: <none>
Annotations: <none>Type: OpaqueData #數據
====
k1: 2 bytes #所占字節數#中文字符,一個字符等于三個字節
[root@k8s-master ~]# kubectl create secret generic s2 --from-literal k2=超哥
secret/s2 created[root@k8s-master ~]# kubectl describe secrets s2
Name: s2
Namespace: default
Labels: <none>
Annotations: <none>Type: OpaqueData
====
k2: 6 bytes
明文加密,密文解密簡單演示
secret它是可以自動解密的
在創建過程它解密中不可以使用明文,會報錯,所以要用密文
#加密
[root@k8s-master ~]# echo 1234 | base64
MTIzNAo=#解密
[root@k8s-master ~]# echo MTIzNAo= | base64 -d
1234#像這種明文解密是會報錯的
#所以不能使用明文加密
[root@k8s-master ~]# echo 12345 | base64 -d
�m�64: 無效的輸入#查看secret中的s1詳細信息
[root@k8s-master ~]# kubectl get secrets s1 -o yaml
apiVersion: v1
data:k1: djE= #把k1加密為這個
kind: Secret
metadata:creationTimestamp: "2025-08-18T16:23:37Z"name: s1namespace: defaultresourceVersion: "836505"uid: 7f0863fc-82a2-409e-abf6-6de72a20c81b
type: Opaque[root@k8s-master ~]# echo djE= | base64 -d
v1[root@k8s-master ~]# #之前我們定義了k1等于v1,這里base64解密出來后就是v1
yaml
以 yaml 方式創建需要你提前進行 base64
secret它是可以自動解密的
在創建過程它解密中不可以使用明文,會報錯,所以要用密文
#yaml文件
以 yaml 方式創建需要你提前進行 base64[root@k8s-master01 ~]# echo -n "admin" | base64
YWRtaW4=
[root@k8s-master01 ~]# echo -n "123456" | base64
MTIzNDU2#創建yaml文件,添加下面這段就行 apiVersion: v1
kind: Secret
metadata:name: secret-volumenamespace: default
type: Opaque
data:password: MTIzNDU2username: YWRtaW4=
immutable: true