如何将Kubernetes非HA控制平面转换为HA控制平面?
将kubernetes非HA控制平面转换为HA控制平面的最佳方法是什么 我已经开始将集群作为一个非HA控制平面—一个主节点和几个工作节点。集群已经运行了很多服务 现在,我想添加额外的主节点,以将集群转换为HA控制平面。我已经设置并配置了负载平衡器。 但我没有弄清楚如何将-control平面端点更改为现有主节点的负载平衡器IP地址 调用kubeadm会导致以下错误:如何将Kubernetes非HA控制平面转换为HA控制平面?,kubernetes,kubeadm,Kubernetes,Kubeadm,将kubernetes非HA控制平面转换为HA控制平面的最佳方法是什么 我已经开始将集群作为一个非HA控制平面—一个主节点和几个工作节点。集群已经运行了很多服务 现在,我想添加额外的主节点,以将集群转换为HA控制平面。我已经设置并配置了负载平衡器。 但我没有弄清楚如何将-control平面端点更改为现有主节点的负载平衡器IP地址 调用kubeadm会导致以下错误: sudo kubeadm init --control-plane-endpoint "my-load-balancer:
sudo kubeadm init --control-plane-endpoint "my-load-balancer:6443" --upload-certs
[init] Using Kubernetes version: v1.20.1
[preflight] Running pre-flight checks
[WARNING SystemVerification]: missing optional cgroups: hugetlb
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR Port-6443]: Port 6443 is in use
[ERROR Port-10259]: Port 10259 is in use
[ERROR Port-10257]: Port 10257 is in use
[ERROR FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml]: /etc/kubernetes/manifests/kube-apiserver.yaml already exists
[ERROR FileAvailable--etc-kubernetes-manifests-kube-controller-manager.yaml]: /etc/kubernetes/manifests/kube-controller-manager.yaml already exists
[ERROR FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml]: /etc/kubernetes/manifests/kube-scheduler.yaml already exists
[ERROR FileAvailable--etc-kubernetes-manifests-etcd.yaml]: /etc/kubernetes/manifests/etcd.yaml already exists
[ERROR Port-10250]: Port 10250 is in use
[ERROR Port-2379]: Port 2379 is in use
[ERROR Port-2380]: Port 2380 is in use
[ERROR DirAvailable--var-lib-etcd]: /var/lib/etcd is not empty
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher
错误消息似乎很清楚,因为我的主机已在运行。
有没有一种方法可以让我的现有主节点轻松地使用新的负载平衡器作为HA控制平面运行?我认为这是最好的解决方案
将非HA控制平面转换为HA控制平面的最佳方法是创建一个全新的HA控制平面,然后将所有应用程序迁移到那里
可能的解决办法
下面我将尝试帮助您实现您的目标,但我不建议在任何将被视为生产集群的集群上使用此过程。它适用于我的场景,也可能对您有所帮助
更新kube apiserver证书
首先,kube-apiserver使用证书
对控制平面通信进行加密,并且该证书
具有称为SAN的内容(受试者备选名称)。
SAN是用于访问API的IP地址列表,因此您需要添加LoadBalancer
的IP地址,可能还需要添加LB
的hostname
为此,您必须获得kubeadm
配置,例如使用命令:
$ kubeadm config view > kubeadm-config.yaml
然后将certsan
添加到apiServer
部分下的kubeadm config.yaml
config文件中,它应该如下示例所示:(您可能还需要添加controlPlaneEndpoint
以指向您的LB
)
现在,您可以使用以下命令更新kube apiserver
证书:
但请记住您必须首先从/etc/kubernetes/pki/
删除/移动旧的kube-apiserver
证书和密钥
$kubeadm init phase certs apiserver--config kubeadm-config.yaml
最后重新启动kube-apiserver
更新kubelet、调度程序和控制器管理器kubeconfig文件
下一步是更新kubelet
、调度程序
和控制器管理器
,以便使用LoadBalancer
与kube apiserver
通信
这三个组件都使用标准的kubeconfig文件:
/etc/kubernetes/kubelet.conf
,/etc/kubernetes/scheduler.conf
,/etc/kubernetes/controller manager.conf
与kube apiserver进行通信
唯一要做的是编辑服务器:
行,直接指向LB
,而不是kube-apiserver
,然后重新启动这些组件
kubelet
是systemd
服务,因此要重新启动它,请使用:
systemctl restart kubelet
控制器管理器
和调度程序
部署为POD
更新kube代理kubeconfig文件
接下来是更新kube proxy
的kubeconfig
文件的时候了,和以前一样-唯一要做的是编辑服务器:
行,指向负载平衡器
,而不是直接指向kube apiserver
此kubeconfig
实际上是一个configmap
,因此您可以使用以下命令直接编辑它:
$ kubectl edit cm kube-proxy -n kube-system
或者首先将其另存为清单文件:
$ kubectl get cm kube-proxy -n kube-system -o yaml > kube-proxy.yml
然后应用更改
在这些更改之后,不要忘记重新启动kube proxy
更新kubeadm配置映射
最后,将新的kubeadm config
configmap
(带有certsan
和controlPlaneEndpoint
条目)上载到集群,当您想要向集群添加新节点时,这一点尤为重要
$ kubeadm config upload from-file --config kubeadm-config.yaml
如果上面的命令不起作用,请尝试以下操作:
$ kubeadm upgrade apply --config kubeadm-config.yaml
你想在已经工作的kubeadm主机上使用kubeadm init?你能提供你所做的所有步骤吗?你检查过了吗?好的,我知道我需要在我的第二台主机上运行命令。但我不知道我应该使用哪些参数,以便我的第二个主控加入第一个主控。我已经安装了负载平衡器。但是命令应该是什么样子呢?我发现了一个类似的问题,但对象“主配置”似乎过时了。
$ kubeadm upgrade apply --config kubeadm-config.yaml