-
Notifications
You must be signed in to change notification settings - Fork 2
Open
Labels
Description
Service Account 概念
Service Account 为 Pod 中的进程提供身份信息。
Service Account包括三个部分
- namespace
- token
- CA证书
Default Service Account
- 当 namespace 创建时,会自动创建一个名为 default 的 Service Account
- 当 default 的 Service Account 创建时,会自动在同 namespace 下创建一个 default-token-xxxx(secret),并关联到 default 的 Service Account 上
- 创建 Pod 时,如果没有指定 Service Account,k8s 的 Service Account Admission Crontroller 会自动为该 Pod 指定 Default Service Account
Pod 关联 Service Account
设置非default service account,只需要在 pod 的spec.serviceAccountName 字段中将name设置为您想要用的 service account 名字即可。
k8s 会给 Pod 创建一个特殊的 Volume,该 Volume 中包含三部分信息
- 证书文件
- namespace
- Service Account Secret 的 token
该 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
Service Account 使用
让 Pod 访问 API Server
容器应用读取/var/run/secrets/kubernetes.io/serviceaccount/token 文件,使用 token 认证方式访问 API Server
kubectl 使用 ServiceAccount token 访问 API Server
- 查看指定 namespace 下的 serviceaccount ,获取 secret
- 查看 secret,获取 token
- 在 kubeconfig 中设置 token
- 使用 kubectl 访问
Secret(service-account-token类型)
在创建 Service Account时,k8s 默认会创建对应的 Secret。
kubernetes.io/service-account-token类型的 Secret 对用 Pod中的三个文件
位置:/run/secrets/kubernetes.io/serviceaccount
- ca.crt(API Server 的 CA 公钥证书)
- namespace
- token(用于 API Server 私钥签发的 Bearer token)
# 创建一个新的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-----