【发布时间】:2020-09-02 19:40:17
【问题描述】:
我有以下部署规范:
apiVersion: apps/v1
kind: Deployment
metadata:
name: sa-dep-non-root
spec:
selector:
matchLabels:
app: sa-dep-non-root # has to match .spec.template.metadata.labels
#replicas: 3 # by default is 1
template:
metadata:
labels:
app: sa-dep-non-root # has to match .spec.selector.matchLabels
spec:
serviceAccountName: simon-sa
securityContext:
runAsUser: 1000
tolerations:
- key: "type"
operator: "Equal"
value: "ops"
effect: "NoSchedule"
containers:
- name: sa-dep-non-root
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: sa-dep-non-root
部署及其对应的 Pod 在运行时被正确创建:
kubectl apply -f simon-sa-deployment-non-root.yaml -n test-ns
我没想到这会起作用,因为我将 serviceAccountName 设置为 simon-sa,它没有创建 Pod 的权限:
Simons-MBP:test simon$ kubectl --as=system:serviceaccount:test-ns:simon-sa auth can-i create pods -n test-ns
no
我的理解是,当没有指定 serviceAccountName 时,创建 Pod 的是 k8s 控制器管理器(通过一些具有正确权限的集群角色绑定,如 system:controller:replicaset-controller),它实际上不是我的自己的用户,我在其中验证了为该部署创建 pod 的用户。
我的另一个理解是,在 pod 定义中指定 serviceAccountName 时可以覆盖此行为。在这种情况下,pod 不是由控制器管理器创建的,而是为指定的 serviceAccountName 创建的。由于我指定的 serviceAccountName 没有创建 Pod 的权限,所以这应该失败了。我这里的概念混在一起了吗?
【问题讨论】:
标签: kubernetes