我試圖在我自己托管的gitlab實體中訪問我的kubernetes集群,正如docs中所描述的那樣。
。deploy:
stage: deployment
腳本:
- kubectl 創建 secret docker-registry gitlab-registry --docker-server="$CI_REGISTRY"/span> --docker-username="$CI_DEPLOY_USER"/span> --docker- password="$CI_DEPLOY_PASSWORD" --docker-email="$GITLAB_USER_EMAIL" -o yaml - -dry-run=client | kubectl apply -f -
但我確實得到了錯誤的資訊
Error from server (Forbidden)。 檢索當前配置時出現錯誤: (禁止)。
Resource: "/v1, Resource=secrets", GroupVersionKind: "/v1, Kind=Secret"
Name: "gitlab-registry", Namespace: "gitlab"
from server for: "STDIN": secrets "gitlab-registry" 是禁止的。 User "system:serviceaccount:gitlab: default" cannot get resource "secrets" in in string">API group "" in in the namespace "gitlab"
我不理解這個錯誤。為什么我會得到一個禁止的錯誤?
Update
kubernetes集群在實體層面上被集成到gitlab中。
但在CI管道中運行kubectl config view時,我得到了
apiVersion: v1
clusters: null
contextts: null
current-context: ""/span>
kind: Config
preferences: {}。
users: null
Update2
感謝AndD,可以用這個角色/服務賬戶來創建秘密:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
namespace: Gitlab
名稱: gitlab-deploy
規則:
- apiGroups: [""] # "" 表示核心API組
資源: ["secrets"]
諺語。 ["get"/span>, "list"/span>, "watch"/span>。"創建", "更新", "修補", "洗掉"]
apiVersion: rbac.authorization.k8s.io/v1)
kind: ClusterRoleBinding[/span
元資料:
name: use-secrets
namespace: gitlab
主題:
- kind: ServiceAccount
名稱: 默認
namespace: gitlab
roleRef: gitlab
kind: ClusterRole
name: gitlab-deploy
apiGroup: rbac.authorization.k8s.io
但是對這個namespace.yaml檔案運行一個簡單的應用
apiVersion: v1
kind: Namespace
metadata: Namespace
name: myns
給我一個類似的錯誤:
Error from server (forbidden): 檢索當前配置時出現錯誤: (禁止)。
Resource: "/v1, Resource=namespaces", GroupVersionKind: "/v1, Kind=Namespace"
名稱: "myns", 命名空間: ""
from server for: "namespace. yaml": namespaces "myns" 是禁止的: User "system:serviceaccount:gitlab: default" cannot get resource "namespaces" in API group "" in in the namespace "myns"
我使用ClusterBinding來獲得這個作業,即使是對不同的命名空間。我做錯了什么?
uj5u.com熱心網友回復:
Kubernetes使用基于角色的訪問控制(RBAC)來防止Pod和用戶能夠與集群中的資源互動,除非他們沒有得到授權。
從錯誤中,你可以看到Gitlab正試圖使用secrets資源,并且它正在使用其命名空間中的ServiceAccount服務賬戶作為default。
這意味著Gitlab沒有被配置為使用特定的ServiceAccount,這意味著它使用了默認的ServiceAccount(在集群的每個命名空間都有一個默認的服務賬戶)
您可以通過使用
Role / ClusterRole 和 RoleBinding / ClusterRoleBinding 將角色授權和權限附加到服務帳戶。
Role或ClusterRoles描述權限。例如,一個角色可以是:
apiVersion: rbac.authorization.k8s.io/v1。
kind: Role
metadata:
namespace: gitlab
name: secret-user
規則:
- apiGroups: [""] # "" 表示核心API組
資源: ["secrets"]
諺語。 ["get"/span>, "list"/span>, "watch"/span>。"創建", "更新", "修補", "洗掉"]
而這說明 "無論誰擁有這個角色,都可以用秘密做任何事情(所有的動詞),但只能在命名空間gitlab中進行"
如果你想在所有命名空間中給予通用權限,你可以使用 ClusterRole 來代替,這非常類似。
一旦創建了角色,你就可以將它附加到一個用戶、一個組或一個服務賬戶上,例如:
apiVersion: rbac.authority.k8s.io/v1
種類: RoleBinding
metadata: RoleBinding
name: use-secrets
namespace: gitlab
主題:
subjects:
- kind: ServiceAccount
name: default
namespace: gitlab
roleRef: gitlab
# "roleRef "指定與Role/ClusterRole的系結。
kind: Role # this must be Role or ClusterRole。
name: secret-user # this must match the name of the Role or ClusterRole you wish to bind to.
apiGroup: rbac.authorization.k8s.io。
這樣就把之前創建的角色系結到命名空間gitlab中名為default的ServiceAccount。
然后,在命名空間gitlab中運行的所有Pod并使用default服務帳戶,將能夠使用secrets(使用角色中列出的動詞)但僅在角色指定的命名空間中。
正如你所看到的
服務賬戶 - https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
RBAC - https://kubernetes.io/docs/reference/access-authn-authz/rbac/
RBAC資源串列 - 如何在一個角色定義中參考所有的子資源?
更新
你沒有做錯什么。只是你試圖使用namespace資源,但Gitlab沒有允許訪問該型別資源的系結。在你的ClusterRole中,你只是給了它對secrets的訪問權,但沒有別的。
考慮給ClusterRole更多的權限,改變它以列出所有你需要訪問的資源:
考慮給ClusterRole更多的權限。
rules:
- apiGroups: [""] # "" 表示核心API組
資源: ["secrets", "namespaces", "pods"]
諺語。 ["get"/span>, "list"/span>, "watch"/span>, "創建", "更新", "修補", "洗掉"]
例如,這將給予對秘密、命名空間和Pod的訪問權。
。作為一個替代方案,你可以將Gitlab的服務賬戶與cluster-admin系結,直接讓它訪問一切。
kubectl create clusterrolebinding gitlab-is-now-cluster-admin
--clusterrole=cluster-admin
--serviceaccount=gitlab:default
在這樣做之前ho,請考慮以下幾點:
細粒度的角色系結提供了更大的安全性,但需要更多的 管理的努力。更廣泛的授予可能會給予不必要的(和 更廣泛的授予可能會給服務帳戶提供不必要的(而且可能是升級的)API 訪問權,但更容易管理。 管理。
因此,首先決定哪些資源可以被Gitlab使用,然后創建一個只允許訪問這些資源的Role/ClusterRole(并使用你需要的動詞),這樣會更安全。轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/319486.html
標籤:
