《蹲坑学kubernetes》之17-14:ServerAccount

《蹲坑学kubernetes》之17-14:ServerAccount

API Server作为Kubernetes网关,是访问和管理资源对象的唯一入口,其各种集群组件访问资源都需要经过网关才能进行正常访问和管理。每一次的访问请求都需要进行合法性的检验,其中包括身份验证、操作权限验证以及操作规范验证等,需要通过一系列验证通过之后才能访问或者存储数据到etcd当中。

当我们对API资源进行操作都需要通经过以下三个步骤:

第一步:对客户端访问进行认证操作,确认是否具有访问k8s权限

token(共享秘钥)

SSL(双向SSL认证)

....  通过任何一个认证即表示认证通过,进入下一步

第二步:授权检查,确认是否对资源具有相关的权限

ABAC(基于属性的访问控制)

RBAC(基于角色的访问控制)

NODE(基于节点的访问控制)

WEB HOOK(自定义HTTP回调方法的访问控制)

第三步:准入控制(对操作资源相关联的其他资源是否有权限操作)

什么是Service account?

Service Account用来访问kubernetes API,通过kubernetes API创建和管理,每个Service Account只能在一个Namespace上生效,存储在kubernetes API中的Secrets资源中。它与User account不同,主要有以下特点:

1、User account是为人设计的,而service account则是为Pod中的进程调用Kubernetes API而设计;

2、User account是跨namespace的,而service account则是仅局限它所在的namespace;

3、每个namespace都会自动创建一个default service account;

4、Token controller检测service account的创建,并为它们创建secret;

5、开启ServiceAccount Admission Controller后:

(1)每个Pod在创建后都会自动设置spec.serviceAccount为default(除非指定了其他ServiceAccout)

(2)验证Pod引用的service account已经存在,否则拒绝创建

(3)如果Pod没有指定ImagePullSecrets,则把service account的ImagePullSecrets加到Pod中

(4)每个container启动后都会挂载该service account的token和ca.crt到/var/run/secrets/kubernetes.io/serviceaccount/

一、默认的ServiceAccount

当创建namespace都会自动创建一个default service account

1、创建一个名称空间

[root@k8s-master ~]# kubectl create namespace dodo

《蹲坑学kubernetes》之17-14:ServerAccount

2、查看SA(1)查看发现:自动创建一个sa

[root@k8s-master ~]# kubectl get sa -n dodo

《蹲坑学kubernetes》之17-14:ServerAccount

(2)查看SA的详细信息

3、查看secret(1)查看secret发现:自动创建一个secret

[root@k8s-master ~]# kubectl get secrets -n dodo

《蹲坑学kubernetes》之17-14:ServerAccount

(2)查看secret详细信息

[root@k8s-master ~]# kubectl describe secrets default-token-l9dd2 -n dodo

《蹲坑学kubernetes》之17-14:ServerAccount

4、创建Pod应用namespace。

[root@k8s-master ~]# vim test-pod.yaml
添加:
apiVersion: v1
kind: Pod
metadata:
 name: test-pod
 namespace: dodo
spec:
 containers:
 - name: nginx
 image: nginx:1.16
 ports:
 - name: http
 containerPort: 80

《蹲坑学kubernetes》之17-14:ServerAccount

[root@k8s-master ~]# kubectl apply -f test-pod.yaml

《蹲坑学kubernetes》之17-14:ServerAccount

[root@k8s-master ~]# kubectl get pod -n dodo

《蹲坑学kubernetes》之17-14:ServerAccount

[root@k8s-master ~]# kubectl describe pod test-pod -n dodo

《蹲坑学kubernetes》之17-14:ServerAccount

《蹲坑学kubernetes》之17-14:ServerAccount

《蹲坑学kubernetes》之17-14:ServerAccount

[root@k8s-master ~]# kubectl get pod test-pod -n dodo -o yaml

《蹲坑学kubernetes》之17-14:ServerAccount

《蹲坑学kubernetes》之17-14:ServerAccount

说明:挂载的是sa的secret:default-token-l9dd2。新建的pod如果不指定sa,自动挂载默名称空间的sa(default)。

[root@k8s-master ~]# kubectl exec -it test-pod -n dodo -- sh

《蹲坑学kubernetes》之17-14:ServerAccount

二、创建serviceaccount

1、创建serviceaccount

[root@k8s-master ~]# kubectl create serviceaccount dodo

《蹲坑学kubernetes》之17-14:ServerAccount

[root@k8s-master ~]# kubectl get serviceaccounts

《蹲坑学kubernetes》之17-14:ServerAccount

[root@k8s-master ~]# kubectl describe serviceaccounts dodo

《蹲坑学kubernetes》之17-14:ServerAccount

[root@k8s-master ~]# kubectl get secret

《蹲坑学kubernetes》之17-14:ServerAccount

[root@k8s-master ~]# kubectl describe secret dodo-token-hddhv

《蹲坑学kubernetes》之17-14:ServerAccount

2、应用serviceaccount

[root@k8s-master ~]# vim test-pod.yaml
添加:
apiVersion: v1
kind: Pod
metadata:
 name: test-pod
spec:
 containers:
 - name: nginx
 image: nginx:1.16
 ports:
 - name: http
 containerPort: 80
 serviceAccountName: dodo ##应用serviceaccount

《蹲坑学kubernetes》之17-14:ServerAccount

[root@k8s-master ~]# kubectl apply -f test-pod.yaml

《蹲坑学kubernetes》之17-14:ServerAccount

[root@k8s-master ~]# kubectl describe pod test-pod

《蹲坑学kubernetes》之17-14:ServerAccount

《蹲坑学kubernetes》之17-14:ServerAccount

《蹲坑学kubernetes》之17-14:ServerAccount

[root@k8s-master ~]# kubectl exec -it test-pod -- sh

《蹲坑学kubernetes》之17-14:ServerAccount

《蹲坑学kubernetes》之17-14:ServerAccount