如何将Kubernetes非HA控制平面转换为HA控制平面?

如何将Kubernetes非HA控制平面转换为HA控制平面?,kubernetes,kubeadm,Kubernetes,Kubeadm,将kubernetes非HA控制平面转换为HA控制平面的最佳方法是什么 我已经开始将集群作为一个非HA控制平面—一个主节点和几个工作节点。集群已经运行了很多服务 现在,我想添加额外的主节点,以将集群转换为HA控制平面。我已经设置并配置了负载平衡器。 但我没有弄清楚如何将-control平面端点更改为现有主节点的负载平衡器IP地址 调用kubeadm会导致以下错误: sudo kubeadm init --control-plane-endpoint "my-load-balancer:

将kubernetes非HA控制平面转换为HA控制平面的最佳方法是什么

我已经开始将集群作为一个非HA控制平面—一个主节点和几个工作节点。集群已经运行了很多服务

现在,我想添加额外的主节点,以将集群转换为HA控制平面。我已经设置并配置了负载平衡器。 但我没有弄清楚如何将-control平面端点更改为现有主节点的负载平衡器IP地址

调用kubeadm会导致以下错误:

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