有没有办法阻止kubectl取消注册kubernetes节点?

时间:2018-03-16 12:35:33

标签: amazon-web-services security kubernetes google-cloud-platform kubectl

我正在测试一些命令而且我跑了

$ kubectl delete nodes --all

并且删除取消注册包括主人在内的所有节点。现在我无法连接到群集(嗯,很明显,当主人被删除时)。

有没有办法防止这种情况,因为任何人都可能意外地这样做?

额外信息:我正在使用KOps进行部署。

P.S。它不会删除EC2实例,并且节点会在所有实例上重新启动EC2实例。

2 个答案:

答案 0 :(得分:2)

默认情况下,您使用类似超级用户的东西,可以对群集执行任何他想做的事情。

要为其他用户限制对群集的访问,您可以使用RBAC授权。通过RBAC规则,您可以管理每个资源和操作的访问和限制。

简而言之,为此,您需要:

  1. 使用--authorization RBAC由Kops创建新群集,或者通过添加' rbac'来修改现有群集。集群配置选项以授权'部分:

    authorization: rbac: {}

  2. 现在,我们可以按照Bitnami的that指令创建用户。例如,让我们创建一个只能访问office命名空间且只能执行少量操作的用户。所以,我们需要创建一个名称空间第一个:

    kubectl create namespace office

  3. 为新用户创建密钥和证书:

    openssl genrsa -out employee.key 2048
    openssl req -new -key employee.key -out employee.csr -subj "/CN=employee/O=bitnami"

  4. 现在,使用您的CA权限密钥(它在PKI下的S3存储桶中可用),我们需要批准新证书:

    openssl x509 -req -in employee.csr -CA CA_LOCATION/ca.crt -CAkey CA_LOCATION/ca.key -CAcreateserial -out employee.crt -days 500

  5. 创建凭据:

    kubectl config set-credentials employee --client-certificate=/home/employee/.certs/employee.crt --client-key=/home/employee/.certs/employee.key

  6. 设置正确的上下文:

    kubectl config set-context employee-context --cluster=YOUR_CLUSTER_NAME --namespace=office --user=employee

  7. 新的我们让用户无法访问任何内容。让我们创建一个具有有限访问权限的新角色,这里是Role的示例,它只能访问部署,复制集和pod,用于创建,删除和修改它们,仅此而已。使用角色配置创建文件role-deployment-manager.yaml

  8. kind: Role apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: namespace: office name: deployment-manager rules: - apiGroups: ["", "extensions", "apps"] resources: ["deployments", "replicasets", "pods"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

    1. 使用Rolebinding创建一个新文件rolebinding-deployment-manager.yaml,该文件会将您的角色附加到用户:
    2. kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: deployment-manager-binding namespace: office subjects: - kind: User name: employee apiGroup: "" roleRef: kind: Role name: deployment-manager apiGroup: ""

      1. 现在应用该配置:
      2. kubectl create -f role-deployment-manager.yaml kubectl create -f rolebinding-deployment-manager.yaml

        因此,现在您的用户访问受限,并且无法销毁您的群集。

答案 1 :(得分:1)

Anton Kostenko描述了一种防止你所描述的好方法。下面我详细介绍如何确保即使有人意外删除了所有节点对象,仍然可以访问apiserver:

只有当连接到apiserver所需的组件(例如apisever本身和etcd)由依赖于apiserver up的组件(即kubelet)管理时,才会通过删除节点对象而失去与apiserver的连接。例如,GKE可以缩小到0个工作节点,不留任何节点对象,但仍然可以访问apiserver)。

作为一个具体示例,我的个人群集有一个主节点,所有控制平面组件都描述为静态Pod清单,并放置在该主节点上的kubelet上的--pod-manifest-path标志所引用的目录中。像在问题中一样删除所有节点对象导致我的所有工作负载都进入挂起状态,但在这种情况下仍然可以访问apiserver,因为无论kubelet是否可以访问apiserver,控制平面组件都会运行。

阻止你刚刚描述的内容的常用方法是将apiserver和etcd作为我刚刚描述的kubelet管理的静态清单运行,或者独立于任何kubelet运行它们,也许作为系统单元运行。