Kubernetes(k8s)服务账号Service Accounts
一.系统环境
本文主要基于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。
三.服务账号Service Accounts简介
在Kubernetes中,每个Pod都有一个关联的服务账号。服务账号是用来表示Pod身份的对象,它允许Pod与其他资源进行交互,并且可以通过所分配的角色或角色绑定来限制其权限。服务账号由Kubernetes集群自动创建和管理,用户无需手动创建。
服务账号主要用于以下两个目的:
- 身份验证:服务账号允许Pod与Kubernetes API进行通信时进行身份验证,确保只有经过授权的Pod可以访问指定的资源。
- 授权访问:通过为服务账号分配特定的角色或角色绑定,可以控制该服务账号对不同资源的访问权限,从而实现细粒度的授权管理。
四.用户账号与服务账号区别
用户账号和服务账号在Kubernetes中有一些关键的区别:
- 用户账号通常是由集群管理员创建和管理的,用于标识人类用户。它们通常用于管理集群级别的资源和操作。
- 服务账号通常是由Kubernetes自动创建和管理的,用于标识Pod或其他资源。它们通常用于管理应用程序级别的资源和操作。
- 用户账号具有长期凭据(如用户名和密码、证书等),而服务账号只存在于特定生命周期的Pod中,并由Kubernetes自动为其生成令牌进行身份验证。
- 用户账号通常用于管理整个集群,而服务账号通常用于管理特定的应用程序或容器。
五.服务账号(Service Accounts)
5.1 创建服务账号(Service Accounts)
简而言之,用户账户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
5.2 对服务账号(Service Accounts)授权
服务账号(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
5.3 在pod里使用服务账号(Service Accounts)
编写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可以访问指定的资源。
七.附加信息
- 在Kubernetes中,服务账号仅用于身份验证和授权,不提供与操作系统用户账号的直接映射。
- 服务账号的权限是基于角色和角色绑定进行控制的,需要根据实际需求进行适当配置。
- 通过合理管理服务账号,可以减少潜在的安全风险,并确保应用程序的可靠性和稳定性。