有没有办法阻止 kubectl 注销 kubernetes 节点?

Is there a way to prevent kubectl from de-registering kubernetes nodes?

我正在测试一些命令,我​​ 运行

$ kubectl delete nodes --all

删除注销所有节点,包括主节点。现在我无法连接到集群(好吧,显然是因为 master 被删除了)。

有没有办法防止这种情况发生,因为任何人都可能不小心这样做?

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

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

默认情况下,您使用的是超级用户,他可以对集群做任何他想做的事。

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

简而言之,要做到这一点,您需要:

  1. 通过 Kops 使用 --authorization RBAC 创建新集群或通过将 'rbac' 选项添加到集群配置的 'authorization' 部分来修改现有集群:

    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. 新,我们有一个用户无法访问任何东西。让我们创建一个具有有限访问权限的新角色,这里是角色示例,它只能访问部署、副本集和 pods 以创建、删除和修改它们,仅此而已。使用角色配置创建文件 role-deployment-manager.yaml

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-deployment-manager.yaml,这会将您的角色附加到用户:

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. 现在应用该配置:

kubectl create -f role-deployment-manager.yaml kubectl create -f rolebinding-deployment-manager.yaml

所以,现在你有一个访问权限有限的用户,他不能破坏你的集群。

Anton Kostenko 描述了一种防止您所描述的情况的好方法。下面我将详细说明如何确保 apiserver 保持可访问性,即使有人不小心删除了所有节点对象:

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

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

防止您刚才描述的事情的常见方法是 运行 apiserver 和 etcd 作为由 kubelet 管理的静态清单,如我刚才描述的,或者 运行 它们独立于任何 kubelet,也许作为系统单位。