?序言
人生是一場消耗,要把美好的時光放在喜歡的人與事上。
寫在前面?
前面學(xué)習(xí)了job,現(xiàn)在思考一下兩個問題
文章標(biāo)記顏色說明:
- 黃色:重要標(biāo)題
- 紅色:用來標(biāo)記結(jié)論
- 綠色:用來標(biāo)記一級論點
- 藍(lán)色:用來標(biāo)記二級論點
第1個問題
job執(zhí)行完之后不會立刻從k8s面板里刪除,你可以看到有很多留存狀態(tài)的記錄,如果cronjob頻次很高,留下的這些job記錄就會增長,有沒有隱患?
解答:
頻繁留存未刪除的Job記錄可能會導(dǎo)致以下隱患:
浪費資源:每個Job都需要占用一定的資源,包括CPU、內(nèi)存等,如果留存的Job記錄過多,就會浪費寶貴的資源。
影響性能:Kubernetes控制面板需要定期查詢Job狀態(tài),如果留存的Job記錄過多,會增加查詢負(fù)擔(dān),從而影響Kubernetes控制面板的性能。
安全問題:留存的Job記錄可能包含敏感信息,如鏡像倉庫的憑證、配置文件等,如果泄露給攻擊者,可能會導(dǎo)致安全問題。
為了避免以上隱患,建議定期清理過期的Job記錄,可以通過配置Job的TTL來實現(xiàn)自動清理。另外,也可以通過手動刪除已完成的Job記錄來進(jìn)行清理。
那如何實現(xiàn)清理呢?
好的,我可以再詳細(xì)一點地解釋一下如何清理過期的Job記錄。
在Kubernetes中,可以通過設(shè)置Job的TTL(time to live)來自動刪除過期的Job記錄。TTL是指Job完成后保留在系統(tǒng)中的最長時間,超過這個時間后,Job記錄將自動被刪除。設(shè)置TTL需要在Job的spec中指定activeDeadlineSeconds字段,例如:
apiVersion: batch/v1 kind: Job #資源類型 metadata: name: my-job spec: activeDeadlineSeconds: 3600 # 設(shè)置TTL為1小時 template: # ...
上面的配置將設(shè)置TTL為1小時,即Job完成后最多保留1小時。
除了設(shè)置TTL外,還可以通過手動刪除已完成的Job記錄來進(jìn)行清理。可以使用kubectl命令來刪除Job記錄,例如:
kubectl delete job my-job
上面的命令將刪除名為my-job的Job記錄。如果要刪除所有已完成的Job記錄,可以使用以下命令:
kubectl delete jobs --field-selector=status.successful>0
這個命令將刪除所有已完成的Job記錄,其中--field-selector=status.successful>0表示只刪除成功完成的Job記錄。
需要注意的是,手動刪除Job記錄可能會刪除一些有用的信息,因此建議先備份相關(guān)數(shù)據(jù)再進(jìn)行清理。另外,如果Job頻繁執(zhí)行,建議使用自動清理的方式來避免留存過多的Job記錄。
怎么實現(xiàn)自動清理?
實現(xiàn)自動清理可以使用 Kubernetes 的 TTL Controller。
TTL Controller 是 Kubernetes 的一個控制器,它可以根據(jù)資源的 TTL 設(shè)置自動刪除過期的資源。TTL Controller 可以應(yīng)用于許多 Kubernetes 資源,包括 Job、Pod、Secret 等。
要使用 TTL Controller,需要先創(chuàng)建一個 TTL Controller 的定義文件,內(nèi)容如下:
apiVersion: batch/v1 kind: CronJob #資源類型 metadata: name: ttl-controller spec: schedule: "*/5 * * * *" # 定時清理任務(wù) jobTemplate: spec: ttlSecondsAfterFinished: 3600 # 設(shè)置TTL為1小時 template: # 定義清理任務(wù)的容器 spec: containers: - name: clean-jobs image: alpine:latest command: ["sh", "-c", "kubectl delete jobs --field-selector=status.successful>0"]
上面的定義文件將創(chuàng)建一個 CronJob,用于定時清理已完成的 Job 記錄。其中,schedule 字段用于指定定時清理任務(wù)的執(zhí)行時間,這里設(shè)置為每 5 分鐘執(zhí)行一次;ttlSecondsAfterFinished 字段用于設(shè)置 Job 記錄的 TTL,這里設(shè)置為 1 小時;template 字段中的容器定義了清理任務(wù)的執(zhí)行邏輯,這里使用了 Alpine Linux 鏡像,并通過 kubectl 命令刪除已完成的 Job 記錄。
將上述定義文件保存為 ttl-controller.yaml,并使用 kubectl apply 命令來創(chuàng)建 TTL Controller:
kubectl apply -f ttl-controller.yaml
這樣,TTL Controller 就會自動執(zhí)行定時清理任務(wù),刪除過期的 Job 記錄。需要注意的是,TTL Controller 只能刪除已完成的 Job 記錄,因此需要確保 Job 完成后才會留下記錄。另外,建議根據(jù)實際情況調(diào)整 TTL 的值和定時清理任務(wù)的頻率。
第2個問題
?在業(yè)務(wù)開發(fā)過程中,開發(fā)人員有可能不能直接操作k8s,而定時任務(wù)在業(yè)務(wù)中更新又很快,按你這種方式是每次變動都需要k8s管理人員操作的,怎么樣把定時任務(wù)的更新交給開發(fā)人員管理?
解答:
1 使用 Workload Identity實現(xiàn)
為了讓業(yè)務(wù)開發(fā)人員能夠方便地管理定時任務(wù),可以使用 Kubernetes 的 Workload Identity 功能。
Workload Identity 是 Kubernetes 的一項安全功能,可以將 Kubernetes 中的服務(wù)賬號與 Google Cloud 平臺上的服務(wù)賬號關(guān)聯(lián)起來。
使用 Workload Identity 可以讓 Kubernetes 中的服務(wù)賬號獲得訪問 Google Cloud 平臺資源的權(quán)限,從而實現(xiàn)業(yè)務(wù)開發(fā)人員管理 Kubernetes 資源的目的。
具體來說,可以按照以下步驟使用 Workload Identity 來讓業(yè)務(wù)開發(fā)人員管理定時任務(wù):
在 Google Cloud 平臺上創(chuàng)建一個服務(wù)賬號,并授予它適當(dāng)?shù)臋?quán)限,例如訪問?Kubernetes?API 的權(quán)限。
在 Kubernetes 中創(chuàng)建一個?ServiceAccount,并將它與上述服務(wù)賬號關(guān)聯(lián)起來。可以使用以下命令創(chuàng)建 ServiceAccount,并將它與服務(wù)賬號關(guān)聯(lián):
kubectl create serviceaccount my-sa gcloud iam service-accounts add-iam-policy-binding --role roles/iam.workloadIdentityUser --member "serviceAccount:my-project.svc.id.goog[my-namespace/my-sa]" my-sa@my-project.iam.gserviceaccount.com kubectl annotate serviceaccount --namespace my-namespace my-sa iam.gke.io/gcp-service-account=my-sa@my-project.iam.gserviceaccount.com ``` 上述命令中,my-sa 是創(chuàng)建的 ServiceAccount 的名稱,my-project 和 my-namespace 分別是 [Google Cloud](poe://www.poe.com/_api/key_phrase?phrase=Google%20Cloud&prompt=Tell%20me%20more%20about%20Google%20Cloud.) 平臺和 Kubernetes 集群的項目和命名空間名稱。
在 Kubernetes 中創(chuàng)建一個 Role 或 ClusterRole,并授予它適當(dāng)?shù)臋?quán)限,例如創(chuàng)建、刪除 Job 的權(quán)限。
將上述 Role 或 ClusterRole 與 ServiceAccount 關(guān)聯(lián)起來??梢允褂靡韵旅顒?chuàng)建 RoleBinding 或 ClusterRoleBinding,例如:
kubectl create rolebinding my-role-binding --role=my-role --serviceaccount=my-namespace:my-sa --namespace=my-namespace ``` 上述命令中,my-role 是上述創(chuàng)建的 Role 或 ClusterRole 的名稱,my-namespace 是 Kubernetes 集群的命名空間名稱。
將上述 ServiceAccount 的密鑰添加到業(yè)務(wù)應(yīng)用程序中,以便在調(diào)用?Kubernetes API?時使用??梢允褂靡韵旅顏慝@取 ServiceAccount 的密鑰:
kubectl get secret --namespace my-namespace $(kubectl get serviceaccount my-sa --namespace my-namespace -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.token}' | base64 --decode ``` 這個命令將獲取 ServiceAccount 的密鑰,并將其解碼為原始的 token 字符串。
通過上述步驟,業(yè)務(wù)開發(fā)人員就可以使用 ServiceAccount 的密鑰來調(diào)用 Kubernetes API,從而創(chuàng)建、更新、刪除定時任務(wù)等資源。需要注意的是,業(yè)務(wù)開發(fā)人員只能訪問被授權(quán)的資源和操作,不能訪問其他資源和操作。另外,需要確保在使用 Workload Identity 時,密鑰不被泄露,以保障安全性。
2 使用 RBAC(Role-Based Access Control)功能?
除了使用?Workload?Identity,還可以使用 Kubernetes 的 RBAC(Role-Based Access Control)功能來實現(xiàn)業(yè)務(wù)開發(fā)人員管理定時任務(wù)。
RBAC 是?Kubernetes?的一項安全功能,可以通過定義角色、角色綁定等方式來控制用戶對 Kubernetes 資源的訪問權(quán)限。使用 RBAC 可以將 Kubernetes 資源的管理權(quán)限授權(quán)給特定的用戶或組,從而實現(xiàn)業(yè)務(wù)開發(fā)人員管理 Kubernetes 資源的目的。
具體來說,可以按照以下步驟使用 RBAC 來讓業(yè)務(wù)開發(fā)人員管理定時任務(wù):
在 Kubernetes 中創(chuàng)建一個?ServiceAccount,并為它授予適當(dāng)?shù)臋?quán)限,例如創(chuàng)建、刪除 Job 的權(quán)限??梢允褂靡韵旅顒?chuàng)建 ServiceAccount:
kubectl create serviceaccount my-sa ```
在 Kubernetes 中創(chuàng)建一個 Role 或 ClusterRole,并授予它適當(dāng)?shù)臋?quán)限,例如創(chuàng)建、刪除 Job 的權(quán)限??梢允褂靡韵旅顒?chuàng)建 Role 或 ClusterRole:
kubectl create role my-role --verb=create,get,update,delete --resource=jobs ``` 上述命令中,my-role 是創(chuàng)建的 Role 或 ClusterRole 的名稱,--verb 和 --resource 參數(shù)分別用于指定授權(quán)的操作和資源類型,這里授權(quán)了創(chuàng)建、獲取、更新和刪除 Job 的權(quán)限。
將上述 Role 或 ClusterRole 與 ServiceAccount 關(guān)聯(lián)起來??梢允褂靡韵旅顒?chuàng)建 RoleBinding 或 ClusterRoleBinding,例如:
kubectl create rolebinding my-role-binding --role=my-role --serviceaccount=my-namespace:my-sa --namespace=my-namespace ``` 上述命令中,my-role 是上述創(chuàng)建的 Role 或 ClusterRole 的名稱,my-namespace 是 Kubernetes 集群的命名空間名稱。
將 ServiceAccount 的密鑰提供給業(yè)務(wù)開發(fā)人員,以便在調(diào)用 Kubernetes API 時使用??梢允褂靡韵旅顏慝@取 ServiceAccount 的密鑰:
kubectl get secret --namespace my-namespace $(kubectl get serviceaccount my-sa --namespace my-namespace -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.token}' | base64 --decode ``` 這個命令將獲取 ServiceAccount 的密鑰,并將其解碼為原始的 token 字符串。
通過上述步驟,業(yè)務(wù)開發(fā)人員就可以使用 ServiceAccount 的密鑰來調(diào)用?Kubernetes API,從而創(chuàng)建、更新、刪除定時任務(wù)等資源。需要注意的是,業(yè)務(wù)開發(fā)人員只能訪問被授權(quán)的資源和操作,不能訪問其他資源和操作。另外,需要確保在授權(quán)時,只授權(quán)必要的權(quán)限,以保障安全性。文章來源:http://www.zghlxwxcb.cn/news/detail-500400.html
3 使用項目代碼實現(xiàn)定時任務(wù)
大部分,簡單的定時任務(wù),一般是用語言自帶的定時任務(wù)去實現(xiàn)。文章來源地址http://www.zghlxwxcb.cn/news/detail-500400.html
到了這里,關(guān)于【面試題系列】關(guān)于K8s—Job的2個問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!