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'
dockerconfigjson
harbor中的私有仓库,可以通过创建secret来进行访问
创建secret,指定secret名称,仓库名,账号,密码
kubectl create secret docker-registry harbor-admin \
--docker-server= \
--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
就是使用kubectl create securet 命令的各种参数,唯独多了"auth":"YWRtaW46MTIzNDU=",这个其实也是base64编码,将解码可得到 admin:12345
即账户名与密码组成的kv对。
如果这个secure需要修改,通常方法是删除重建,但是也可以通过下面的命令将.dockerconfigjson的值生成出来(密码改成了123456)
auth=$(echo -n admin:123456| base64)
echo $auth
echo -n '{"auths":{"":{"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
不在赘述