kubernetes角色隐藏master
kubernetes role to hide the master
我正在构建一个 kubernetes 集群,我想知道是否有办法从 "kubectl get nodes" 中隐藏主节点。就像他们对 eks、aks 等所做的那样。目的是为用户提供完全的管理控制权,除了 master nodes/components。
我想 k8s RBAC 有某种方式,但找不到任何相关的东西。
我还尝试按照此处的建议禁止主节点上的 kubelet (),但该节点只是显示为 "Not Ready"
关键确实是 Kubernetes 的 kubelet
组件。
我怀疑托管 Kubernetes 版本根本 运行 kubelet
.
您可以在自己的 DIY 集群上做同样的事情来证明。
kubelet
的主要目标是 运行 Pods。
如果您不需要在主机上 运行 Pods,则无需启动 kubelet
.
控制平面组件可以 运行 作为系统服务或静态容器。
有自托管控制平面组件的 Alpha 功能(即 运行 它们作为 Pods):https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/self-hosting/
所以将来他们可能会在 master 主机上开始 运行ning kubelet
,但现在不需要。
The kubelet is the primary “node agent” that runs on each node. It can register the node with the apiserver using one of: the hostname; a flag to override the hostname; or specific logic for a cloud provider.
https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/
When the kubelet flag --register-node is true (the default), the kubelet will attempt to register itself with the API server. This is the preferred pattern, used by most distros.
https://kubernetes.io/docs/concepts/architecture/nodes/#self-registration-of-nodes
创建集群后,您可以运行下面的命令删除主节点
kubectl delete node master-node-name
执行此操作后,您将无法再在 kubectl get nodes
中看到该主节点,但您仍然应该能够与集群进行交互 normally.Here ETCD 中的节点条目只会被删除。
实现相同目的的另一种方法是配置 Kubelet 不通过 --register-node=false
标志和 manually administer it
注册节点
我相信这就是托管 kubernetes 服务提供商在内部所做的事情。
How would you disable kubelet "at all"? I mean, I install my k8s
master with "kubeadm init", I dont install and run "systemctl kubelet
start", yet, my node is still registering and remain as "Not Ready"
node, so the registering part is still here.
如果您使用 kubeadm 设置了 kubernetes 集群,则需要安装 kubelets 在所有节点上,包括 master,因为它在 kube-system
命名空间中部署了绝大多数关键集群组件,例如 kube-apiserver
、kube-controller-manager
或 kube-scheduler
作为 Pods
(您可以按 kubectl get pods -n kube-system
列出它们)。换句话说:如果你的主节点上没有 运行ning kubelet
,你就不能 运行 有 kubeadm
的集群。没有它,就无法部署形成 kubernetes 集群 的系统 Pods
。另请参阅官方 kubernetes 文档中的 this section。
关于@Ivan提到的Self-hosting the Kubernetes control plane,最好仔细阅读官方文档以了解其真正工作原理:
kubeadm allows you to experimentally create a self-hosted Kubernetes
control plane. This means that key components such as the API server,
controller manager, and scheduler run as DaemonSet pods configured via
the Kubernetes API instead of static pods configured in the kubelet
via static files.
目前 master-node
上 kubelet
不需要的任何地方都没有写。相反,它说如果在 kubeadm
中使用 自托管 Kubernetes 控制平面 (当前实验)方法:
key components such as the API server
, controller manager
, and scheduler
run as DaemonSet
Pods
configured via the Kubernetes
API instead of static Pods
configured in the kubelet via static
files.
再说一遍:在这两种方法中,关键的集群组件都是 运行,因为 Pods
,只有 DaemonSets
是通过 Kubernetes [=63] 配置的=],但这些仍然是 Pods
,是的,通过静态文件配置的静态 Pods
(这是当前的 kubeadm
方法)仍然需要 kubelet可以读取主节点上的那些静态文件并创建适当的 Pods
在其中声明。
我正在构建一个 kubernetes 集群,我想知道是否有办法从 "kubectl get nodes" 中隐藏主节点。就像他们对 eks、aks 等所做的那样。目的是为用户提供完全的管理控制权,除了 master nodes/components。 我想 k8s RBAC 有某种方式,但找不到任何相关的东西。
我还尝试按照此处的建议禁止主节点上的 kubelet (
关键确实是 Kubernetes 的 kubelet
组件。
我怀疑托管 Kubernetes 版本根本 运行 kubelet
.
您可以在自己的 DIY 集群上做同样的事情来证明。
kubelet
的主要目标是 运行 Pods。
如果您不需要在主机上 运行 Pods,则无需启动 kubelet
.
控制平面组件可以 运行 作为系统服务或静态容器。
有自托管控制平面组件的 Alpha 功能(即 运行 它们作为 Pods):https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/self-hosting/
所以将来他们可能会在 master 主机上开始 运行ning kubelet
,但现在不需要。
The kubelet is the primary “node agent” that runs on each node. It can register the node with the apiserver using one of: the hostname; a flag to override the hostname; or specific logic for a cloud provider.
https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/
When the kubelet flag --register-node is true (the default), the kubelet will attempt to register itself with the API server. This is the preferred pattern, used by most distros.
https://kubernetes.io/docs/concepts/architecture/nodes/#self-registration-of-nodes
创建集群后,您可以运行下面的命令删除主节点
kubectl delete node master-node-name
执行此操作后,您将无法再在 kubectl get nodes
中看到该主节点,但您仍然应该能够与集群进行交互 normally.Here ETCD 中的节点条目只会被删除。
实现相同目的的另一种方法是配置 Kubelet 不通过 --register-node=false
标志和 manually administer it
我相信这就是托管 kubernetes 服务提供商在内部所做的事情。
How would you disable kubelet "at all"? I mean, I install my k8s master with "kubeadm init", I dont install and run "systemctl kubelet start", yet, my node is still registering and remain as "Not Ready" node, so the registering part is still here.
如果您使用 kubeadm 设置了 kubernetes 集群,则需要安装 kubelets 在所有节点上,包括 master,因为它在 kube-system
命名空间中部署了绝大多数关键集群组件,例如 kube-apiserver
、kube-controller-manager
或 kube-scheduler
作为 Pods
(您可以按 kubectl get pods -n kube-system
列出它们)。换句话说:如果你的主节点上没有 运行ning kubelet
,你就不能 运行 有 kubeadm
的集群。没有它,就无法部署形成 kubernetes 集群 的系统 Pods
。另请参阅官方 kubernetes 文档中的 this section。
关于@Ivan提到的Self-hosting the Kubernetes control plane,最好仔细阅读官方文档以了解其真正工作原理:
kubeadm allows you to experimentally create a self-hosted Kubernetes control plane. This means that key components such as the API server, controller manager, and scheduler run as DaemonSet pods configured via the Kubernetes API instead of static pods configured in the kubelet via static files.
目前 master-node
上 kubelet
不需要的任何地方都没有写。相反,它说如果在 kubeadm
中使用 自托管 Kubernetes 控制平面 (当前实验)方法:
key components such as the
API server
,controller manager
, andscheduler
run asDaemonSet
Pods
configured via the Kubernetes API instead of staticPods
configured in the kubelet via static files.
再说一遍:在这两种方法中,关键的集群组件都是 运行,因为 Pods
,只有 DaemonSets
是通过 Kubernetes [=63] 配置的=],但这些仍然是 Pods
,是的,通过静态文件配置的静态 Pods
(这是当前的 kubeadm
方法)仍然需要 kubelet可以读取主节点上的那些静态文件并创建适当的 Pods
在其中声明。