本文主要基于Kubernetes1.21.9和Linux操作系统CentOS7.4。
服务器版本 | docker软件版本 | Kubernetes(k8s)集群版本 | CPU架构 |
---|---|---|---|
CentOS Linux release 7.4.1708 (Core) | Docker version 20.10.12 | v1.21.9 | x86_64 |
Kubernetes集群架构:k8scloude1作为master节点,k8scloude2,k8scloude3作为worker节点。
服务器 | 操作系统版本 | CPU架构 | 进程 | 功能描述 |
---|---|---|---|---|
k8scloude1/192.168.110.130 | CentOS Linux release 7.4.1708 (Core) | x86_64 | docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calico | k8s master节点 |
k8scloude2/192.168.110.129 | CentOS Linux release 7.4.1708 (Core) | x86_64 | docker,kubelet,kube-proxy,calico | k8s worker节点 |
k8scloude3/192.168.110.128 | CentOS Linux release 7.4.1708 (Core) | x86_64 | docker,kubelet,kube-proxy,calico | k8s worker节点 |
Kubernetes是一个开源的容器编排和管理平台,它允许用户在分布式环境中部署、运行和管理容器化应用程序。在Kubernetes中,服务账号(Service Accounts)是用来对应用程序提供身份验证和授权的一种机制。
使用服务账号(Service Accounts)的前提是已经有一套可以正常运行的Kubernetes集群,关于Kubernetes(k8s)集群的安装部署,可以查看博客《Centos7 安装部署Kubernetes(k8s)集群》https://www.cnblogs.com/renshengdezheli/p/16686769.html。
在Kubernetes中,每个Pod都有一个关联的服务账号。服务账号是用来表示Pod身份的对象,它允许Pod与其他资源进行交互,并且可以通过所分配的角色或角色绑定来限制其权限。服务账号由Kubernetes集群自动创建和管理,用户无需手动创建。
服务账号主要用于以下两个目的:
用户账号和服务账号在Kubernetes中有一些关键的区别:
简而言之,用户账户user account 用于远程登录我们kubernetes系统,服务账户service account(简称sa)让特定的应用程序或容器具有操作k8s某个资源的权限。
查看sa账号,可以看到有一个default账号。
[root@k8scloude1 safe]# kubectl get sa NAME SECRETS AGE default 1 2d4h
查看default的描述信息。
[root@k8scloude1 safe]# kubectl describe sa default Name: default Namespace: safe Labels: <none> Annotations: <none> Image pull secrets: <none> Mountable secrets: default-token-cqst6 Tokens: default-token-cqst6 Events: <none>
每个sa账号对应一个secret,关于secrets的详细内容,请查看博客《Kubernetes(k8s)密码管理:Secret》。
[root@k8scloude1 safe]# kubectl get secrets NAME TYPE DATA AGE default-token-cqst6 kubernetes.io/service-account-token 3 2d4h
创建一个sa,对应的也会创建一个secret。
[root@k8scloude1 safe]# kubectl create sa sa1 serviceaccount/sa1 created [root@k8scloude1 safe]# kubectl get secrets NAME TYPE DATA AGE default-token-cqst6 kubernetes.io/service-account-token 3 2d4h sa1-token-njfhz kubernetes.io/service-account-token 3 3s
每个secret对应一个token。
[root@k8scloude1 safe]# kubectl describe secrets sa1-token-njfhz Name: sa1-token-njfhz Namespace: safe Labels: <none> Annotations: kubernetes.io/service-account.name: sa1 kubernetes.io/service-account.uid: b7764cf7-6048-454c-972c-f4918af1ebdb Type: kubernetes.io/service-account-token Data ==== ca.crt: 1066 bytes namespace: 4 bytes token: eyJhbGciOiJSUzI1NiIsImtpZCI6InJJaUNYYXpKanA2Qkg4SW4yemE1MVM4MTJxeXpVbV9sQkk5RF9CaVpLZlEifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJzYWZlIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InNhMS10b2tlbi1uamZoeiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJzYTEiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJiNzc2NGNmNy02MDQ4LTQ1NGMtOTcyYy1mNDkxOGFmMWViZGIiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6c2FmZTpzYTEifQ.szX11teINKjADoVGcOI6bYXtlmk8bzIJkYN-3uNqtPUrumm2UaqBpZxFDNH9z4sCVM2KDS2fCBnDI6iU6Ok37P7r7o9twRDbM7nXIEFCGgEnM8iLDQ0G71q3xfeo7IrfEN2idQx-LbgoggLsh9IQZz6IdxGkDGv-DoVihvBsOhpkijJ08GxsNVeizUhCuM87dMaksxx1Lw7vRkzYEZka_Qi0bqrZgTE4a3DgRclbPfIgo06bMZZ2YmfDlp5n5MRveWm6Cwobl-g4uvmJCyd6wRD0vB_MwO3ug-BvJNCgEDhdd1eSTCijZNgS0BWQy1cCpBxhgpKzbgicqyKc2fMzHg
服务账号(Service Accounts)的授权语法:kubectl create clusterrolebinding clusterrolebinding名 --clusterrole=cluster-admin --serviceaccount=命名空间:sa名。
把集群角色cluster-admin绑定到服务账户sa1上,sa1属于safe命名空间,cluster-admin是集群管理员权限。对sa1授权之后,sa1对应的secret的token就具备了相应权限。关于授权的详细内容,请查看博客《Kubernetes(k8s)访问控制:权限管理之RBAC鉴权》。
[root@k8scloude1 safe]# kubectl create clusterrolebinding clusterrolebinding2 --clusterrole=cluster-admin --serviceaccount=safe:sa1 clusterrolebinding.rbac.authorization.k8s.io/clusterrolebinding2 created
编写yaml文件,功能为:创建了一个名为"podtest"的Pod,使用Nginx镜像创建pod,并指定pod使用sa1账号运行。
[root@k8scloude1 safe]# vim pod.yaml [root@k8scloude1 safe]# cat pod.yaml apiVersion: v1 kind: Pod metadata: labels: test: podtest name: podtest spec: #当需要关闭容器时,立即杀死容器而不等待默认的30秒优雅停机时长。 terminationGracePeriodSeconds: 0 containers: - name: nginx image: nginx #imagePullPolicy: IfNotPresent:表示如果本地已经存在该镜像,则不重新下载;否则从远程 Docker Hub 下载该镜像 imagePullPolicy: IfNotPresent #serviceAccount: sa1表示使用sa1账号运行 serviceAccount: sa1
创建pod。
[root@k8scloude1 safe]# kubectl apply -f pod.yaml pod/podtest created [root@k8scloude1 safe]# kubectl get pod NAME READY STATUS RESTARTS AGE podtest 1/1 Running 0 11s
在线编辑pod,里面显示了serviceAccount: sa1 serviceAccountName: sa1 表明podtest以sa1的身份运行。
[root@k8scloude1 safe]# kubectl edit pod podtest Edit cancelled, no changes made.
进入podtest,查看挂载的serviceaccount。
[root@k8scloude1 safe]# kubectl exec -it podtest -- bash #查看容器挂载,可以发现挂载了一个serviceaccount root@podtest:/# df -hT Filesystem Type Size Used Avail Use% Mounted on overlay overlay 150G 12G 139G 8% / tmpfs tmpfs 64M 0 64M 0% /dev tmpfs tmpfs 1.5G 0 1.5G 0% /sys/fs/cgroup /dev/sda1 xfs 150G 12G 139G 8% /etc/hosts shm tmpfs 64M 0 64M 0% /dev/shm tmpfs tmpfs 1.5G 12K 1.5G 1% /run/secrets/kubernetes.io/serviceaccount tmpfs tmpfs 1.5G 0 1.5G 0% /proc/acpi tmpfs tmpfs 1.5G 0 1.5G 0% /proc/scsi tmpfs tmpfs 1.5G 0 1.5G 0% /sys/firmware #进入挂载目录 root@podtest:/# cd /run/secrets/kubernetes.io/serviceaccount root@podtest:/run/secrets/kubernetes.io/serviceaccount# ls ca.crt namespace token #这个token就是sa1对应的token,使用sa1对应的token就可以访问相应程序 root@podtest:/run/secrets/kubernetes.io/serviceaccount# cat token eyJhbGciOiJSUzI1NiIsImtpZCI6InJJaUNYYXpKanA2Qkg4SW4yemE1MVM4MTJxeXpVbV9sQkk5RF9CaVpLZlEifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNjc5MzE0MTIyLCJpYXQiOjE2NDc3NzgxMjIsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJzYWZlIiwicG9kIjp7Im5hbWUiOiJwb2R0ZXN0IiwidWlkIjoiMTA3MGMzODYtMzViNS00YTc4LWJlZTctYzJlZDZhNzM5ZTM2In0sInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJzYTEiLCJ1aWQiOiJiNzc2NGNmNy02MDQ4LTQ1NGMtOTcyYy1mNDkxOGFmMWViZGIifSwid2FybmFmdGVyIjoxNjQ3NzgxNzI5fSwibmJmIjoxNjQ3Nzc4MTIyLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6c2FmZTpzYTEifQ.Beoio2xxjVFFrALUeWkkZrD_Jt-RuI-WksB7TVyia1-8kM6gOnzmR81iZyZ1HP1o6600GeZCJO45dtz6Kg02tzpIXzBREohH_MKwNMZsMOGuH3DUTpwGSq9ZWUiOadVJr6_YmSoK9uT9x7H4xD55o-X1YVHsxZ5pbV05TKwa7OTWrlFIXr1fTjjJ73eLDbVX9BbLkD5MQ8LJ7XwwF-5SXLgCrIwYmRRwVj1kKsxM-45OSJehUoy73dKf-qQxZi7YjdiOgnjfyIgLs1qW1d21O2PCZyFPAK6NUG4NcN5BSb-bbkD7xo54cENGmGhefE9ALk5aIdggjhsjiGwZ-0zZyQroot@podtest:/run/secrets/kubernetes.io/serviceaccount# root@podtest:/run/secrets/kubernetes.io/serviceaccount# exit exit
删除pod。
[root@k8scloude1 safe]# kubectl delete pod podtest pod "podtest" deleted [root@k8scloude1 safe]# kubectl get pod No resources found in safe namespace.
本篇博客介绍了Kubernetes中的服务账号(Service Accounts)及其与用户账号的区别。服务账号是用于标识Pod的身份,它们允许Pod与其他资源进行交互,并通过所分配的角色或角色绑定来限制其权限。
我们学习了如何创建和查看服务账号(Service Accounts),并了解了如何将角色或角色绑定与服务账号关联起来以控制访问权限。此外,我们还了解了在Pod中如何使用服务账号。
通过合理地使用服务账号,可以实现Kubernetes集群中资源的安全和权限管理,确保只有授权的Pod可以访问指定的资源。