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 defaultDupă 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-userDacă 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.ioInstanț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 kubectlDupă 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 2d8hAcest 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 tokenAcest 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.yamlMulțumesc că ai citit! 📖