Secret解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中。Secret可以通过挂载Volume或者黄精变量的方式使用

类型

  • Servert Account:用来访问Kubernetes API,由K8S自动创建,并且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccoutn目录中
  • Opaque:base64编码格式的Secret,用来存储密码、密钥等
  • dockerconfigjson:用来存储私有docker resigetry的认证信息
  • TLS Secret:用于存储TLS证书和密钥。包含私钥、证书和可能的CA证书,通常用于Ingress资源以实现HTTPS加密传输。


ServerAccount

这个一般是k8s系统内部定义谁用,涉及到了一些关于权限,验证等信息,这里就不过多涉及。


Opaque

Opaque类型的数据是一个map类型,要求value是base64编码,一个简单示例如下

name=$(echo -n "admin" | base64)
pwd=$(echo -n "1234" | base64)
cat > secrets.yml << EOF
apiVersion: v1
kind: Secret
metadata: 
  name: test-secret
type: Qpaque
data:
  password: $pwd
  username: $name
EOF
kubectl apply -f secrets.yml

使用

用方式与configMap类似,可以导入到环境变量中,也可挂载到Volumne中

apiVersion: v1
kind: Pod
metadata:
  name: secret-pod
spec:
  volumes:
  - name: sec-vol
    secret:
      secretName: test-secret
      
  containers:
  - name: secret-1
    image: busybox
    command: ["/bin/sh", "-c", "sleep 6000"]
    volumeMounts:
    - name: sec-vol
      mountPath: "/tmp/secrets"
    
    env:
    - name: sec-pwd
      valueFrom:
        secretKeyRef:
          name: test-secret
          key: password    
    - name: sec-name
      valueFrom:
        secretKeyRef:
          name: test-secret
          key: username      

在这个pod中,使用到了secret的两种方式

挂载:将test-secret挂载到/tmp/secrets目录下,test-secret的两个key将会作为两个文件 password 和 username,其内容分别对应为其value

环境变量:test-secret被作为华景变量 引入到pod中,两个环境变量的名称为 sec-name和sec-pwd,其值分别对应test-secret中的username和password

kubectl exec  -it secret-pod -- '/bin/sh'

从0开始搞K8S:存储 secret_secret


dockerconfigjson

harbor中的私有仓库,可以通过创建secret来进行访问

创建secret,指定secret名称,仓库名,账号,密码

kubectl create secret docker-registry harbor-admin \
  --docker-server=harbor.tangotz.com \
  --docker-username=admin \
  --docker-password=12345

创建好后,可以将其到处成为yaml格式资源清单

kubectl get secret harbor-admin -o yaml > harbor-admin.yaml

apiVersion: v1
data:
  .dockerconfigjson: eyJhdXRocyI6eyJoYXJib3IudGFuZ290ei5jb20iOnsidXNlcm5hbWUiOiJhZG1pbiIsInBhc3N3b3JkIjoiMTIzNDUiLCJhdXRoIjoiWVdSdGFXNDZNVEl6TkRVPSJ9fX0=
kind: Secret
metadata:
  creationTimestamp: "2024-05-18T16:35:24Z"
  name: harbor-admin
  namespace: default
  resourceVersion: "11553"
  uid: af4b325a-15bf-4049-8179-a5096f903c53
type: kubernetes.io/dockerconfigjson

其中 .dockerconfigjson eyJhdXRocyI6eyJoYXJib3IudGFuZ290ei5jb20iOnsidXNlcm5hbWUiOiJhZG1pbiIsInBhc3N3b3JkIjoiMTIzNDUiLCJhdXRoIjoiWVdSdGFXNDZNVEl6TkRVPSJ9fX0= 是base64编码,将其解码可得到

echo 'eyJhdXRocyI6eyJoYXJib3IudGFuZ290ei5jb20iOnsidXNlcm5hbWUiOiJhZG1pbiIsInBhc3N3b3JkIjoiMTIzNDUiLCJhdXRoIjoiWVdSdGFXNDZNVEl6TkRVPSJ9fX0=' | base -d

从0开始搞K8S:存储 secret_secret_02

就是使用kubectl create securet 命令的各种参数,唯独多了"auth":"YWRtaW46MTIzNDU=",这个其实也是base64编码,将解码可得到 admin:12345即账户名与密码组成的kv对。

如果这个secure需要修改,通常方法是删除重建,但是也可以通过下面的命令将.dockerconfigjson的值生成出来(密码改成了123456)

auth=$(echo -n admin:123456| base64) 
echo $auth
echo -n '{"auths":{"harbor.tangotz.com":{"username":"admin","password":"123456","auth":"'$auth'"}}}'|base64 -w 0 ;echo


TLS Secret

在测试ingress的时候就用到了

kubectl create secret tls ssl-tangotz --cert=./ssl.tangotz.com.pem --key=./ssl.tangotz.com.key

不在赘述