《蹲坑学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

2、查看SA(1)查看发现:自动创建一个sa
[root@k8s-master ~]# kubectl get sa -n dodo

(2)查看SA的详细信息
3、查看secret(1)查看secret发现:自动创建一个secret
[root@k8s-master ~]# kubectl get secrets -n dodo

(2)查看secret详细信息
[root@k8s-master ~]# kubectl describe secrets default-token-l9dd2 -n dodo

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

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

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

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



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


说明:挂载的是sa的secret:default-token-l9dd2。新建的pod如果不指定sa,自动挂载默名称空间的sa(default)。
[root@k8s-master ~]# kubectl exec -it test-pod -n dodo -- sh

二、创建serviceaccount
1、创建serviceaccount
[root@k8s-master ~]# kubectl create serviceaccount dodo

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

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

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

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

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

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

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



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

