J'ai un compte de service auquel j'aimerais accorder des autorisations pour lire/écrire/mettre à jour/supprimer des secrets dans un espace de noms spécifique. Je ne sais pas exactement comment les comptes de service, les rôles, les liaisons, etc. fonctionnent ensemble pour accorder les bonnes autorisations.
Quelles kubectl
invocations ou YAML dois-je faire pour accorder ces autorisations au compte de service?
Voici le YAML pour le compte de service que j'ai jusqu'à présent:
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: 2018-10-09T17:45:20Z
name: testaccount
namespace: test
resourceVersion: "369702913"
selfLink: /api/v1/namespaces/test/serviceaccounts/testaccount
uid: f742ed5c-c1b3-11e8-8a69-0ade4132ab56
secrets:
- name: testaccount-token-brjxq
Vous devez créer un rôle et une liaison de rôle.
Créez un rôle:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: test
name: role-test-account
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
Créez une liaison de rôle:
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: role-test-account-binding
namespace: test
subjects:
- kind: ServiceAccount
name: test-account
namespace: test
roleRef:
kind: Role
name: role-test-account
apiGroup: rbac.authorization.k8s.io
Vous pouvez en savoir plus sur en utilisant l'autorisation RBAC
Vous avez donc votre SA testaccount
. Supposons que votre application (celle qui manipule les secrets) possède une image de conteneur myorg/myapp:01
. Vous le lanceriez alors comme suit:
$ kubectl -n test run myapp \
--image=myorg/myapp:01 \
--serviceaccount=testaccount
Mais qu'en est-il des autorisations? Eh bien, peu importe si vous le faites avant ou après le lancement de l'application, mais à un moment donné, faites:
$ kubectl create clusterrole secretmanipulator \
--verb=get --verb=list --verb=watch \
--verb=create --verb=update --verb=patch --verb=delete \
--resource=secrets
$ kubectl -n test create rolebinding allowsecretmanipulation \
--clusterrole=secretmanipulator \
--serviceaccount=test:testaccount
Notez que j'ai créé un rôle de cluster ci-dessus et utilisé une liaison de rôle puis pour l'attacher à votre SA. Pourquoi? C'est plus réutilisable comme ça. Bien sûr, un rôle simple fonctionnerait également ici, mais vous devriez alors le recréer pour chaque espace de noms.