我正在测试一些命令而且我跑了
$ kubectl delete nodes --all
并且删除取消注册包括主人在内的所有节点。现在我无法连接到群集(嗯,很明显,当主人被删除时)。
有没有办法防止这种情况,因为任何人都可能意外地这样做?
额外信息:我正在使用KOps进行部署。
P.S。它不会删除EC2实例,并且节点会在所有实例上重新启动EC2实例。
答案 0 :(得分:2)
默认情况下,您使用类似超级用户的东西,可以对群集执行任何他想做的事情。
要为其他用户限制对群集的访问,您可以使用RBAC授权。通过RBAC规则,您可以管理每个资源和操作的访问和限制。
简而言之,为此,您需要:
使用--authorization RBAC
由Kops创建新群集,或者通过添加' rbac'来修改现有群集。集群配置选项以授权'部分:
authorization:
rbac: {}
现在,我们可以按照Bitnami的that指令创建用户。例如,让我们创建一个只能访问office
命名空间且只能执行少量操作的用户。所以,我们需要创建一个名称空间第一个:
kubectl create namespace office
为新用户创建密钥和证书:
openssl genrsa -out employee.key 2048
openssl req -new -key employee.key -out employee.csr -subj "/CN=employee/O=bitnami"
现在,使用您的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
创建凭据:
kubectl config set-credentials employee --client-certificate=/home/employee/.certs/employee.crt --client-key=/home/employee/.certs/employee.key
设置正确的上下文:
kubectl config set-context employee-context --cluster=YOUR_CLUSTER_NAME --namespace=office --user=employee
新的我们让用户无法访问任何内容。让我们创建一个具有有限访问权限的新角色,这里是Role的示例,它只能访问部署,复制集和pod,用于创建,删除和修改它们,仅此而已。使用角色配置创建文件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"]
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: ""
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运行它们,也许作为系统单元运行。