Kubernetes(k8s)服务账号Service Accounts
阅读原文时间:2023年08月23日阅读:1

目录

一.系统环境

本文主要基于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集群自动创建和管理,用户无需手动创建。

服务账号主要用于以下两个目的:

  1. 身份验证:服务账号允许Pod与Kubernetes API进行通信时进行身份验证,确保只有经过授权的Pod可以访问指定的资源。
  2. 授权访问:通过为服务账号分配特定的角色或角色绑定,可以控制该服务账号对不同资源的访问权限,从而实现细粒度的授权管理。

四.用户账号与服务账号区别

用户账号和服务账号在Kubernetes中有一些关键的区别:

  • 用户账号通常是由集群管理员创建和管理的,用于标识人类用户。它们通常用于管理集群级别的资源和操作。
  • 服务账号通常是由Kubernetes自动创建和管理的,用于标识Pod或其他资源。它们通常用于管理应用程序级别的资源和操作。
  • 用户账号具有长期凭据(如用户名和密码、证书等),而服务账号只存在于特定生命周期的Pod中,并由Kubernetes自动为其生成令牌进行身份验证。
  • 用户账号通常用于管理整个集群,而服务账号通常用于管理特定的应用程序或容器。

五.服务账号(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

服务账号(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可以访问指定的资源。

七.附加信息

  • 在Kubernetes中,服务账号仅用于身份验证和授权,不提供与操作系统用户账号的直接映射。
  • 服务账号的权限是基于角色和角色绑定进行控制的,需要根据实际需求进行适当配置。
  • 通过合理管理服务账号,可以减少潜在的安全风险,并确保应用程序的可靠性和稳定性。