客户端对apiserver发起请求,apiserver要识别这个用户是否有请求的权限,要识别用户本身能否通过apiserver执行相应的操作,那么需要哪些信息才能识别用户信息来完成对用户的相关的访问控制呢?
kubectl explain pods.spec.serviceAccountName(服务账号名称),这个就是我们pod连接apiserver时使用的账号,因此整个kubernetes集群中的账号有两类
1. ServiceAccount(服务账号)
2. User account(linux用户账号)
kubectl客户端拿着token进行认证,然后把请求发送给https协议
vi /root/test5/pod_nginx.yaml
内容
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: default
labels:
la: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
kubectl apply -f /root/test5/pod_nginx.yaml
kubectl get pods
kubectl get pods nginx -o yaml | grep "serviceAccountName"
kubectl describe pods nginx
从上面可以看到每个Pod无论定义与否都会有个存储卷,这个存储卷为default-token-*的 token令牌,这就是pod和serviceaccount认证信息。
通过secret进行定义,由于认证信息属于敏感信息,所以需要保存在secret资源当中,并以存储卷的方式挂载到Pod当中。从而让Pod内运行的应用通过对应的secret中的信息来连接apiserver,并完成认证。
每个 namespace 中都有一个默认的叫做 default 的 serviceaccount 资源。进行查看名称空间内的secret,也可以看到对应的default-token。让当前名称空间中所有的pod在连接apiserver时可以使用的预制认证信息,从而保证pod之间的通信。
# 查看 默认名称空间的 sa账号
kubectl get sa
# 查看 kube-system名称空间的 sa账号
kubectl get sa -n kube-system
# 查看 默认名称空间的 secret
kubectl get secret
# 查看 kube-system名称空间的 secret
kubectl get secret -n kube-system
默认的service account 仅仅只能获取当前Pod自身的相关属性,无法观察到其他名称空间Pod的相关属性信息。如果想要扩展Pod,假设有一个Pod需要用于管理其他Pod或者是其他资源对象,是无法通过自身的名称空间的serviceaccount进行获取其他Pod的相关属性信息的,此时就需要进行手动创建一个serviceaccount,并在创建Pod时进行定义。
serviceAccount属于标准的k8s资源,可以创建一个serviceAccount,创建之后由我们创建的pod使用serviceAccountName去加载自己定义的serviceAccount就可以了
kubectl create serviceaccount test
kubectl get sa
可以看到已经创建了test的serviceacount
# 查看test这个账号的详细信息
kubectl describe sa test
上面可以看到生成了一个test-token-ptm4d的secret和test-token-ptm4d的token
kubectl get secret
kubectl describe secret test-token-ptm4d
上面可以看到生成了test-token-ptm4d的token详细信息,这个账号就是sa连接apiserver的账号,这个token是登陆k8s的token,这些是一个认证信息,能够登陆k8s,能认证到k8s,但是不能做别的事情,不代表权限,想要做其他事情,需要授权
在K8S集群当中,每一个用户对资源的访问都是需要通过apiserver进行通信认证才能进行访问的,那么在此机制当中,对资源的访问可以是token,也可以是通过配置文件的方式进行保存和使用认证信息。
通过kubectl config进行查看配置
kubectl config view
内容
apiVersion: v1
# 集群列表
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
# 集群服务的地址,就是apiserver的地址,或者说master1的地址
server: https://192.168.187.154:6443
# 集群的名称,上下文有使用到
name: kubernetes
# k8s上下文
contexts:
- context:
# 上下文的集群
cluster: kubernetes
# 表示用户kubernetes-admin可以访问集群kubernetes
user: kubernetes-admin
# 上下文的的名称
name: kubernetes-admin@kubernetes
# 当前的上下文
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
# 定义用户列表
users:
# 用户名称,上下文有使用到
- name: kubernetes-admin
user:
client-certificate-data: REDACTED
client-key-data: REDACTED