J'exécute kubernetes v1.11.5 et j'installe helm avec un déploiement de tiller pour chaque espace de noms. Concentrons-nous sur un seul espace de noms. Voici la configuration du compte de service de barre franche:
$kubectl describe role tiller-manager Name: tiller-manager Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"rbac.authorization.k8s.io/v1","kind":"Role","metadata":{"annotations":{},"name":"tiller-manager","namespace":"marketplace-i... PolicyRule: Resources Non-Resource URLs Resource Names Verbs --------- ----------------- -------------- ----- * [] [] [*] *.apps [] [] [*] *.authorization.k8s.io [] [] [*] *.extensions [] [] [*] *.rbac.authorization.k8s.io [] [] [*] *.roles.rbac.authorization.k8s.io [] [] [*]
Lorsque j'essaie de déployer un graphique, j'obtiens cette erreur:
# Source: marketplace/templates/role.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: labels: app: citest chart: marketplace-0.1.0 heritage: Tiller release: citest namespace: marketplace-int name: marketplace-int-role-ns-admin rules: - apiGroups: ["*"] resources: ["*"] verbs: ["*"]
L'erreur survient lorsque essayer de créer la configuration rbac pour cet espace de noms (avec tiller sa):
Error: release citest failed: roles.rbac.authorization.k8s.io "marketplace-int-role-ns-admin" is forbidden: attempt to grant extra privileges: [{[*] [*] [*] [] []}] user=&{system:serviceaccount:marketplace-int:tiller 5c6af739-1023-11e9-a245-0ab514dfdff4 [system:serviceaccounts system:serviceaccounts:marketplace-int system:authenticated] map[]} ownerrules=[{[create] [authorization.k8s.io] [selfsubjectaccessreviews selfsubjectrulesreviews] [] []} {[get] [] [] [] [/api /api/* /apis /apis/* /healthz /openapi /openapi/* /swagger-2.0.0.pb-v1 /swagger.json /swaggerapi /swaggerapi/* /version /version/]} {[*] [ extensions apps rbac.authorization.k8s.io roles.rbac.authorization.k8s.io authorization.k8s.io] [*] [] []}] ruleResolutionErrors=[]
Le message d'erreur indique clairement que le compte de service de tiller n'a pas l'autorisation pour les rôles . rbac.authorization.k8s.io
mais cette autorisation est accordée comme indiqué précédemment.
--- apiVersion: v1 kind: ServiceAccount metadata: name: tiller namespace: marketplace-int --- kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: tiller-manager namespace: marketplace-int rules: - apiGroups: - "" - extensions - apps - rbac.authorization.k8s.io - roles.rbac.authorization.k8s.io - authorization.k8s.io resources: ["*"] verbs: ["*"] --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: tiller-binding namespace: marketplace-int subjects: - kind: ServiceAccount name: tiller namespace: marketplace-int roleRef: kind: Role name: tiller-manager apiGroup: rbac.authorization.k8s.io
Honnêtement, je ne comprends pas entièrement le message d'erreur pour vérifier si le Les ownerrules
sont très bien et j'essaie de savoir ce que cela signifie ce type de messages qui semble être lié à la description du rôle: {[*] [*] [*] [ ] []}
Avez-vous une idée des autorisations qui me manquent?
3 Réponses :
Vous devez d'abord donner l'autorisation d'administrateur de cluster à tiller SA.
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: tiller roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: tiller namespace: marketplace-int
Une fois que vous avez attribué le rôle d'administrateur de cluster à tiller SA, vous devriez pouvoir créer le rôle. p >
Mais je ne souhaite pas accorder d’autorisations au niveau du cluster. C’est la raison pour laquelle je crée un motoculteur par espace de noms. Oublions la barre. Avec un SA disposant des autorisations répertoriées dans ma question, je ne peux pas créer ce rôle pour un espace de noms autorisé. Est-ce exact?
Vous devriez pouvoir créer des rôles dans ce même espace de noms. J'ai essayé cela moi-même, c'est-à-dire créer un rôle en utilisant le même rôle que celui que vous avez décrit dans votre question et j'ai pu le faire avec succès (j'ai changé mon espace de noms pour tester), donc je ne pense pas que cela soit lié à votre définition de rôle, mais comment tiller utilise ce compte de service spécifique pour créer de nouvelles choses.
$ mv ~/.kube ~/.kube.tmp $ echo 'apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: labels: app: citest chart: marketplace-0.1.0 heritage: Tiller release: citest namespace: test name: marketplace-int-role-ns-admin rules: - apiGroups: ["*"] resources: ["*"] verbs: ["*"]' | kubectl -n test --token <your-token> --server <your-kubeapiserver> apply -f - role.rbac.authorization.k8s.io/marketplace-int-role-ns-admin created
Ensuite:
$ kubectl -n test describe secret tiller-token-xxxxx Name: tiller-token-xxxx Namespace: test Labels: <none> Annotations: kubernetes.io/service-account.name: tiller Type: kubernetes.io/service-account-token Data ==== ca.crt: 1025 bytes namespace: 4 bytes token: <my-token>
Puis:
# With an cluster-admin cluster role $ echo '--- apiVersion: v1 kind: ServiceAccount metadata: name: tiller namespace: test --- kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: tiller-manager namespace: test rules: - apiGroups: - "" - extensions - apps - rbac.authorization.k8s.io - roles.rbac.authorization.k8s.io - authorization.k8s.io resources: ["*"] verbs: ["*"] --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: tiller-binding namespace: test subjects: - kind: ServiceAccount name: tiller namespace: test roleRef: kind: Role name: tiller-manager apiGroup: rbac.authorization.k8s.io' | kubectl apply -f -
Cela est dû à la prévention de l'augmentation des autorisations dans RBAC. Voir https://kubernetes.io / docs / reference / access-authn-authz / rbac / # privilege-escalation-prevention-and-bootstrapping pour plus de détails.
L'autorisation de créer un objet de rôle est nécessaire, mais pas suffisante.
Un utilisateur ne peut créer / mettre à jour un rôle que si au moins l'une des choses suivantes est vraie:
ils ont déjà toutes les autorisations contenues dans le rôle, dans la même étendue que l'objet en cours de modification (à l'échelle du cluster pour un ClusterRole, dans le même espace de noms ou à l'échelle du cluster pour un rôle). Dans votre cas, cela signifierait que l'utilisateur qui tente de créer le rôle doit déjà disposer des autorisations apiGroups = *, resources = *, verbs = *
dans l'espace de noms où il tente de créer le rôle. Vous pouvez accorder cela en accordant le rôle de cluster d'administrateur de cluster au compte de service dans cet espace de noms avec une liaison de rôle.
ils reçoivent l'autorisation explicite d'exécuter le verbe "escalate" sur la ressource roles ou clusterroles dans le groupe d'API rbac.authorization.k8s.io (Kubernetes 1.12 et plus récent)
avec kubectl create clusterrolebinding tiller-clusteradmin-mkp-int --clusterrole = cluster-admin --serviceaccount = marketplace-int: tiller fonctionne très bien. Si j'ai trois déploiements de barre, tous auront l'autorisation de créer quoi que ce soit au niveau du cluster? S'il y a une erreur de configuration de CI, cela pourrait entraîner l'utilisation de tiller à l'intérieur de l'espace de noms 1 pour se déployer dans l'espace de noms2?
Vous pouvez facilement le tester vous-même.