「Kubernetes Objects」- ServiceAccount(为应用提供惟一的身份)

  CREATED BY JENKINSBOT

问题描述

如何赋予应用程序唯一的身份,以便从细节上控制资源的访问?

解决方案

创建 ServiceAccount(服务帐号)资源,并在 Pod 的 Spec 中使用该资源。

# kubectl create serviceaccount myappsa
# kubectl describe serviceaccount myappsa
# kubectl describe secret "myappsa-token-rr6jc" # 参数 "myappsa-token-rr6jc" 由上一步输出;

然后,在 Pod 中使用该 ServiceAccount 资源:

kind: Pod
apiVersion: v1
metadata:
  name: myapp
spec:
  serviceAccountName: myappsa
  container:
  - name: main
    image: centos:7
    command:
    - "sleep"
    - "infinity"

验证该 Pod 正常使用 ServiceAccount 资源:

# kubectl exec myapp -c main cat /var/run/secrte/kubernetes.io/serviceaccount/token

如果正确挂载就会有输出。

# 讨论

「可以识别的实体」是认证和授权的前提条件。从APIServer的角度看,由两种类型的实体:终端用户;应用程序。终端用户不再K8S的管理范围内,但是k8s提供了代表应用程序的以及资源:ServiceAccount;

严格来讲,应用程序的认证由token认证,并保存在本地的/var/run/secrets/kubernetes.io/serviceaccount/token文件中,该文件通过secret自动挂载。ServiceAccount属于Namespace的资源,访问形式如下:

	system:serviceaccount:$NAMESPACE:$SERVICEACCOUNT

查看某个命名空间内的ServiceAccount,可以看到类似的信息:

# kubectl get serviceaccounts 
NAME            SECRETS   AGE
default         1         365d

这里由一个名为defalut的服务帐号,提示自动创建的。

如果不明确为 Pod 指定 ServiceAccount ,则系统会自动在该 Pod 的 Namespace 内为其分配为 default 的 ServiceAccount;

10.2. Listing and Viewing Access Control Information

如何查看可用的操作?例如更新部署或列举secret?

假如你采用的是RBAC:

	# kubectl auth can-i list pod --as=system:serviceaccount:sec:myappsa -n=sec

查看Namespace中的Role列表:

	# kubectl get roles -n=kube-system
	# kubectl get clusterroles -n kube-system # 查看命名空间内的ClusterRole列表

上述命令显示预定义的Role列表。

进一步查看允许的操作

	# kubectl describe clusterroles/view -n kube-system

还可以自定义角色,下面会介绍。