如果没有另外指定,则该Pod使用命名空间中的默认服务帐户运行,我如何检查默认服务帐户被授权执行的操作,是否需要将每个Pod都安装在该服务中?我们如何在命名空间级别或集群级别禁用此行为。
虽然仍在搜索文档。
环境:Kubernetes 1.12,带有RBAC
默认服务帐户应处理哪些其他用例?我们可以/应该将其用作服务帐户来创建和管理k8s部署吗? ,例如,我们不会使用真实的用户帐户在集群中创建事物,因为用户在team / org中进出。
答案 0 :(得分:12)
kubectl得到sa
姓名秘密年龄
默认1 1d
serviceccounts。每个Pod都与 一个serviceAccount,但是多个Pod可以使用相同的serviceaccount。
吊舱只能使用来自相同名称空间的服务帐户。
您可以通过在窗格中指定帐户名称来将服务帐户分配给窗格 表现。如果您未明确分配,则广告连播会使用默认的服务帐户 在命名空间中
ServiceAccount的默认权限不允许它 列出或修改任何资源。默认服务- 不允许帐户查看群集状态,更不用说以任何方式对其进行修改
默认情况下,名称空间中的默认serviceAccount除具有权限外没有其他权限 那些未经身份验证的用户。
因此默认情况下,广告连播无法 甚至查看群集状态。您可以自行授予他们适当的权限。
kubectl exec -it测试-n foo sh /#curl 本地主机:8001 / api / v1 /名称空间/ foo / services {“ kind”:“状态”,
“ apiVersion”:“ v1”,“元数据”:{},“状态”:“失败”,“消息”:“禁止服务:用户 \“ system:serviceaccount:foo:default \”无法列出资源 API组\“ \”在命名空间\“ foo \”“,”原因“中的\” services \“: “禁止”,“详细信息”:{ “ kind”:“ services”},“ code”:403
如上图所示,默认服务帐户无法列出服务
但是当被赋予如下所示的适当角色和角色绑定时
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
creationTimestamp: null
name: foo-role
namespace: foo
rules:
- apiGroups:
- ""
resources:
- services
verbs:
- get
- list
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
creationTimestamp: null
name: test-foo
namespace: foo
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: foo-role
subjects:
- kind: ServiceAccount
name: default
namespace: foo
现在我可以列出中转服务了
kubectl exec -it test -n foo sh
/ # curl localhost:8001/api/v1/namespaces/foo/services
{
"kind": "ServiceList",
"apiVersion": "v1",
"metadata": {
"selfLink": "/api/v1/namespaces/bar/services",
"resourceVersion": "457324"
},
"items": []
提供所有服务帐户clusteradmin clusterrole是一个 坏主意最好只给所有人权限 他们需要做自己的工作,而不是一个单独的权限
为每个吊舱创建一个特定的服务帐户是一个好主意 然后将其与定制角色或集群角色相关联, 角色绑定
如果您的一个Pod只需要读取Pod 而另一个也需要修改它们,然后创建两个不同的服务帐户 并通过在其中指定serviceaccountName属性来使这些Pod使用它们 广告连播规范
您可以参考以下链接进行详细说明
Service account example with roles
您可以检查
kubectl解释serviceaccount.automountServiceAccountToken并编辑服务帐户
kubectl edit serviceaccount default -o yaml
apiVersion: v1
automountServiceAccountToken: false
kind: ServiceAccount
metadata:
creationTimestamp: 2018-10-14T08:26:37Z
name: default
namespace: default
resourceVersion: "459688"
selfLink: /api/v1/namespaces/default/serviceaccounts/default
uid: de71e624-cf8a-11e8-abce-0642c77524e8
secrets:
- name: default-token-q66j4
一旦完成此更改,无论您生成的哪个pod没有服务帐户令牌,如下所示。
kubectl exec tp -it bash
root@tp:/# cd /var/run/secrets/kubernetes.io/serviceaccount
bash: cd: /var/run/secrets/kubernetes.io/serviceaccount: No such file or directory
答案 1 :(得分:2)
通过在部署配置的default
字段中指定应用程序/部署,可以使用serviceAccountName
以外的服务帐户来运行该应用程序/部署。
我的服务帐户或任何其他用户可以做什么,取决于它所赋予(绑定)的角色-请参阅roleBindings或clusterRoleBindings;动词是根据apiGroups
定义下的角色的resources
和rules
。
默认情况下,default
服务帐户似乎没有任何角色。如#2 here中所述,可以向default
服务帐户授予角色。
根据this,“ ...在1.6及更高版本中,您可以通过在服务帐户上设置automountServiceAccountToken: false
来选择退出自动安装服务帐户的API凭据”。
HTH