Service Account和其secrets 作用和場景,看了不虧。。
阿新 • • 發佈:2018-11-20
Service Account概念的引入是基於這樣的使用場景:
執行在pod裡的程序需要呼叫Kubernetes API以及非Kubernetes API的其它服務。Service Account它並不是給kubernetes叢集的使用者使用的,而是給pod裡面的程序使用的,它為pod提供必要的身份認證。這樣pod裡的容器就可以訪問api了。
kubectl get sa --all-namespaces NAMESPACE NAME SECRETS AGE default build-robot 1 1d defaultdefault 1 32d default kube-dns 1 31d kube-public default 1 32d kube-system dashboard 1 31d kube-system default 1 32d kube-system heapster 1 30d kube-system kube-dns 1 31d
如果kubernetes開啟了ServiceAccount(–admission_control=…,ServiceAccount,…
如下:麼個sa都關聯著一個secrets。
kubectl get sa default -o yaml apiVersion: v1 kind: ServiceAccount metadata: creationTimestamp: 2017-05-02T06:39:12Z name: default namespace: default resourceVersion: "175" selfLink: /api/v1/namespaces/default/serviceaccounts/defaultuid: 0de23575-2f02-11e7-98d0-5254c4628ad9 secrets: - name: default-token-rsf8r
當用戶再該namespace下建立pod的時候都會預設使用這個sa,下面是get pod 擷取的部分,可以看到kubernetes會把預設的sa掛載到容器內。
volumes: - name: default-token-rsf8r secret: defaultMode: 420 secretName: default-token-rsf8r
具體看一下secret
kubectl get secret default-token-rsf8r -o yaml apiVersion: v1 data: ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR2akNDQXFhZ0F3SUJBZ0lVZlpvZDJtSzNsa3JiMzR3NDhhUmtOc0pVVDJjd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1pURUxNQWtHQTFVRUJoTUN namespace: ZGVmYXVsdA== token: ZXlKaGJHY2lPaUpTVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0o5LmV5SnBjM01pT2lKcmRXSmxjbTVsZEdWekwzTmxjblpwWTJWaFkyTnZkVzUwSWl3aWEzVmlaWEp1WlhSbGN5NXBieTl6WlhKMmFXTmxZV0 metadata: annotations: kubernetes.io/service-account.name: default kubernetes.io/service-account.uid: 0de23575-2f02-11e7-98d0-5254c4628ad9 creationTimestamp: 2017-05-02T06:42:07Z name: default-token-rsf8r namespace: default resourceVersion: "12551" selfLink: /api/v1/namespaces/default/secrets/default-token-rsf8r uid: 75c0a236-2f02-11e7-98d0-5254c4628ad9 type: kubernetes.io/service-account-token
上面的內容是經過base64加密過後的,我們直接進入容器內:
~ # ls -l /var/run/secrets/kubernetes.io/serviceaccount/ total 0 lrwxrwxrwx 1 root root 13 May 4 23:57 ca.crt -> ..data/ca.crt lrwxrwxrwx 1 root root 16 May 4 23:57 namespace -> ..data/namespace lrwxrwxrwx 1 root root 12 May 4 23:57 token -> ..data/token
可以看到已將ca.crt 、namespace和token放到容器內了,那麼這個容器就可以通過https的請求訪問apiserver了。
Secret
Kubernetes提供了Secret來處理敏感資訊,目前Secret的型別有3種:
Opaque(default): 任意字串
kubernetes.io/service-account-token: 作用於ServiceAccount,就是上面說的。
kubernetes.io/dockerconfigjson: 作用於Docker registry,使用者下載docker映象認證使用。
imagePullSecrets
當在需要安全驗證的環境中拉取映象的時候,需要通過使用者名稱和密碼
apiVersion: v1 kind: Secret metadata: name: myregistrykey namespace: awesomeapps data: .dockerconfigjson: UmVhbGx5IHJlYWxseSByZWVlZWVlZWVlZWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGx5eXl5eXl5eXl5eXl5eXl5eXl5eSBsbGxsbGxsbGxsbGxsbG9vb29vb29vb29vb29vb29vb29vb29vb29vb25ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubmdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2cgYXV0aCBrZXlzCg== type: kubernetes.io/dockerconfigjson
接下來拉取映象的時候,就可以使用了
apiVersion: v1 kind: Pod metadata: name: foo namespace: awesomeapps spec: containers: - name: foo image: janedoe/awesomeapp:v1 imagePullSecrets: - name: myregistrykey
其實本質上還是kubelet把這個認證放到了docker的目錄下面,如下:
cat ~/.docker/config.json { "auths": { "10.39.0.118": { "auth": "Y2hlbm1vOmNtMTM4MTE2NjY3ODY=" }, "10.39.0.12:5000": { "auth": "dXNlcjAxOjEyMzQ1YQ==" }, "http://10.39.0.12:5000": { "auth": "dXNlcjAxOjEyMzQ1YQ==" } } }