Kubernetes-Secret使用说明

本文介绍Kubernetes中Secret资源的使用,包括如何创建和使用Secret来安全地存储敏感数据,如密码和密钥,以及如何在Pod中通过环境变量或Volume挂载的方式访问这些Secret。

Kubernetes提供Secret资源用于解决密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中。Secret可以以Volume或者环境变量的方式使用。

Secret类型

  • Opaque:base64编码格式的Secret,用来存储密码、密钥等;但数据也通过base64 –decode解码得到原始数据,所有加密性很弱。
  • kubernetes.io/dockerconfigjson:用来存储私有docker registry的认证信息。
  • kubernetes.io/service-account-token: 用于被serviceaccount引用。serviceaccout创建时Kubernetes会默认创建对应的secret。Pod如果使用了serviceaccount,对应的secret会自动挂载到Pod目录/run/secrets/ kubernetes.io/serviceaccount中。

常用的应用主要使用Opaque类型的Secret,本次我们主要介绍该类型

Secret的创建方式

1. 通过yaml文件创建

[root@k8s-node1 dinghh]# cat passwd-secret.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: passwd-secret 
type: Opaque 
data: 
  username: dXNlcm5hbWUK
  password: cGFzc3dvcmQK

其中username和password是根据base64加密

[root@k8s-node1 dinghh]# echo username | base64
dXNlcm5hbWUK
[root@k8s-node1 dinghh]# echo password | base64
cGFzc3dvcmQK

创建secret

[root@k8s-node1 dinghh]# kubectl create -f passwd-secret.yaml 
secret/passwd-secret created

[root@k8s-node1 dinghh]# kubectl get secrets passwd-secret -oyaml
apiVersion: v1
data:
  password: cGFzc3dvcmQK
  username: dXNlcm5hbWUK
kind: Secret
metadata:
  creationTimestamp: "2019-07-02T06:20:40Z"
  name: passwd-secret
  namespace: default
  resourceVersion: "995896"
  selfLink: /api/v1/namespaces/default/secrets/passwd-secret
  uid: 83644454-9c91-11e9-ad16-fa163e17fab9
type: Opaque

可以看到通过describe secret是可以看到secret中的具体数据的,通过base64解码则可以看到原始数据

[root@k8s-node1 dinghh]# echo dXNlcm5hbWUK | base64 --decode
username
[root@k8s-node1 dinghh]# echo cGFzc3dvcmQK | base64 --decode
password

2. 通过kubectl指定配置文件等参数来创建

kubectl create secret generic

根据配置文件、目录或指定的literal-value创建secret。

secret可以保存为一个或多个key/value信息。

当基于配置文件创建secret时,key将默认为文件的基础名称,value默认为文件内容。如果基本名称的key无效,则可以指定另一个key。

当基于目录创建secret时,key还是文件的基础名称,目录中有效的key的每个文件都被打包到secret中,除了常规文件之外的任何目录条目都被忽略(例如subdirectories, symlinks, devices, pipes, etc)。

基于文件创建(更多创建方式参考:http://docs.kubernetes.org.cn/556.html

[root@k8s-node1 dinghh]# echo username > username 
[root@k8s-node1 dinghh]# echo password > password

[root@k8s-node1 dinghh]# kubectl create secret generic test-secret --from-file=./username --from-file=./password 
secret/test-secret created

[root@k8s-node1 dinghh]# kubectl get secrets test-secret -oyaml
apiVersion: v1
data:
  password: cGFzc3dvcmQK
  username: dXNlcm5hbWUK
kind: Secret
metadata:
  creationTimestamp: "2019-07-02T06:52:47Z"
  name: test-secret
  namespace: default
  resourceVersion: "1000413"
  selfLink: /api/v1/namespaces/default/secrets/test-secret
  uid: 00824b62-9c96-11e9-ad16-fa163e17fab9
type: Opaque

可以看到指定文件创建时会自动进行base64加密

Secret的使用

1. 在文件中使用

通过volumeMount方式将secret挂载到pod容器中

创建一个pod

[root@k8s-node1 dinghh]# cat nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    k8s-app: nginx
    version: master
  name: nginx
spec:
  containers:
  - image: nginx:master
    imagePullPolicy: IfNotPresent
    name: nginx
    ports:
    - containerPort: 80
      name: dashboard
      protocol: TCP
    resources: {}
    volumeMounts:
    - mountPath: /etc/secrets
      name: passwd-secret
      readOnly: true
  restartPolicy: Always
  volumes:
  - name: passwd-secret
    secret:
      defaultMode: 420
      secretName: passwd-secret

[root@k8s-node1 dinghh]# kubectl create -f nginx.yaml 
pod/nginx created

通过yaml可以看到通过volumeMounts方式将secret挂载到容器的/etc/secret目录

进入容器查看

[root@k8s-node1 dinghh]# kubectl create -f nginx.yaml 
pod/nginx created
[root@k8s-node1 dinghh]# kubectl exec -it nginx bash
[root@nginx /]# cd /etc/secrets/
[root@nginx secrets]# ll
total 0
lrwxrwxrwx 1 root root 15 Jul  2 15:00 password -> ..data/password
lrwxrwxrwx 1 root root 15 Jul  2 15:00 username -> ..data/username
[root@nginx secrets]# cat username 
username
[root@nginx secrets]# cat password 
password

可以看到将secret中的key作为文件名称写在指定目录下,并且文件中的内容是base64解密之后的

2. 在环境变量中使用

创建pod

[root@k8s-node1 dinghh]# cat nginx-env.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    k8s-app: nginx
    version: master
  name: nginx-env
spec:
  containers:
  - env:
    - name: USERNAME_ENV
      valueFrom:
        secretKeyRef:
          name: passwd-secret
          key: username
    - name: PASSWORD_ENV
      valueFrom:
        secretKeyRef:
          name: passwd-secret
          key: password
    image: 192.168.133.20:30050/kube-system/aistack-dashboard:master
    imagePullPolicy: IfNotPresent
    name: nginx
    ports:
    - containerPort: 80
      name: dashboard
      protocol: TCP
    resources: {}
  restartPolicy: Always

[root@k8s-node1 dinghh]# kubectl create -f nginx-env.yaml 
pod/nginx-env created

可以看到在该Pod中定义了两个环境变量分别引用passwd-secret中的对应的key

进入容器查看

[root@k8s-node1 dinghh]# kubectl exec -it nginx-env bash
[root@nginx-env /]# echo $USERNAME_ENV
username
[root@nginx-env /]# echo $PASSWORD_ENV
password

 

[root@k8s-master dashboard]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml -O dashboard.yaml --2025-12-04 21:57:27-- https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml 正在解析主机 raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.111.133, 185.199.109.133, 185.199.108.133, ... 正在连接 raw.githubusercontent.com (raw.githubusercontent.com)|185.199.111.133|:443... 已连接。 已发出 HTTP 请求,正在等待回应... 200 OK 长度:7552 (7.4K) [text/plain] 正在保存至: “dashboard.yaml” 100%[=========================================================================================================>] 7,552 --.-K/s 用时 0s 2025-12-04 21:57:28 (69.1 MB/s) - 已保存 “dashboard.yaml” [7552/7552]) [root@k8s-master dashboard]# ls dashboard.yaml [root@k8s-master dashboard]# vim dashboard.yaml [root@k8s-master dashboard]# kubectl apply -f dashboard.yaml namespace/kubernetes-dashboard unchanged serviceaccount/kubernetes-dashboard unchanged service/kubernetes-dashboard unchanged secret/kubernetes-dashboard-certs unchanged secret/kubernetes-dashboard-csrf unchanged secret/kubernetes-dashboard-key-holder unchanged configmap/kubernetes-dashboard-settings unchanged role.rbac.authorization.k8s.io/kubernetes-dashboard unchanged clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard unchanged rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard unchanged clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard unchanged deployment.apps/kubernetes-dashboard created service/dashboard-metrics-scraper created deployment.apps/dashboard-metrics-scraper created [root@k8s-master dashboard]# kubectl get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE default nginx-5b947dcc4-47987 1/1 Running 2 4d kube-flannel kube-flannel-ds-9zjns 1/1 Running 2 4d2h kube-flannel kube-flannel-ds-hs79x 1/1 Running 2 4d2h kube-flannel kube-flannel-ds-vl9qs 1/1 Running 2 4d2h kube-system coredns-9d85f5447-4dcps 1/1 Running 2 4d3h kube-system coredns-9d85f5447-g6c49 1/1 Running 2 4d3h kube-system etcd-k8s-master 1/1 Running 2 4d3h kube-system kube-apiserver-k8s-master 1/1 Running 2 4d3h kube-system kube-controller-manager-k8s-master 1/1 Running 2 4d3h kube-system kube-proxy-6wfbb 1/1 Running 2 4d3h kube-system kube-proxy-7pkrq 1/1 Running 2 4d3h kube-system kube-proxy-jhc22 1/1 Running 2 4d3h kube-system kube-scheduler-k8s-master 1/1 Running 2 4d3h kubernetes-dashboard dashboard-metrics-scraper-755b949fd6-7bv8k 0/1 ContainerCreating 0 9s kubernetes-dashboard kubernetes-dashboard-7f4c8d4968-qc7lk 0/1 ContainerCreating 0 9s [root@k8s-master dashboard]# kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard service/kubernetes-dashboard edited [root@k8s-master dashboard]# kubectl get pods,svc -n kubernetes-dashboard NAME READY STATUS RESTARTS AGE pod/dashboard-metrics-scraper-755b949fd6-7bv8k 1/1 Running 0 2m24s pod/kubernetes-dashboard-7f4c8d4968-qc7lk 1/1 Running 0 2m24s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/dashboard-metrics-scraper ClusterIP 10.98.100.238 <none> 8000/TCP 2m24s service/kubernetes-dashboard NodePort 10.108.200.146 <none> 443:31486/TCP 7m46s [root@k8s-master dashboard]# kubectl get svc -A |grep kubernetes-dashboard kubernetes-dashboard dashboard-metrics-scraper ClusterIP 10.98.100.238 <none> 8000/TCP 3m22s kubernetes-dashboard kubernetes-dashboard NodePort 10.108.200.146 <none> 443:31486/TCP 8m44s [root@k8s-master dashboard]# kubectl get pods,svc -n kubernetes-dashboard NAME READY STATUS RESTARTS AGE pod/dashboard-metrics-scraper-755b949fd6-7bv8k 1/1 Running 0 6m4s pod/kubernetes-dashboard-7f4c8d4968-qc7lk 1/1 Running 0 6m4s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/dashboard-metrics-scraper ClusterIP 10.98.100.238 <none> 8000/TCP 6m4s service/kubernetes-dashboard NodePort 10.108.200.146 <none> 443:31486/TCP 11m 最后的命令输出是否正确?
最新发布
12-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值