Ral*_*lph 2 kubernetes kubeadm
将 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
Run Code Online (Sandbox Code Playgroud)
错误消息似乎很清楚,因为我的主人已经在运行。有没有办法可以轻松地告诉我现有的主节点使用新的负载均衡器作为 HA 控制平面运行?
将非 HA控制平面迁移到convertHA控制平面的最佳方法是创建一个全新的HA控制平面,然后将所有应用程序迁移到那里。
下面我将尽力帮助您实现目标,但我不建议在任何被视为生产集群的集群上使用此过程。它适用于我的场景,也可能对你有帮助。
首先,kube-apiserver使用SAN (主题备用名称)certificate来加密控制平面流量。SAN 是您将用于访问 API 的 IP 地址列表,因此您需要在其中添加您的 IP 地址,也可能添加您的IP 地址。certificateLoadBalancerhostnameLB
为此,您必须kubeadm使用以下命令进行配置:
$ kubeadm config view > kubeadm-config.yaml
Run Code Online (Sandbox Code Playgroud)
然后添加certSANs到kubeadm-config.yaml配置文件下的apiServer部分,它应该类似于下面的示例:(您可能还需要添加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
...
Run Code Online (Sandbox Code Playgroud)
现在您可以kube-apiserver使用以下方法更新证书:
但请记住您必须首先删除/移动您的旧kube-apiserver证书和密钥/etc/kubernetes/pki/!
$ kubeadm init 阶段证书 apiserver --config kubeadm-config.yaml。
最后重新启动你的kube-apiserver.
下一步是更新kubelet,scheduler并与使用方controller manager进行沟通。
所有这三个组件都使用标准 kubeconfig 文件:、、来与.
唯一要做的就是编辑要指向的行而不是直接编辑,然后重新启动这些组件。kube-apiserverLoadBalancer
/etc/kubernetes/kubelet.conf/etc/kubernetes/scheduler.conf/etc/kubernetes/controller-manager.confkube-apiserverserver:LBkube-apiserver
这kubelet是systemd服务,因此要重新启动它,请使用:
systemctl restart kubelet
Run Code Online (Sandbox Code Playgroud)
和controller manager部署schedulers为 pod。
接下来是时候更新kubeconfig文件了kube-proxy,与以前一样 - 唯一要做的就是编辑server:要指向的行LoadBalancer而不是kube-apiserver直接编辑。
这kubeconfig实际上是一个configmap,因此您可以直接使用以下命令对其进行编辑:
$ kubectl edit cm kube-proxy -n kube-system
Run Code Online (Sandbox Code Playgroud)
或者首先将其保存为清单文件:
$ kubectl get cm kube-proxy -n kube-system -o yaml > kube-proxy.yml
Run Code Online (Sandbox Code Playgroud)
然后应用更改。
不要忘记kube-proxy在这些更改后重新启动。
最后将新节点kubeadm-config configmap(certSANs以及controlPlaneEndpoint条目)上传到集群,当您想要向集群添加新节点时,这一点尤其重要。
$ kubeadm config upload from-file --config kubeadm-config.yaml
Run Code Online (Sandbox Code Playgroud)
如果上面的命令不起作用,请尝试以下操作:
$ kubeadm upgrade apply --config kubeadm-config.yaml
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5033 次 |
| 最近记录: |