成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

ServiceAccount Token 在不同 K8s 版本中的使用

云計(jì)算 云原生
當(dāng)創(chuàng)建 Pod 的時(shí)候規(guī)范下面有一個(gè) Spec.serviceAccount 的屬性用來(lái)指定該 Pod 使用哪個(gè) ServiceAccount,如果沒(méi)有指定的話(huà)則默認(rèn)使用Default 這個(gè) Sa。

ServiceAccount 為 Pod 中運(yùn)行的進(jìn)程提供了一個(gè)身份,Pod 內(nèi)的進(jìn)程可以使用其關(guān)聯(lián)服務(wù)賬號(hào)的身份,向集群的 APIServer 進(jìn)行身份認(rèn)證。

當(dāng)創(chuàng)建 Pod 的時(shí)候規(guī)范下面有一個(gè) spec.serviceAccount 的屬性用來(lái)指定該 Pod 使用哪個(gè) ServiceAccount,如果沒(méi)有指定的話(huà)則默認(rèn)使用 default 這個(gè) sa。然后通過(guò)投射卷,在 Pod 的目錄 /run/secrets/kubernetes.io/serviceaccount/ 下有一個(gè) token 令牌文件。我們通過(guò) RBAC 對(duì)該 sa 授予了什么權(quán)限,那么容器里的應(yīng)用拿著這個(gè) token 后,就具備了對(duì)應(yīng)的權(quán)限。

但是需要注意的是不同的 K8s 版本對(duì)該 token 文件的使用是不一樣的,所以我們這里分別進(jìn)行下簡(jiǎn)單說(shuō)明。

<=1.20 版本

使用 kind 快速創(chuàng)建一個(gè)小于等于 v1.20 版本的集群:

? ? kind create cluster --name kind120 --image kindest/node:v1.20.15
? ? kubectl get nodes
NAME STATUS ROLES AGE VERSION
kind120-control-plane Ready control-plane,master 33s v1.20.15

我們先創(chuàng)建一個(gè)字為 sa-demo 的 ServiceAccount 對(duì)象:

? ? kubectl create sa sa-demo
? ? kubectl get sa
NAME SECRETS AGE
default 1 43s
sa-demo 1 6s
? ? kubectl get secret
NAME TYPE DATA AGE
default-token-dv78w kubernetes.io/service-account-token 3 46s
sa-demo-token-4gvbw kubernetes.io/service-account-token 3 8s

我們可以看到創(chuàng)建 sa 后自動(dòng)生成了一個(gè) secret,格式為 <saname>-token-xxxx,比如我們創(chuàng)建了一個(gè)名字為 sa-demo 的 sa 之后,系統(tǒng)自動(dòng)創(chuàng)建了一個(gè)名字為 sa-demo-token-4gvbw 的 secret,這個(gè) secret 里就包含了一個(gè) token。

? ? kubectl describe secrets sa-demo-token-4gvbw
Name: sa-demo-token-4gvbw
Namespace: default
Labels: <none>
Annotations: kubernetes.io/service-account.name: sa-demo
kubernetes.io/service-account.uid: 1ae8eea9-acc6-4e3d-b378-07feb9146ac4

Type: kubernetes.io/service-account-token

Data
====
ca.crt: 1066 bytes
namespace: 7 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6ImhQNmFMNjAyaDZ5OElyMmtTNGdPUWxRdHVDU1A4aGFfVkJiNHdHMkZjQlUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InNhLWRlbW8tdG9rZW4tNGd2YnciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoic2EtZGVtbyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjFhZThlZWE5LWFjYzYtNGUzZC1iMzc4LTA3ZmViOTE0NmFjNCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OnNhLWRlbW8ifQ.j0DQmzTeSfagKYGc2dMUuzhYqVQh2puJAoQS0EMKeiAKD6rC4bUHWXWBrCu5Ttvpch6ZTEYwyCdRof1lDGWiLa3pJ1R1RwUNVQTCmVTZPs7tTuoGLRW0KGfEd0jyi4LU6uw4kA_6kwEsz4q2quWcB_fiH_Z3iKVfh1JolYTVAWTBMWnVn6gBvIrlXV5ny2oyvcPQeVfIek8aPQqhbsct_qOxrjqpZY8mpBz0ETR_EELjmcZxVVPLvomOdCqEqbV-FF5KRiFxizB3Xoh6NHz3EcsxpCZNRYdand-UFHaBQC9IPwJKzxhANGmuZuWJUCqCVGGRZTo9c6eoyVz831sZ0A

可以看到自動(dòng)生成的這個(gè) secret 對(duì)象里面包含一個(gè) token,我們也可以通過(guò)下面的命令來(lái)獲取:

? ? kubectl get secrets sa-demo-token-4gvbw -o jsnotallow='{.data.token}' | base64 -d

這個(gè) token 是 JWT 結(jié)構(gòu)的,我們可以把這個(gè) token 復(fù)制到 jwt.io 網(wǎng)站進(jìn)行解碼。

圖片

右側(cè)部分顯示了 token 被解碼之后的內(nèi)容,其中 PAYLOAD 部分是 token 里包含的 sa-demo 的信息,可以看到里面沒(méi)有過(guò)期時(shí)間,也說(shuō)明了該 token 是永不過(guò)期的。

現(xiàn)在我們使用上面我們創(chuàng)建的 sa 來(lái)運(yùn)行一個(gè) Pod:

# demo-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: demo
spec:
serviceAccount: sa-demo
containers:
- name: demo
image: nginx:1.7.9
ports:
- containerPort: 80

直接創(chuàng)建該 Pod 即可:

? ? kubectl apply -f demo-pod.yaml
? ? kubectl get pods
NAME READY STATUS RESTARTS AGE
demo 1/1 Running 0 81s
? ? kubectl get pod demo -oyaml
apiVersion: v1
kind: Pod
metadata:
name: demo
namespace: default
spec:
containers:
- image: nginx:1.7.9
imagePullPolicy: IfNotPresent
name: demo
# ......
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: sa-demo-token-4gvbw
readOnly: true
# ......
volumes:
- name: sa-demo-token-4gvbw
secret:
defaultMode: 420
secretName: sa-demo-token-4gvbw

Pod 創(chuàng)建后我們可以看到會(huì)自動(dòng)將指定 sa 對(duì)應(yīng)的 secret 掛載到容器的 /var/run/secrets/kubernetes.io/serviceaccount 目錄下去,所以現(xiàn)在該目錄下面肯定包含對(duì)應(yīng)的 token 文件,我們可以查看該值來(lái)驗(yàn)證下:

? ? kubectl exec -it demo -- cat /run/secrets/kubernetes.io/serviceaccount/token
eyJhbGciOiJSUzI1NiIsImtpZCI6ImhQNmFMNjAyaDZ5OElyMmtTNGdPUWxRdHVDU1A4aGFfVkJiNHdHMkZjQlUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InNhLWRlbW8tdG9rZW4tNGd2YnciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoic2EtZGVtbyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjFhZThlZWE5LWFjYzYtNGUzZC1iMzc4LTA3ZmViOTE0NmFjNCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OnNhLWRlbW8ifQ.j0DQmzTeSfagKYGc2dMUuzhYqVQh2puJAoQS0EMKeiAKD6rC4bUHWXWBrCu5Ttvpch6ZTEYwyCdRof1lDGWiLa3pJ1R1RwUNVQTCmVTZPs7tTuoGLRW0KGfEd0jyi4LU6uw4kA_6kwEsz4q2quWcB_fiH_Z3iKVfh1JolYTVAWTBMWnVn6gBvIrlXV5ny2oyvcPQeVfIek8aPQqhbsct_qOxrjqpZY8mpBz0ETR_EELjmcZxVVPLvomOdCqEqbV-FF5KRiFxizB3Xoh6NHz3EcsxpCZNRYdand-UFHaBQC9IPwJKzxhANGmuZuWJUCqCVGGRZTo9c6eoyVz831sZ0A

可以看到 Pod 里通過(guò)投射卷所掛載的 token 跟 sa-demo 對(duì)應(yīng)的 secret 包含的 token 是模一樣的,這個(gè) token 是永不過(guò)期的,所以即使刪除了 Pod 之后重新創(chuàng)建,Pod 里的 token 仍然是不變的,因?yàn)?secret 對(duì)象里面的 token 數(shù)據(jù)并沒(méi)有變化。

如果需要在 Pod 中去訪(fǎng)問(wèn) K8s 集群的資源對(duì)象,現(xiàn)在就可以為使用的 sa 綁定上相應(yīng)的權(quán)限,然后在 Pod 應(yīng)用中使用該對(duì)應(yīng)的 token 去和 APIServer 進(jìn)行通信就可以了,這個(gè)時(shí)候的 token 就能識(shí)別到對(duì)應(yīng)的權(quán)限了。

>=1.21 版本 && <= 1.23 版本

接下來(lái)我們基于 >= 1.21 && <= 1.23 版本的 K8s 集群進(jìn)行測(cè)試。

這里我們使用 kind 快速創(chuàng)建一個(gè) v1.22.15 版本的集群:

? ? kind create cluster --name kind122 --image kindest/node:v1.22.15
? ? kubectl get nodes
NAME STATUS ROLES AGE VERSION
kind122-control-plane Ready control-plane,master 115s v1.22.15

同樣首先創(chuàng)建一個(gè)名為 sa-demo 的 ServiceAccount 對(duì)象:

? ? kubectl create sa sa-demo
? ? kubectl get sa
NAME SECRETS AGE
default 1 43s
sa-demo 1 6s
? ? kubectl get secret
NAME TYPE DATA AGE
default-token-9w9bp kubernetes.io/service-account-token 3 116s
sa-demo-token-g7d2g kubernetes.io/service-account-token 3 8s

同樣可以看到創(chuàng)建 sa 后系統(tǒng)也自動(dòng)創(chuàng)建了一個(gè)對(duì)應(yīng)的 secret 對(duì)象,和以前版本沒(méi)什么區(qū)別,我們也可以通過(guò)下面的命令來(lái)獲得該 secret 對(duì)象里面包含的 token 值:

? ? kubectl get secrets sa-demo-token-g7d2g -o jsnotallow='{.data.token}' | base64 -d
eyJhbGciOiJSUzI1NiIsImtpZCI6Im1ERkhnQ3Y3b1oxUmNHbWVhN210SDEwNXY2dVNkc0QzdXJjTkhsY21FRVEifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InNhLWRlbW8tdG9rZW4tZzdkMmciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoic2EtZGVtbyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjI3ZGI0M2FjLTdjYjItNDQ2Yi05N2Q1LWU0MGUzOWRjZTg4YyIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OnNhLWRlbW8ifQ.fnSaqrZKolTfz2pi9t32X38Er60WSzUoRHArte6qVmQ1NTaMis4F6rESWekeJvGW26szTJdll6vK8KtL_IRO2m6sp_fEAYfNMQMXL4CuaRByXeAavDqLgMHhodf4k4Yg-Mj4LCQ3aHOxojbAbPT1i_h17Ewivc39fmzp-dAXbHhhWhCW2Vl_CkM-F-UtzLyDwThvJedkeetrfyOOjE7K6HpzWfqIQyMUdCJog3WnFO_4kHXacFCgYg_gNPMYyViQAsTsxB8FplGdEzRuWKnQO9cDE55V4l55IxmE0er-dSSdG8085PzxaM_lMCtRI8YtjRjxcbxS5QkTm5R_ps0IsA

同樣將該 token 值拷貝到 jwt.io 網(wǎng)站進(jìn)行解碼。

圖片

從解碼后的值可以看到該 token 值里面同樣不包含任何過(guò)期時(shí)間,也說(shuō)明了我們創(chuàng)建 sa 之后,所對(duì)應(yīng)的 token 是永不過(guò)期的。

同樣我們?cè)俅问褂蒙厦娴?sa 來(lái)創(chuàng)建一個(gè) Pod,如下所示:

# demo-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: demo
spec:
serviceAccount: sa-demo
containers:
- name: demo
image: nginx:1.7.9
ports:
- containerPort: 80

直接創(chuàng)建該 Pod:

? ? kubectl apply -f demo-pod.yaml
? ? kubectl get pods
NAME READY STATUS RESTARTS AGE
demo 1/1 Running 0 81s
? ? kubectl get pod demo -oyaml
apiVersion: v1
kind: Pod
metadata:
name: demo
namespace: default
spec:
containers:
- image: nginx:1.7.9
imagePullPolicy: IfNotPresent
name: demo
ports:
- containerPort: 80
protocol: TCP
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-6wmfb
readOnly: true
# ......
volumes:
- name: kube-api-access-6wmfb
projected:
defaultMode: 420
sources:
- serviceAccountToken:
expirationSeconds: 3607
path: token
- configMap:
items:
- key: ca.crt
path: ca.crt
name: kube-root-ca.crt
- downwardAPI:
items:
- fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
path: namespace

當(dāng) Pod 創(chuàng)建后查看對(duì)應(yīng)的資源對(duì)象,可以看到和之前的版本已經(jīng)有一個(gè)很大的區(qū)別了,并不是將上面自動(dòng)創(chuàng)建的 secret 掛載到容器的 /var/run/secrets/kubernetes.io/serviceaccount 目錄。我們可以查看下 Pod 中的 token 值來(lái)和 secret 包含的 token 值進(jìn)行對(duì)比:

? ? kubectl exec -it demo -- cat /run/secrets/kubernetes.io/serviceaccount/token
eyJhbGciOiJSUzI1NiIsImtpZCI6Im1ERkhnQ3Y3b1oxUmNHbWVhN210SDEwNXY2dVNkc0QzdXJjTkhsY21FRVEifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzA1MDI1NDU4LCJpYXQiOjE2NzM0ODk0NTgsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJkZWZhdWx0IiwicG9kIjp7Im5hbWUiOiJkZW1vIiwidWlkIjoiNzY1ODRmODAtZjU1My00Mzk2LWIxOTUtMDEwOTBhMzM4MWYyIn0sInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJzYS1kZW1vIiwidWlkIjoiMjdkYjQzYWMtN2NiMi00NDZiLTk3ZDUtZTQwZTM5ZGNlODhjIn0sIndhcm5hZnRlciI6MTY3MzQ5MzA2NX0sIm5iZiI6MTY3MzQ4OTQ1OCwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6c2EtZGVtbyJ9.TAoe1eCHCXUoHh6oM4uySp8kzRaLQ44GZdU02Ir8m_dzYpdFSw4nwsNyqPggrZdDL3BMH4zceudBEdQuyxiSsrpVDeQKww2wTGhXAr2hWujrJq4ycmu6aMywyv2iRX9Vn-Las1giWK_bFuzCxiR10Lcgyd5N7VjB2WcT7K8rN7dAeUWgiH2s9lMOzoaIorUDXzlnSTcmxkhz1h7RXYKVGaqZBbd5wJsRnINZPGxqsS-wi21Aw2FFmIeeK8GGlnAqnS0f3VS1N2jm03gKPii-sMt0GARse4HsmhGAhyJnt9za6ZNpBgcybd7uEBjgIVrRFTkqBJOjPrAnMvRucVtwww

可以很明顯看到現(xiàn)在 Pod 中的 token 值和自動(dòng)創(chuàng)建 secret 的 token 值不一樣了,同樣在 jwt.io 解碼該 token 值。

圖片

可以看到該 token 值解碼后的 PAYLOAD 數(shù)據(jù)中包含了很多不同的數(shù)據(jù),其中的 exp 字段表示該 token 的過(guò)期時(shí)間,可以看到過(guò)期時(shí)間是 1 年。

這里我們可以總結(jié)下在 v1.21 到 v1.23 版本的 K8s 集群,當(dāng)創(chuàng)建 ServiceAccount 對(duì)象后,系統(tǒng)仍然會(huì)自動(dòng)創(chuàng)建一個(gè) secret 對(duì)象,該 secret 對(duì)象里面包含的 token 仍然是永不過(guò)期的,但是 Pod 里面并不會(huì)使用該 secret 的 token 值了。

從上面查看創(chuàng)建后的 Pod 資源清單可以看出,現(xiàn)在創(chuàng)建 Pod 后,Kubernetes 控制平面會(huì)自動(dòng)添加一個(gè)投射卷到 Pod,此卷包括了訪(fǎng)問(wèn) Kubernetes API 的 token,該清單片段定義了由三個(gè)數(shù)據(jù)源組成的投射卷,這三個(gè)數(shù)據(jù)源是:

  • serviceAccountToken 數(shù)據(jù)源:包含 kubelet 從 kube-apiserver 獲取的令牌,kubelet 使用 TokenRequest API 獲取有時(shí)間限制的令牌。為 TokenRequest 服務(wù)的這個(gè)令牌會(huì)在 Pod 被刪除或定義的生命周期(默認(rèn)為 1 小時(shí))結(jié)束之后過(guò)期。該令牌綁定到特定的 Pod, 并將其 audience(受眾)設(shè)置為與 kube-apiserver 的 audience 相匹配。 這種機(jī)制取代了之前基于 Secret 添加卷的機(jī)制,之前 Secret 代表了針對(duì) Pod 的 ServiceAccount 但不會(huì)過(guò)期。
  • configMap 數(shù)據(jù)源:ConfigMap 包含一組證書(shū)頒發(fā)機(jī)構(gòu)數(shù)據(jù),Pod 可以使用這些證書(shū)來(lái)確保自己連接到集群的 kube-apiserver(而不是連接到中間件或意外配置錯(cuò)誤的對(duì)等點(diǎn)上)。
  • downwardAPI 數(shù)據(jù)源:用于查找包含 Pod 的名字空間的名稱(chēng),并使該名稱(chēng)信息可用于在 Pod 內(nèi)運(yùn)行的應(yīng)用程序代碼。

所以我們應(yīng)該要指定現(xiàn)在版本的 K8s 集群創(chuàng)建的 Pod 里面包含的 token 不是使用 ServiceAccount 自動(dòng)關(guān)聯(lián)的 secret 對(duì)象里面的 token 了,而是 kubelet 會(huì)向 TokenRequest API? 發(fā)送一個(gè)請(qǐng)求,申請(qǐng)一個(gè)新的 token 放在 Pod 的 /run/secrets/kubernetes.io/serviceaccount/token 里。這個(gè) token 會(huì)在 1 個(gè)小時(shí)后由 kubelet 重新去申領(lǐng)一個(gè)新的 token,所以 1 小時(shí)之后再次查看這個(gè) token 的話(huà)會(huì)發(fā)現(xiàn) token 的內(nèi)容是變化的,如果刪除此 Pod 重新創(chuàng)建的話(huà),則會(huì)重新申領(lǐng) token,被刪除 Pod 里的 token 會(huì)立即過(guò)期。

而且我們還可以手動(dòng)使用 kubectl create token <sa> 命令來(lái)請(qǐng)求 ServiceAccount 的 token,可以指定有效期等:

? ? kubectl create token -h
Request a service account token.

Examples:
# Request a token to authenticate to the kube-apiserver as the service account "myapp" in the current namespace
kubectl create token myapp

# Request a token for a service account in a custom namespace
kubectl create token myapp --namespace myns

# Request a token with a custom expiration
kubectl create token myapp --duration 10m

# Request a token with a custom audience
kubectl create token myapp --audience https://example.com

# Request a token bound to an instance of a Secret object
kubectl create token myapp --bound-object-kind Secret --bound-object-name mysecret

# Request a token bound to an instance of a Secret object with a specific uid
kubectl create token myapp --bound-object-kind Secret --bound-object-name mysecret --bound-object-uid
0d4691ed-659b-4935-a832-355f77ee47cc

Options:
# ......

?>=?1.24 版本

現(xiàn)在我們?cè)賮?lái)看下 v1.24 版本以上的 K8s 集群中的 ServiceAccount token 是如何工作的。這里我們使用 kind 快速創(chuàng)建一個(gè) v1.25.3 版本的集群:

? ? kind create cluster --name kind125 --image kindest/node:v1.25.3
? ? kubectl get nodes
NAME STATUS ROLES AGE VERSION
kind125-control-plane Ready control-plane,master 115s v1.25.3

同樣創(chuàng)建一個(gè)名為 sa-demo 的 ServiceAccount:

? ? kubectl create sa sa-demo
? ? kubectl get sa
NAME SECRETS AGE
default 0 39d
sa-demo 0 5s
? ? kubectl get secrets
No resources found in ns1 namespace

我們可以看到該 ServiceAccount 創(chuàng)建后并沒(méi)有創(chuàng)建對(duì)應(yīng)的 Secret 對(duì)象。同樣接下來(lái)創(chuàng)建一個(gè)如下所示的 Pod:

# demo-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: demo
spec:
serviceAccount: sa-demo
containers:
- name: demo
image: nginx:1.7.9
ports:
- containerPort: 80

創(chuàng)建上面的 Pod 后查看詳情:

? ? kubectl apply -f demo-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: demo
namespace: default
spec:
containers:
- image: nginx:1.7.9
imagePullPolicy: IfNotPresent
name: demo
ports:
- containerPort: 80
protocol: TCP
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-pftqd
readOnly: true
# ......
volumes:
- name: kube-api-access-pftqd
projected:
defaultMode: 420
sources:
- serviceAccountToken:
expirationSeconds: 3607
path: token
- configMap:
items:
- key: ca.crt
path: ca.crt
name: kube-root-ca.crt
- downwardAPI:
items:
- fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
path: namespace

可以看到創(chuàng)建 Pod 后同樣會(huì)自動(dòng)添加一個(gè)投射卷到 Pod,此卷包括了訪(fǎng)問(wèn) Kubernetes API 的令牌,和 >=1.21 版本 && <= 1.23 版本 表現(xiàn)是一致的。同樣我們可以下查看 Pod 中的 token 值來(lái)進(jìn)行驗(yàn)證:

? ? kubectl exec -it demo -- cat /run/secrets/kubernetes.io/serviceaccount/token
eyJhbGciOiJSUzI1NiIsImtpZCI6IndnazJLZENQTktiZkxVejhnMnhmTHJYRTlkZ2ZnOHJGQmgwVW4td3BWd0kifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzA0ODg0MDg0LCJpYXQiOjE2NzMzNDgwODQsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJkZWZhdWx0IiwicG9kIjp7Im5hbWUiOiJkZW1vIiwidWlkIjoiMTY0ZTIwZTYtYjNjMi00ZmQ5LWI3ZTUtMDZjYTExZWIyOWM4In0sInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJzYS1kZW1vIiwidWlkIjoiYjJlNWM3ZmYtNjlhNy00NzYyLTkxMDctM2UxNzZhYmQ3NTdiIn0sIndhcm5hZnRlciI6MTY3MzM1MTY5MX0sIm5iZiI6MTY3MzM0ODA4NCwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6c2EtZGVtbyJ9.lhYscyn_d9Y3GZSipSqGj4Jtsu8qsIyz34L18lv37HxjjGU_bQmUFCXYf_CRom8DfadHppmlaskZS18KmyTV1Z09BeujJd8viUnnYCWb9K6VJB5uPBYWLB0FETfgQy7Kqu8Gvk8qBKLjdCkl8U2vr2Oqd2qSEDyvqhNBQXnckQRH6wyypBUc7EXSGAJf6dPVE3c6XqnbXMJ7SRZb5svE-hv0lZKmJrouz9Ia4qxUXUtpzDlMPnHOym2x9d1TSSZ1Lp7BOsqTnxlUQVueh9w869jAajrP1G9e5zhZwZBfzRfARqCVqoLid_hOQP-mo4MLfHbn61SWItlCBd75nl2WLQ

我們可以把上面輸出的 token 值拷貝到 jwt.io 里進(jìn)行解碼。

圖片

從上面的數(shù)據(jù)可以看到這里的 token 的有效期也為 1 年,這個(gè) token 在 Pod 里也是每 1 小時(shí)會(huì)更新一次,如果 Pod 被刪除重建,那么會(huì)重新申領(lǐng)一個(gè)新的 token,被刪除 Pod 里的 token 立即過(guò)期。

需要注意的沒(méi)有特定的機(jī)制使通過(guò) TokenRequest 簽發(fā)的令牌無(wú)效,如果你不再信任為某個(gè) Pod 綁定的 ServiceAccount 令牌,你可以刪除該 Pod,刪除 Pod 將使其綁定的令牌過(guò)期。

總結(jié)

我們可以簡(jiǎn)單總結(jié)下不同版本的 K8s 集群下面的 ServiceAccount Token 是如何工作的。

  • 1.20(含 1.20)之前的版本,在創(chuàng)建 sa 時(shí)會(huì)自動(dòng)創(chuàng)建一個(gè) secret,然后這個(gè)會(huì)把這個(gè) secret 通過(guò)投射卷掛載到 pod 里,該 secret 里面包含的 token 是永久有效的。
  • 1.21~1.23 版本,在創(chuàng)建 sa 時(shí)也會(huì)自動(dòng)創(chuàng)建 secret,但是在 pod 里并不會(huì)使用 secret 里的 token,而是由 kubelet 到 TokenRequest API 去申請(qǐng)一個(gè) token,該 token 默認(rèn)有效期為一年,但是 pod 每一個(gè)小時(shí)會(huì)更新一次 token。
  • 1.24 版本及以上,在創(chuàng)建 sa 時(shí)不再自動(dòng)創(chuàng)建 secret 了,只保留由 kubelet 到 TokenRequest API 去申請(qǐng) token。

當(dāng)然我們?nèi)匀豢梢允謩?dòng)創(chuàng)建 Secret 來(lái)保存 ServiceAccount 令牌,例如在你需要一個(gè)永不過(guò)期的令牌的時(shí)候。一旦手動(dòng)創(chuàng)建一個(gè) Secret 并將其關(guān)聯(lián)到 ServiceAccount,Kubernetes 控制平面就會(huì)自動(dòng)將令牌填充到該 Secret 中。

盡管存在手動(dòng)創(chuàng)建長(zhǎng)久 ServiceAccount 令牌的機(jī)制,但還是推薦使用 TokenRequest 獲得短期的 API 訪(fǎng)問(wèn)令牌。

責(zé)任編輯:姜華 來(lái)源: k8s技術(shù)圈
相關(guān)推薦

2024-08-30 09:21:28

2022-01-22 21:38:19

K8SRedisRedis clus

2022-04-22 13:32:01

K8s容器引擎架構(gòu)

2023-11-06 07:16:22

WasmK8s模塊

2020-12-15 18:56:26

MirantisDockersKubernetes

2023-12-05 18:16:59

LTS版本K8s

2020-07-17 08:40:47

K8SServicePOD

2022-06-14 07:56:15

Kubernetes存儲(chǔ)架構(gòu)K8S

2024-01-02 14:56:37

K8s部署應(yīng)用程序

2023-09-06 08:12:04

k8s云原生

2024-07-15 18:20:18

2024-01-26 14:35:03

鑒權(quán)K8sNode

2021-07-14 14:20:22

root命令Linux

2023-09-15 07:34:15

AIOps云原生項(xiàng)目

2022-06-01 09:38:36

KubernetesPod容器

2021-08-05 07:28:26

K8sNFS ProvisiSubdir

2020-05-12 10:20:39

K8s kubernetes中間件

2022-09-05 08:26:29

Kubernetes標(biāo)簽

2023-05-25 21:38:30

2023-08-03 08:36:30

Service服務(wù)架構(gòu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 一区二区三区高清 | 天天夜夜操| 国产精品123区 | 欧美在线观看免费观看视频 | 日本欧美在线观看视频 | 国产a视频 | 久久免费小视频 | 欧美精品在线播放 | 麻豆av在线免费观看 | 国产精品久久久乱弄 | 在线观看视频一区二区三区 | 久久成人精品视频 | 91一区| 91极品尤物在线播放国产 | 在线黄色影院 | 天天色天天射天天干 | 国产不卡在线播放 | 日韩影院在线观看 | 亚洲精品一区二区三区四区高清 | 国产成人精品一区二区 | 日本一区二区不卡 | 日韩电影一区二区三区 | 国产在线视频网 | 免费在线观看一区二区三区 | 国产精品欧美一区二区三区不卡 | 精品在线观看一区 | 日韩一二区在线 | 久久躁日日躁aaaaxxxx | 午夜小视频免费观看 | 国产一伦一伦一伦 | 久草综合在线 | 日韩在线欧美 | 亚洲小视频 | 欧美性jizz18性欧美 | 可以在线观看av的网站 | 国产视频第一页 | 日本不卡一区二区三区在线观看 | 永久av| 奇色影视 | 91国内产香蕉 | 男女啪啪高潮无遮挡免费动态 |