Secret
Secret用來保存敏感信息,例如密碼、OAuth 令牌和 ssh key等等尼啡,將這些信息放在Secret中比放在Pod的定義中或者docker鏡像中來說更加安全和靈活。
Secret有三種類型:
1、Opaque:base64 編碼格式的 Secret锦茁,用來存儲密碼、密鑰等叉存;但數(shù)據(jù)也可以通過base64 –decode解碼得到原始數(shù)據(jù)蜻势,所以加密性很弱。
2鹉胖、kubernetes.io/dockerconfigjson:用來存儲私有docker registry的認證信息握玛。
3够傍、kubernetes.io/service-account-token:用于被serviceaccount引用,serviceaccout 創(chuàng)建時Kubernetes會默認創(chuàng)建對應的secret挠铲。Pod如果使用了serviceaccount冕屯,對應的secret會自動掛載到Pod目錄/run/secrets/kubernetes.io/serviceaccount中。
Opaque Secret
Opaque 類型的數(shù)據(jù)是一個 map 類型拂苹,要求value是base64編碼格式安聘,比如我們來創(chuàng)建一個用戶名為 admin,密碼為 admin321 的 Secret 對象瓢棒,首先需要把這用戶名和密碼做 base64 編碼浴韭,
$ echo -n "admin" | base64
YWRtaW4=
$ echo -n "admin321" | base64
YWRtaW4zMjE=
然后可以利用上面編碼過后的數(shù)據(jù)來編寫一個YAML文件:(secret-demo.yaml)
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: YWRtaW4zMjE=
然后同樣使用kubectl命令來創(chuàng)建:
$ kubectl create -f secret-demo.yaml
secret "mysecret" created
利用get secret命令查看:
$ kubectl get secret
NAME TYPE DATA AGE
default-token-n9w2d kubernetes.io/service-account-token 3 33d
mysecret Opaque
其中default-token-n9w2d為創(chuàng)建集群時默認創(chuàng)建的 secret,被serviceacount/default 引用脯宿。
使用describe命令念颈,查看詳情:
$ kubectl describe secret mysecret
Name: mysecret
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 8 bytes
username: 5 bytes
我們可以看到利用describe命令查看到的Data沒有直接顯示出來,如果想看到Data里面的詳細信息连霉,同樣我們可以輸出成YAML文件進行查看:
$ kubectl get secret mysecret -o yaml
apiVersion: v1
data:
password: YWRtaW4zMjE=
username: YWRtaW4=
kind: Secret
metadata:
creationTimestamp: 2018-06-19T15:27:06Z
name: mysecret
namespace: default
resourceVersion: "3694084"
selfLink: /api/v1/namespaces/default/secrets/mysecret
uid: 39c139f5-73d5-11e8-a101-525400db4df7
type: Opaque
創(chuàng)建好Secret對象后榴芳,有兩種方式來使用它:
1、以環(huán)境變量的形式
2跺撼、以Volume的形式掛載
環(huán)境變量
首先我們來測試下環(huán)境變量的方式窟感,同樣的,我們來使用一個簡單的busybox鏡像來測試下:(secret1-pod.yaml)
apiVersion: v1
kind: Pod
metadata:
name: secret1-pod
spec:
containers:
- name: secret1
image: busybox
command: [ "/bin/sh", "-c", "env" ]
env:
- name: USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
創(chuàng)建上面的Pod:
$ kubectl create -f secret1-pod.yaml
pod "secret1-pod" created
然后我們查看Pod的日志輸出:
$ kubectl logs secret1-pod
...
USERNAME=admin
PASSWORD=admin321
...
可以看到有 USERNAME 和 PASSWORD 兩個環(huán)境變量輸出出來歉井。需要注意的是柿祈,環(huán)境變量的方式,不支持動態(tài)更新密碼哩至。
Volume 掛載
同樣的我們用一個Pod來驗證下Volume掛載谍夭,創(chuàng)建一個Pod文件:(secret2-pod.yaml)
apiVersion: v1
kind: Pod
metadata:
name: secret2-pod
spec:
containers:
- name: secret2
image: busybox
command: ["/bin/sh", "-c", "ls /etc/secrets"]
volumeMounts:
- name: secrets
mountPath: /etc/secrets
volumes:
- name: secrets
secret:
secretName: mysecret
創(chuàng)建Pod:
$ kubectl create -f secret-pod2.yaml
pod "secret2-pod" created
然后我們查看輸出日志:
$ kubectl logs secret2-pod
password
username
可以看到secret把兩個key掛載成了兩個對應的文件。
kubernetes.io/dockerconfigjson
除了上面的Opaque這種類型外憨募,我們還可以來創(chuàng)建用戶docker registry認證的Secret紧索,直接使用kubectl create命令創(chuàng)建即可,如下:
$ kubectl create secret docker-registry myregistry --docker-server=10.8.13.85 --docker-username=admin --docker-password=Harbor123 --docker-email=qienda@chinanews.com.cn
secret "myregistry" created
然后查看Secret列表:
$ kubectl get secret
NAME TYPE DATA AGE
default-token-n9w2d kubernetes.io/service-account-token 3 33d
myregistry kubernetes.io/dockerconfigjson 1 15s
mysecret Opaque 2 34m
注意看上面的TYPE類型菜谣,myregistry是不是對應的kubernetes.io/dockerconfigjson珠漂,同樣的可以使用describe命令來查看詳細信息:
$ kubectl describe secret myregistry
Name: myregistry
Namespace: default
Labels: <none>
Annotations: <none>
Type: kubernetes.io/dockerconfigjson
Data
====
.dockerconfigjson: 152 bytes
同樣的可以看到Data區(qū)域沒有直接展示出來,如果想查看的話可以使用-o yaml來輸出展示出來:
$ kubectl get secret myregistry -o yaml
apiVersion: v1
data:
.dockerconfigjson: eyJhdXRocyI6eyJET0NLRVJfU0VSVkVSIjp7InVzZXJuYW1lIjoiRE9DS0VSX1VTRVIiLCJwYXNzd29yZCI6IkRPQ0tFUl9QQVNTV09SRCIsImVtYWlsIjoiRE9DS0VSX0VNQUlMIiwiYXV0aCI6IlJFOURTMFZTWDFWVFJWSTZSRTlEUzBWU1gxQkJVMU5YVDFKRSJ9fX0=
kind: Secret
metadata:
creationTimestamp: 2018-06-19T16:01:05Z
name: myregistry
namespace: default
resourceVersion: "3696966"
selfLink: /api/v1/namespaces/default/secrets/myregistry
uid: f91db707-73d9-11e8-a101-525400db4df7
type: kubernetes.io/dockerconfigjson
可以把上面的data.dockerconfigjson下面的數(shù)據(jù)做一個base64解碼尾膊,看看里面的數(shù)據(jù)是怎樣的呢媳危?
$ echo eyJhdXRocyI6eyJET0NLRVJfU0VSVkVSIjp7InVzZXJuYW1lIjoiRE9DS0VSX1VTRVIiLCJwYXNzd29yZCI6IkRPQ0tFUl9QQVNTV09SRCIsImVtYWlsIjoiRE9DS0VSX0VNQUlMIiwiYXV0aCI6IlJFOURTMFZTWDFWVFJWSTZSRTlEUzBWU1gxQkJVMU5YVDFKRSJ9fX0= | base64 -d
{"auths":{"10.8.13.85":{"username":"admin","password":"Harbor123","email":"qienda@chinanews.com.cn","auth":"RE9DS0VSX1VTRVI6RE9DS0VSX1BBU1NXT1JE"}}}
如果我們需要拉取私有倉庫中的docker鏡像的話就需要使用到上面的myregistry這個Secret:
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
- name: foo
image: 10.8.13.85/test:v1
imagePullSecrets:
- name: myregistry
我們需要拉取私有倉庫鏡像10.8.13.85/test:v1,我們就需要針對該私有倉庫來創(chuàng)建一個如上的Secret冈敛,然后在Pod的 YAML 文件中指定imagePullSecrets待笑。
kubernetes.io/service-account-token
另外一種Secret類型就是kubernetes.io/service-account-token,用于被serviceaccount引用抓谴。serviceaccout 創(chuàng)建時 Kubernetes 會默認創(chuàng)建對應的 secret暮蹂。Pod 如果使用了 serviceaccount寞缝,對應的secret會自動掛載到Pod的/run/secrets/kubernetes.io/serviceaccount目錄中。
這里我們使用一個nginx鏡像來驗證一下仰泻,大家想一想為什么不是呀busybox鏡像來驗證荆陆?當然也是可以的,但是我們就不能在command里面來驗證了集侯,因為token是需要Pod運行起來過后才會被掛載上去的被啼,直接在command命令中去查看肯定是還沒有 token 文件的。
$ kubectl run secret-pod3 --image nginx:1.7.9
deployment.apps "secret-pod3" created
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
...
secret-pod3-78c8c76db8-7zmqm 1/1 Running 0 13s
...
$ kubectl exec secret-pod3-78c8c76db8-7zmqm ls /run/secrets/kubernetes.io/serviceaccount
ca.crt
namespace
token
$ kubectl exec secret-pod3-78c8c76db8-7zmqm cat /run/secrets/kubernetes.io/serviceaccount/token
eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtdG9rZW4tbjl3MmQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjMzY2FkOWQxLTU5MmYtMTFlOC1hMTAxLTUyNTQwMGRiNGRmNyIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQifQ.0FpzPD8WO_fwnMjwpGIOphdVu4K9wUINwpXpBOJAQ-Tawd0RTbAUHcgYy3sEHSk9uvgnl1FJRQpbQN3yVR_DWSIlAtbmd4dIPxK4O7ZVdd4UnmC467cNXEBqL1sDWLfS5f03d7D1dw1ljFJ_pJw2P65Fjd13reKJvvTQnpu5U0SDcfxj675-Z3z-iOO3XSalZmkFIw2MfYMzf_WpxW0yMFCVkUZ8tBSTegA9-NJZededceA_VCOdKcUjDPrDo-CNti3wZqax5WPw95Ou8RJDMAIS5EcVym7M2_zjGiqHEL3VTvcwXbdFKxsNX-1VW6nr_KKuMGKOyx-5vgxebl71QQ
Secret 與 ConfigMap 對比
最后我們來對比下Secret和ConfigMap這兩種資源對象的異同點:
相同點:
key/value的形式
屬于某個特定的namespace
可以導出到環(huán)境變量
可以通過目錄/文件形式掛載
通過 volume 掛載的配置信息均可熱更新
不同點:
Secret 可以被 ServerAccount 關聯(lián)
Secret 可以存儲 docker register 的鑒權信息棠枉,用在 ImagePullSecret 參數(shù)中浓体,用于拉取私有倉庫的鏡像
Secret 支持 Base64 加密
Secret 分為 kubernetes.io/service-account-token、kubernetes.io/dockerconfigjson辈讶、Opaque 三種類型命浴,而 Configmap 不區(qū)分類型