目录
本文主要基于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可以访问指定的资源。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章