lqshow / notes

Cheat Sheet
10 stars 2 forks source link

k8s Service Account #44

Open lqshow opened 5 years ago

lqshow commented 5 years ago

Service Account 概念

Service Account 为 Pod 中的进程提供身份信息。

Service Account包括三个部分

  1. namespace
  2. token
  3. CA证书

Default Service Account

  1. 当 namespace 创建时,会自动创建一个名为 default 的 Service Account
  2. 当 default 的 Service Account 创建时,会自动在同 namespace 下创建一个 default-token-xxxx(secret),并关联到 default 的 Service Account 上
  3. 创建 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 中包含三部分信息

  1. 证书文件
  2. namespace
  3. 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

  1. 查看指定 namespace 下的 serviceaccount ,获取 secret
  2. 查看 secret,获取 token
  3. 在 kubeconfig 中设置 token
  4. 使用 kubectl 访问

Secret(service-account-token类型)

在创建 Service Account时,k8s 默认会创建对应的 Secret。

kubernetes.io/service-account-token类型的 Secret 对用 Pod中的三个文件

位置:/run/secrets/kubernetes.io/serviceaccount

  1. ca.crt(API Server 的 CA 公钥证书)
  2. namespace
  3. 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-----