Cont de serviciu Kubernetes pentru pod

  • 2 minute de citit
  • 10 exemple de cod
  • 1 imagine

Disponibil și în English

Pe această pagină

Salut 🙋‍♂️,

În acest articol voi vorbi despre cum poți autentifica aplicațiile tale la API-ul Kubernetes prin intermediul funcției de conturi de serviciu (service accounts).

Citându-le pe Kubernetes docs, un cont de serviciu pentru un pod: „oferă o identitate pentru procesele care rulează într-un Pod.

Când tu (un om) accesezi clusterul (de exemplu, folosind kubectl), ești autentificat de apiserver ca un anumit cont de utilizator (User Account) (în prezent, de obicei este admin, cu excepția cazului în care administratorul clusterului tău l-a personalizat). Procesele din containerele din interiorul pod-urilor pot de asemenea să contacteze apiserver-ul. Când o fac, ele sunt autentificate ca un anumit cont de serviciu (Service Account) (de exemplu, default).” 💡

Crearea unui cont de serviciu

Să pornim Minikube

PS C:\Users\denis> minikube start😄  minikube v1.20.0 on Microsoft Windows 10 Home 10.0.19042 Build 19042✨  Using the docker driver based on existing profile👍  Starting control plane node minikube in cluster minikube🚜  Pulling base image ...🔄  Restarting existing docker container for "minikube" ...🐳  Preparing Kubernetes v1.20.2 on Docker 20.10.6 ...🔎  Verifying Kubernetes components...    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5🌟  Enabled addons: storage-provisioner, default-storageclass🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

După ce Minikube a pornit, putem verifica ce conturi de serviciu avem în prezent tastând:

PS C:\Users\denis> kubectl get serviceaccountsNAME      SECRETS   AGEdefault   1         8d

🤖 Pentru a crea un cont de serviciu nou, creăm un fișier nou sa.yaml și îl aplicăm cu kubectl apply -f .\sa.yaml

apiVersion: v1kind: ServiceAccountmetadata:  name: ubuntu-user

Dacă vrei să adaugi permisiuni contului de serviciu, poți folosi diverse module de autorizare. Îi voi acorda lui ubuntu-user permisiuni pentru toate API-urile folosind următorul ClusterRole și ClusterRoleBinding 🔐

apiVersion: rbac.authorization.k8s.io/v1kind: Rolemetadata:  namespace: default  name: all-apisrules:- apiGroups: ["*"]  resources: ["*"]  verbs: ["*"]---apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata:  name: all-apis-binding  namespace: defaultsubjects:- kind: ServiceAccount  name: ubuntu-user  namespace: defaultroleRef:  kind: Role  name: all-apis  apiGroup: rbac.authorization.k8s.io

Instanța Ubuntu

În scop demonstrativ, voi crea un deployment nou bazat pe o imagine Ubuntu și mă voi conecta prin ssh la el. 🐬

Creează un fișier nou deployment.yaml și lipește următorul conținut, apoi creează deployment-ul cu kubectl apply -f deployment.yaml

apiVersion: apps/v1kind: Deploymentmetadata:  name: ubuntu-dev  labels:    app: ubuntu-demospec:  replicas: 1  selector:    matchLabels:      app: ubuntu-demo  template:    metadata:      labels:        app: ubuntu-demo    spec:      serviceAccountName: ubuntu-user      containers:      - name: ubuntu-demo        image: ubuntu:20.04        command: ["/bin/sleep", "3650d"]

Aceasta va crea o instanță Ubuntu în interiorul Kubernetes. Pentru a obține un shell, rulează următoarele comenzi. Nu uita să înlocuiești numele pod-ului cu al tău.

PS kubectl get podsNAME                         READY   STATUS    RESTARTS   AGEubuntu-dev-68f4b48dd-xlcqp   1/1     Running   0          78sPS kubectl exec --stdin --tty ubuntu-dev-68f4b48dd-xlcqp -- /bin/bashroot@ubuntu-dev-68f4b48dd-xlcqp:/#

🔧Pentru a instala kubectl trebuie să rulăm următoarele comenzi:

apt-get update && apt-get -y install curl gnupg2touch /etc/apt/sources.list.d/kubernetes.list && echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | tee -a /etc/apt/sources.list.d/kubernetes.listcurl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -apt-get update && apt-get install -y kubectl

După ce comenzile au terminat de rulat, putem executa orice comandă kubectl din interiorul pod-ului nostru și nu a trebuit să ne facem griji cu privire la fișierele de configurare sau la autentificarea pod-ului. De exemplu:

root@ubuntu-dev-68f4b48dd-fkhht:/# kubectl get servicesNAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGEkubernetes   ClusterIP   10.245.0.1   <none>        443/TCP   2d8h

Acest lucru funcționează deoarece Kubernetes injectează câteva variabile de mediu în pod și montează automat niște secrete:

root@ubuntu-dev-68f4b48dd-fkhht:/# env | grep KUBEKUBERNETES_SERVICE_PORT_HTTPS=443KUBERNETES_SERVICE_PORT=443KUBERNETES_PORT_443_TCP=tcp://10.245.0.1:443KUBERNETES_PORT_443_TCP_PROTO=tcpKUBERNETES_PORT_443_TCP_ADDR=10.245.0.1KUBERNETES_SERVICE_HOST=10.245.0.1KUBERNETES_PORT=tcp://10.245.0.1:443KUBERNETES_PORT_443_TCP_PORT=443root@ubuntu-dev-68f4b48dd-fkhht:/# ls /var/run/secrets/kubernetes.io/serviceaccount/ca.crt  namespace  token

Acest mecanism permite ca kubectl și diverse biblioteci client să preia configurarea automat. ✨

🧼Pentru a reseta lucrul nostru, putem rula:

kubectl delete -f .\deployment.yamlkubectl delete -f .\permissions.yamlkubectl delete -f .\sa.yaml

Mulțumesc că ai citit! 📖

Referințe