如何将 Kubernetes 非 HA 控制平面转换为 HA 控制平面?
How to convert a Kubernetes non-HA control plane into an HA control plane?
将 kubernetes 非 HA 控制平面转换为 HA 控制平面的最佳方法是什么?
我已经开始使用我的集群作为非 HA 控制平面 - 一个主节点和几个工作节点。集群已经 运行 了很多服务。
现在我想添加额外的主节点以将我的集群转换为 HA 控制平面。我已经设置并配置了一个负载均衡器。
但是我没有弄清楚如何将 -control-plane-endpoint 更改为我现有主节点的负载均衡器 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 控制平面?
我认为的最佳解决方案
convert
非 HA 控制平面到 HA 控制平面的最佳方法是创建一个完全新的 HA 控制平面,然后将您的所有应用程序迁移到那里。
可能的解决方案
下面我将尝试帮助您实现您的目标,但我不建议在任何将被视为生产集群的集群上使用此过程。它适用于我的场景,它也可能对你有所帮助。
更新 kube-apiserver 证书
首先,kube-apiserver 使用 certificate
来加密控制平面流量,这个 certificate
有一个叫做 的东西SAN(主题备用名称)。
SAN 是您将用于访问 API 的 IP 地址列表,因此您需要在其中添加 LoadBalancer
的 IP 地址,可能还有 LB
的 hostname
还有。
为此,您必须获得 kubeadm
配置,例如使用命令:
$ kubeadm config view > kubeadm-config.yaml
然后将 certSANs
添加到 apiServer
部分下的 kubeadm-config.yaml
配置文件,它应该如下例所示:(您可能还需要添加 controlPlaneEndpoint
指向给你的 LB
).
apiServer:
certSANs:
- "192.168.0.2" # your LB address
- "loadbalancer" # your LB hostname
extraArgs:
authorization-mode: Node,RBAC
...
controlPlaneEndpoint: "loadbalancer" # your LB DNS name or DNS CNAME
...
现在您可以更新 kube-apiserver
证书使用:
但请记住您必须首先delete/move您的旧kube-apiserver
证书和来自/etc/kubernetes/pki/
的密钥!
$ kubeadm init phase certs apiserver --config kubeadm-config.yaml.
最后重启你的kube-apiserver
。
更新 kubelet、调度程序和控制器管理器 kubeconfig 文件
下一步是更新 kubelet
、scheduler
和 controller manager
,以便使用 LoadBalancer
与 kube-apiserver
通信。
所有这三个组件都使用标准的 kubeconfig 文件:
/etc/kubernetes/kubelet.conf
, /etc/kubernetes/scheduler.conf
, /etc/kubernetes/controller-manager.conf
与 kube-apiserver
.
交流
唯一要做的就是编辑 server:
行以直接指向 LB
而不是 kube-apiserver
,然后重新启动这些组件。
kubelet
是 systemd
服务,因此要重新启动它,请使用:
systemctl restart kubelet
controller manager
和 schedulers
部署为 pods。
更新 kube-proxy kubeconfig 文件
接下来是时候为 kube-proxy
更新 kubeconfig
文件了,和以前一样 - 唯一要做的就是编辑 server:
行以指向 LoadBalancer
而不是直接 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-config 配置映射
最后上传新的kubeadm-config
configmap
(with certSANs
and controlPlaneEndpoint
entries)到集群,当你想添加新节点到集群。
$ kubeadm config upload from-file --config kubeadm-config.yaml
如果上面的命令不起作用,试试这个:
$ kubeadm upgrade apply --config kubeadm-config.yaml
将 kubernetes 非 HA 控制平面转换为 HA 控制平面的最佳方法是什么?
我已经开始使用我的集群作为非 HA 控制平面 - 一个主节点和几个工作节点。集群已经 运行 了很多服务。
现在我想添加额外的主节点以将我的集群转换为 HA 控制平面。我已经设置并配置了一个负载均衡器。 但是我没有弄清楚如何将 -control-plane-endpoint 更改为我现有主节点的负载均衡器 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 控制平面?
我认为的最佳解决方案
convert
非 HA 控制平面到 HA 控制平面的最佳方法是创建一个完全新的 HA 控制平面,然后将您的所有应用程序迁移到那里。
可能的解决方案
下面我将尝试帮助您实现您的目标,但我不建议在任何将被视为生产集群的集群上使用此过程。它适用于我的场景,它也可能对你有所帮助。
更新 kube-apiserver 证书
首先,kube-apiserver 使用 certificate
来加密控制平面流量,这个 certificate
有一个叫做 的东西SAN(主题备用名称)。
SAN 是您将用于访问 API 的 IP 地址列表,因此您需要在其中添加 LoadBalancer
的 IP 地址,可能还有 LB
的 hostname
还有。
为此,您必须获得 kubeadm
配置,例如使用命令:
$ kubeadm config view > kubeadm-config.yaml
然后将 certSANs
添加到 apiServer
部分下的 kubeadm-config.yaml
配置文件,它应该如下例所示:(您可能还需要添加 controlPlaneEndpoint
指向给你的 LB
).
apiServer:
certSANs:
- "192.168.0.2" # your LB address
- "loadbalancer" # your LB hostname
extraArgs:
authorization-mode: Node,RBAC
...
controlPlaneEndpoint: "loadbalancer" # your LB DNS name or DNS CNAME
...
现在您可以更新 kube-apiserver
证书使用:
但请记住您必须首先delete/move您的旧kube-apiserver
证书和来自/etc/kubernetes/pki/
的密钥!
$ kubeadm init phase certs apiserver --config kubeadm-config.yaml.
最后重启你的kube-apiserver
。
更新 kubelet、调度程序和控制器管理器 kubeconfig 文件
下一步是更新 kubelet
、scheduler
和 controller manager
,以便使用 LoadBalancer
与 kube-apiserver
通信。
所有这三个组件都使用标准的 kubeconfig 文件:
/etc/kubernetes/kubelet.conf
, /etc/kubernetes/scheduler.conf
, /etc/kubernetes/controller-manager.conf
与 kube-apiserver
.
交流
唯一要做的就是编辑 server:
行以直接指向 LB
而不是 kube-apiserver
,然后重新启动这些组件。
kubelet
是 systemd
服务,因此要重新启动它,请使用:
systemctl restart kubelet
controller manager
和 schedulers
部署为 pods。
更新 kube-proxy kubeconfig 文件
接下来是时候为 kube-proxy
更新 kubeconfig
文件了,和以前一样 - 唯一要做的就是编辑 server:
行以指向 LoadBalancer
而不是直接 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-config 配置映射
最后上传新的kubeadm-config
configmap
(with certSANs
and controlPlaneEndpoint
entries)到集群,当你想添加新节点到集群。
$ kubeadm config upload from-file --config kubeadm-config.yaml
如果上面的命令不起作用,试试这个:
$ kubeadm upgrade apply --config kubeadm-config.yaml