首页 > 解决方案 > 为什么在 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 的权限,所以这应该失败了。我在这里混合了这些概念吗?

标签: kubernetes

解决方案


ServiceAccounts是 pod 的权限,您正在做的是将此权限分配给您在部署中实例化的 pod,因此kubectl apply -f simon-sa-deployment-non-root.yaml -n test-ns将使用您的用户使用kubectlapi 服务器登录的权限,因此如果您执行此操作kubectl auth can-i create deployments --namespace test-ns,它将返回 Yes。

因此,也许您正在尝试做的是创建一个对集群具有只读访问权限的用户,该用户由集群角色完成,而不是仅限于 Pod 的服务帐户。

或者让我知道你想做什么,我可以解释


推荐阅读