web-dev-qa-db-fra.com

Compte de service par défaut de l'espace de noms Kubernetes

Sauf indication contraire, le pod est exécuté avec le compte de service par défaut dans l'espace de noms, comment puis-je vérifier ce que le compte de service par défaut est autorisé à faire, et avons-nous besoin qu'il y soit monté avec chaque pod, sinon, comment pouvons-nous désactivez ce comportement au niveau de l'espace de noms ou au niveau du cluster.

Toujours en train de chercher la documentation.

Environnement: Kubernetes 1.12, avec RBAC

Quels autres cas d'utilisation le compte de service par défaut doit-il gérer? Pouvons-nous/devrions-nous l'utiliser comme compte de service pour créer et gérer les déploiements k8s dans un espace de noms? , par exemple, nous n'utiliserons pas de comptes d'utilisateurs réels pour créer des éléments dans le cluster car les utilisateurs viennent et partent dans l'équipe/l'organisation.

6
Ijaz Ahmad Khan
  1. Un compte de service par défaut est automatiquement créé pour chaque espace de noms, chaque espace de noms aura un sa par défaut

kubectl get sa

NOM SECRETS AGE

par défaut 1 1d

  1. des services peuvent être ajoutés au besoin. Chaque pod est associé à exactement un serviceAccount mais plusieurs pods peuvent utiliser le même serviceaccount.

  2. un pod peut uniquement utiliser un compte de service du même espace de noms.

  3. Vous pouvez attribuer un compte de service à un module en spécifiant le nom du compte dans le manifeste du module. Si vous ne l'attribuez pas explicitement, le module utilisera le compte de service par défaut dans l'espace de noms

  4. Les autorisations par défaut pour un ServiceAccount ne lui permettent pas de répertorier ou de modifier des ressources. Le compte de service par défaut n'est pas autorisé à afficher l'état du cluster et encore moins à le modifier de quelque manière que ce soit

  5. Par défaut, le serviceAccount par défaut dans un espace de noms n'a pas d'autorisations autres que celles d'un utilisateur non authentifié.

  6. Par conséquent, les modules par défaut ne peuvent même pas afficher l'état du cluster. C'est à vous de leur accorder les autorisations appropriées pour le faire.

kubectl exec -it test -n foo sh/# curl localhost: 8001/api/v1/namespaces/foo/services {"kind": "Status",
"apiVersion": "v1", "métadonnées": {

}, "status": "Failure", "message": "services is interdite: User \" system: serviceaccount: foo: default\"can't list resource \" services\"in API group \"\"in the namespace\"foo \" "," raison ":" Interdit "," détails ": {" kind ":" services "}," code ": 403

comme on peut le voir ci-dessus, le compte de service par défaut ne peut pas répertorier les services

mais quand on leur donne un rôle approprié et une liaison de rôle comme ci-dessous

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  creationTimestamp: null
  name: foo-role
  namespace: foo
rules:
- apiGroups:
  - ""
  resources:
  - services
  verbs:
  - get
  - list

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  creationTimestamp: null
  name: test-foo
  namespace: foo
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: foo-role
subjects:
- kind: ServiceAccount
  name: default
  namespace: foo

maintenant je peux lister le service resurce

kubectl exec -it test -n foo sh
/ # curl localhost:8001/api/v1/namespaces/foo/services
{
  "kind": "ServiceList",
  "apiVersion": "v1",
  "metadata": {
    "selfLink": "/api/v1/namespaces/bar/services",
    "resourceVersion": "457324"
  },
  "items": []
  1. donner à tous vos services Comptes le clusteradmin clusterrole est une mauvaise idée de son mieux pour ne donner à chacun que les autorisations dont il a besoin pour faire son travail et pas une seule autorisation plus

  2. C'est une bonne idée de créer un compte de service spécifique pour chaque module, puis de l'associer à un rôle sur mesure ou à un rôle de cluster via une liaison de rôle.

  3. Si l'un de vos pods n'a besoin que de lire les pods tandis que l'autre doit également les modifier, créez deux comptes de service différents et faites en sorte que ces pods les utilisent en spécifiant la propriété serviceaccountName dans la spécification de pod

vous pouvez consulter le lien ci-dessous pour une explication approfondie

Exemple de compte de service avec rôles

Tu peux vérifier

kubectl explique serviceaccount.automountServiceAccountToken et modifie le compte de service

kubectl edit serviceaccount default -o yaml

apiVersion: v1
automountServiceAccountToken: false
kind: ServiceAccount
metadata:
  creationTimestamp: 2018-10-14T08:26:37Z
  name: default
  namespace: default
  resourceVersion: "459688"
  selfLink: /api/v1/namespaces/default/serviceaccounts/default
  uid: de71e624-cf8a-11e8-abce-0642c77524e8
secrets:
- name: default-token-q66j4

une fois ce changement effectué, le pod que vous générez ne possède pas de jeton de compte de service, comme illustré ci-dessous.

kubectl exec tp -it bash
root@tp:/# cd /var/run/secrets/kubernetes.io/serviceaccount
bash: cd: /var/run/secrets/kubernetes.io/serviceaccount: No such file or directory
19
Shashank Pai

Une application/déploiement peut s'exécuter avec un compte de service autre que default en le spécifiant dans le champ serviceAccountName d'une configuration de déploiement.

Ce que le compte de service I ou tout autre utilisateur peut faire est déterminé par les rôles qui lui sont attribués (liés à) - voir roleBindings ou clusterRoleBindings; les verbes sont par apiGroups et resources d'un rôle sous les définitions rules.

Le compte de service default ne semble pas avoir de rôle par défaut. Il est possible d'accorder un rôle au compte de service default comme décrit dans # 2 ici .

Selon this , "... Dans la version 1.6+, vous pouvez désactiver les informations d'identification de l'API de montage automatique pour un compte de service en définissant automountServiceAccountToken: false sur le compte de service ".

HTH

3
apisim