kubernetes - 为什么在 kubernetes 中不允许服务帐户可以创建 Pod?
问题描述
我有以下部署规范:
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 的人。
serviceAccountName
我的另一个理解是,在 pod 定义中指定时可以覆盖此行为。在这种情况下,pod 不是由控制器管理器创建的,而是为指定的 serviceAccountName 创建的。由于我指定的 serviceAccountName 没有创建 Pod 的权限,所以这应该失败了。我在这里混合了这些概念吗?
解决方案
ServiceAccounts
是 pod 的权限,您正在做的是将此权限分配给您在部署中实例化的 pod,因此kubectl apply -f simon-sa-deployment-non-root.yaml -n test-ns
将使用您的用户使用kubectl
api 服务器登录的权限,因此如果您执行此操作kubectl auth can-i create deployments --namespace test-ns
,它将返回 Yes。
因此,也许您正在尝试做的是创建一个对集群具有只读访问权限的用户,该用户由集群角色完成,而不是仅限于 Pod 的服务帐户。
或者让我知道你想做什么,我可以解释
推荐阅读
- python - 如何在不使用 turtle.mainloop() 的情况下停止海龟冻结?
- css - 重用 css 元素
- windows - Windows 将 x.509 主题字段中的状态显示为 S=
- lighthouse - 默认情况下,灯塔为移动设备提供性能分数,如何获得桌面设备的性能分数?以编程方式使用节点模块
- ios - 如果应用程序在后台运行 iOS13,Firebase 动态链接将不起作用
- node.js - 纱线自动凹凸版
- find - find + xargs + ctags 不知何故缺少整个子目录的标签
- python - 将数据框值导入字典
- flutter - 颤振多个电子邮件TextField
- php - 为什么在创建活动时谷歌日历活动邀请邮件不发送给那里的客人?