一逻炊、Secret介紹
在Kubernetes集群資源中键闺,Secret對(duì)象與ConfigMap對(duì)象類似汗捡,但它主要是用于存儲(chǔ)小片敏感的需要加密的數(shù)據(jù)恒傻,例如密碼脸侥,token和SSH key密鑰等等。這類數(shù)據(jù)當(dāng)然也可以存放在Pod的定義中或者鏡像中盈厘,但是放在Secret中是為了更方便的控制如何使用數(shù)據(jù)睁枕,更加安全和靈活,并減少信息暴露的風(fēng)險(xiǎn)沸手。在secret中存儲(chǔ)的數(shù)據(jù)都需要通過(guò)base64進(jìn)行轉(zhuǎn)換加密后存放外遇。Secret解決了密碼、token契吉、密鑰等敏感數(shù)據(jù)的配置問(wèn)題跳仿,使用Secret可以避免把這些敏感數(shù)據(jù)以明文的形式暴露到鏡像或者Pod Spec中。用戶可以創(chuàng)建自己的secret栅隐,系統(tǒng)也會(huì)有自己的secret塔嬉。
Secret一旦被創(chuàng)建,則可以通過(guò)以下三種方式來(lái)使用:
- 在創(chuàng)建Pod時(shí)租悄,通過(guò)為pod指定Service Account來(lái)自動(dòng)使用該Secret谨究,主要用于API Server鑒權(quán)的過(guò)程;
- 通過(guò)掛載Secret到Pod來(lái)使用它泣棋。即作為volume的一個(gè)域被一個(gè)或多個(gè)容器掛載胶哲;
- Docker鏡像下載時(shí)使用,通過(guò)指定Pod的spc.ImagePullSecret來(lái)引用潭辈。一般用于私有倉(cāng)庫(kù)登錄拉取鏡像鸯屿。即在拉取鏡像的時(shí)候被kubelet引用。
Kubernetes集群中有內(nèi)建的Secrets:即由ServiceAccount創(chuàng)建的API證書附加的秘鑰把敢,Kubernetes會(huì)自動(dòng)生成的用來(lái)訪問(wèn)apiserver的Secret寄摆,所有Pod會(huì)默認(rèn)使用這個(gè)Secret與apiserver通信。這是Kubernetes 默認(rèn)的行為修赞,也可以通過(guò)自定義的方式禁用或者創(chuàng)建我們所需要的Secret婶恼。
通過(guò)kubectl get secrets
即可查看默認(rèn)的secrets
Secret有三種類型
- Opaque:使用base64編碼存儲(chǔ)信息,可以通過(guò)base64 --decode解碼獲得原始數(shù)據(jù)柏副,因此安全性弱勾邦。
- kubernetes.io/dockerconfigjson:用于存儲(chǔ)docker registry的認(rèn)證信息。
- kubernetes.io/service-account-token (即Service Account):用于被 serviceaccount 引用割择。serviceaccout 創(chuàng)建時(shí)眷篇,Kubernetes 會(huì)默認(rèn)創(chuàng)建對(duì)應(yīng)的 secret。Pod 如果使用了 serviceaccount荔泳,對(duì)應(yīng)的 secret 會(huì)自動(dòng)掛載到 Pod 的
/run/secrets/kubernetes.io/serviceaccount
目錄中蕉饼。Service Account 是內(nèi)置secret虐杯,使用 API 憑證自動(dòng)創(chuàng)建和附加secret。Kubernetes 自動(dòng)創(chuàng)建包含訪問(wèn)API憑據(jù)的secret椎椰,并自動(dòng)修改pod以使用此類型的secret厦幅。如果需要,可以禁用或覆蓋自動(dòng)創(chuàng)建和使用API憑據(jù)慨飘。但是,如果需要的只是安全地訪問(wèn)apiserver译荞,則推薦這樣的工作流程瓤的。
二、Secret的使用
1吞歼、Service Account
用于被 serviceaccount 引用圈膏。serviceaccout 創(chuàng)建時(shí) Kubernetes 會(huì)默認(rèn)創(chuàng)建對(duì)應(yīng)的 secret。Pod 如果使用了 serviceaccount篙骡,對(duì)應(yīng)的 secret 會(huì)自動(dòng)掛載到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目錄中稽坤。
[root@k8s-master01 ~]# kubectl run kevin_nginx --image nginx
deployment "nginx" created
[root@k8s-master01 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
kevin_nginx-3137573019-md1u2 1/1 Running 0 13s
[root@k8s-master01 ~]# kubectl exec kevin_nginx-3137573019-md1u2 ls /run/secrets/kubernetes.io/serviceaccount
ca.crt
namespace
token
2、Opaque Secret
A糯俗、創(chuàng)建
Opaque 類型的數(shù)據(jù)是一個(gè) map 類型尿褪,要求 value 是 base64 編碼格式:
$ echo-n"admin" | base64
YWRtaW4=
$ echo-n"1f2d1e2e67df" | base64
MWYyZDFlMmU2N2Rm
secrets.yml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
password: MWYyZDFlMmU2N2Rm
username: YWRtaW4=
B、使用方式
- 1)得湘、將 Secret 掛載到 Volume 中
apiVersion: v1
kind: Pod
metadata:
labels:
name: seret-test
name: seret-test
spec:
volumes:
- name: secrets
secret:
secretName: mysecret
containers:
- image: hub.atguigu.com/library/myapp:v1
name: db
volumeMounts:
- name: secrets
mountPath: "/etc/secrets"
readOnly: true
- 2)杖玲、將 Secret 導(dǎo)出到環(huán)境變量中
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: pod-deployment
spec:
replicas: 2
template:
metadata:
labels:
app: pod-deployment
spec:
containers:
- name: pod-1
image: hub.atguigu.com/library/myapp:v1
ports:
- containerPort: 80
env:
- name: TEST_USER
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: TEST_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
3、kubernetes.io/dockerconfigjson
kubernetes.io/dockerconfigjson用于存儲(chǔ)docker registry的認(rèn)證信息淘正,可以直接使用kubectl create secret命令創(chuàng)建:
[root@k8s-master01 ~]# kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
secret/myregistrykey created
在創(chuàng)建 Pod 的時(shí)候摆马,通過(guò) imagePullSecrets 來(lái)引用剛創(chuàng)建的 myregistrykey:
apiVersion: v1
kind: Pod
metadata:
name: data
spec:
containers:
- name: data
image: janedoe/awesomeapp:v1
imagePullSecrets:
- name: myregistrykey