问题描述
如何赋予应用程序唯一的身份,以便从细节上控制资源的访问?
解决方案
创建 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
还可以自定义角色,下面会介绍。