- 会自动为每个命名空间创建一个默认服务帐户。
kubectl 获取服务帐号
姓名秘密年龄
默认 1 1d
-
可以在需要时添加服务帐号。每个 pod 只与一个服务帐号相关联,但多个 pod 可以使用同一个服务帐号。
-
一个 pod 只能使用同一命名空间中的一个服务帐户。
-
通过在 pod 清单中指定帐户的名称,将服务帐户分配给 pod。如果您没有明确分配它,则 pod 将使用默认服务帐户。
-
服务帐户的默认权限不允许它
列出或修改任何资源。默认服务帐户不允许查看集群状态,更不用说以任何方式对其进行修改。
-
默认情况下,命名空间中的默认服务帐户除了未经身份验证的用户之外没有其他权限。
-
因此,默认情况下,pod 甚至无法查看集群状态。您可以授予他们适当的权限来执行此操作。
kubectl exec -it test -n foo sh / # curl
localhost:8001/api/v1/namespaces/foo/services { "kind": "Status",
“apiVersion”:“v1”,“元数据”:{
},“状态”:“失败”,“消息”:“服务被禁止:用户
“system:serviceaccount:foo:default”无法列出资源
命名空间“foo”中的 API 组“”中的“服务”,“原因”:
“禁止”,“详情”:{
“种类”:“服务”},“代码”: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 只需要读取 pod,而另一个也需要修改它们,则创建两个不同的服务帐户,并通过在
吊舱规格。
您可以参考下面的链接以获得深入的解释。
Service account example with roles
您可以查看kubectl explain 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 都没有 serviceaccount 令牌,如下所示。
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