Open lqshow opened 5 years ago
Service Account 为 Pod 中的进程提供身份信息。
Service Account包括三个部分
设置非default service account,只需要在 pod 的spec.serviceAccountName 字段中将name设置为您想要用的 service account 名字即可。
spec.serviceAccountName
k8s 会给 Pod 创建一个特殊的 Volume,该 Volume 中包含三部分信息
该 Volume 会被挂载到 Pod 中所有容器的指定目录下(/var/run/secrets/kubernetes.io/serviceaccount)
➜ kubectl exec $(kubectl get pods consume-secret-env-pod -o=name|cut -d "/" -f2) ls /var/run/secrets/kubernetes.io/serviceaccount ca.crt namespace token
namespace:serviceaccount
service account token
容器应用读取/var/run/secrets/kubernetes.io/serviceaccount/token 文件,使用 token 认证方式访问 API Server
在创建 Service Account时,k8s 默认会创建对应的 Secret。
kubernetes.io/service-account-token类型的 Secret 对用 Pod中的三个文件
位置:/run/secrets/kubernetes.io/serviceaccount
# 创建一个新的serviceaccount ➜ kubectl create serviceaccount lqshow serviceaccount "lqshow" created
# 获取 Secret 信息 ➜ kubectl get secrets | grep ^lqshow | cut -f1 -d ' ' lqshow-token-4bfbx
# 获取 token ➜ kubectl get secret $(kubectl get secrets | grep ^lqshow | cut -f1 -d ' ') -o json | jq -r '.data["token"]' | base64 -D eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6Imxxc2hvdy10b2tlbi00YmZieCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJscXNob3ciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5ODU2NjhkNi1hZWE3LTExZTgtYjllYi0wMjUwMDAwMDAwMDEiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDpscXNob3cifQ.J_-TKm8zN_6qIbWyraLWtANWFXwXISknDzfehopn87w1fUGuBauEGyRbLtapZSOXxMxPWVMc-dM3eMOheiQ07t1cEbsmLckdO0IajuBDbScEJFOHGJNvkSJTCIkoZZHV8CRb-OMhHWXr7QvgLws0jInF1B6m6AcyRcQKzDNO9nbCUkYMm96ULGbhVW-7wOPpdjyHfjAeeE111-bdZWZeiSDow8Li2Bm92KFiYiKd_YDNff3BSdyspWz-HsxqUcHnwC_rOWOVCxamZFlt5hyESiY9O8fiFiOf6GQZ6bNlsW1X-6Chr8lYlg6vQsvrkCBh-_cP0r5c3NPKSViQ2safPg
顺便说下,这个 token,看格式其实就是 JWT Token,我们看下解出来的 playload 部分
{ "iss": "kubernetes/serviceaccount", "kubernetes.io/serviceaccount/namespace": "default", "kubernetes.io/serviceaccount/secret.name": "lqshow-token-4bfbx", "kubernetes.io/serviceaccount/service-account.name": "lqshow", "kubernetes.io/serviceaccount/service-account.uid": "985668d6-aea7-11e8-b9eb-025000000001", "sub": "system:serviceaccount:default:lqshow" }
看下 secret 详情部分,token 里的 payload 部分和 secret 信息一致
➜ kubectl describe secret lqshow-token-4bfbx Name: lqshow-token-4bfbx Namespace: default Labels: <none> Annotations: kubernetes.io/service-account.name=lqshow kubernetes.io/service-account.uid=985668d6-aea7-11e8-b9eb-025000000001 Type: kubernetes.io/service-account-token Data ==== ca.crt: 1025 bytes namespace: 7 bytes token: ...
# 获取 ca 证书 ➜ kubectl get secret $(kubectl get secrets | grep ^lqshow | cut -f1 -d ' ') -o json | jq -r '.data["ca.crt"]' | base64 -D -----BEGIN CERTIFICATE----- MIICyDCCAbCgAwIBAgIBADANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwprdWJl cm5ldGVzMB4XDTE4MDgxMDA1MzczMloXDTI4MDgwNzA1MzczMlowFTETMBEGA1UE AxMKa3ViZXJuZXRlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMQD Q4Vy/vQkigugo+yvK/M4N7ereR0Y8usGL4yXbnF0sdrvYFDAn1bUBCQeU6Nq5bww dYGx0+ClUS+hpv41PXMbqVH2mJ6rXH3IBDqmyNMHynczPAzR+fDenloOATsR1oHs gy38BiD4YQYs41oBv091D6JNsrXiaSchJ2itXaejBoQlw4/phtcy4OEO1eBJKPXL Ug3cf/WznGYKG45nB69GKDpUGfPoQOKlIjdcGM0WN0t2l444zwgq2FJKf7Ghe6Rr kq9ahJJgWN72jxTkmXoiOjTGmD69gwhmuATbCPuPagS7ECMsZHaLziI3YPqq4Ha6 gKBwUQHmJvl95UgtQCECAwEAAaMjMCEwDgYDVR0PAQH/BAQDAgKkMA8GA1UdEwEB /wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAAPjiS/4lct9/qQfDV9cO0eldg2z I9EmR1L2NhDlFwVKMoB3V8cC0A8Gm44UHza98KARKCAxlpk/TwdPvFAXn35sIaK7 bNGO4Jf+F8fTef169OOq916h+4ZVqVFVeA5dTl7iw1+5pHfuvbrUlJjDMba2Gcoi cOib8Y3ilt/DtsMjA8dFZa89GtEyMOoZfVzcXqJN2JAPXyV6wikiH0wXFl+OCw3+ k3MCYqkD84RwDueiwqQbld1QPnkg9WBkufAHmas4tu1Z9fg/AC3PA6scPrObbf8F ldfl02yOEHEEeqIw3IMCpUASDRqKsU7ZcSVHTUjxg22Sa2RrKpswpg1r5LQ= -----END CERTIFICATE-----
Service Account 概念
Service Account 为 Pod 中的进程提供身份信息。
Service Account包括三个部分
Default Service Account
Pod 关联 Service Account
设置非default service account,只需要在 pod 的
spec.serviceAccountName
字段中将name设置为您想要用的 service account 名字即可。k8s 会给 Pod 创建一个特殊的 Volume,该 Volume 中包含三部分信息
该 Volume 会被挂载到 Pod 中所有容器的指定目录下(/var/run/secrets/kubernetes.io/serviceaccount)
身份认证
用户名
namespace:serviceaccount
凭证
service account token
Service Account 使用
让 Pod 访问 API Server
容器应用读取/var/run/secrets/kubernetes.io/serviceaccount/token 文件,使用 token 认证方式访问 API Server
kubectl 使用 ServiceAccount token 访问 API Server
Secret(service-account-token类型)
在创建 Service Account时,k8s 默认会创建对应的 Secret。
kubernetes.io/service-account-token类型的 Secret 对用 Pod中的三个文件
位置:/run/secrets/kubernetes.io/serviceaccount
顺便说下,这个 token,看格式其实就是 JWT Token,我们看下解出来的 playload 部分
看下 secret 详情部分,token 里的 payload 部分和 secret 信息一致