k8s默认在控制平面节点上的kubelet管理的静态pod中运行单个成员的etcd集群,但这不是高可用的方案。

etcd高可用集群至少需要三个成员组成。

etcd默认端口为2379,2380,三个节点的这两个端口都要能通。 可以在kubeadm配置文件更改默认端口。

这个实验有五个服务器。 我开的腾讯云香港服务器做的实验,网速很快,ssh稳定。 百度云没测。 阿里云测试不给力。 推荐腾讯云。 k8s1: master1 k8s2: node1 k8s3: haproxy k8s4: master2 k8s5: master3

1.首先在k8s master1上安装kubeadm,kubelet,kubectl,然后kubeadm init,最后kubectl get nodes,确认k8s1 master1准备就绪。 k8s安装: ubuntu18安装kubernetes v1.15

2.分别在k8s node1,k8s master2,k8s master3上安装kubeadm,kubectl,kubelet k8s安装: ubuntu18安装kubernetes v1.15

3.在k8s master1上的kubeadm-init.out文件找到join worker node和 join control-plane node的命令。

4.分别在k8s master2和k8s master3上执行join命令,注意,—control-plane kubeadm join k8s1:6443 --token 8vqitz.g1qyah1wpd3n723o
--discovery-token-ca-cert-hash sha256:abd9a745b8561df603ccd58e162d7eb11b416feb4a7bbe1216a3aa114f4fecd9
--control-plane --certificate-key 0e1e2844d565e657465f41707d8995b2d9d64246d5f2bf90f475b7782343254f

5.在node1上执行join命令 kubeadm join k8s1:6443 --token 8vqitz.g1qyah1wpd3n723o
--discovery-token-ca-cert-hash sha256:abd9a745b8561df603ccd58e162d7eb11b416feb4a7bbe1216a3aa114f4fecd9

6.现在master1 , master2, master3都可以执行kubectl管理k8s集群。 kubectl get nodes 显示有三个master,一个node.

7.安装haproxy负载均衡 apt-get update apt-get install haproxy -y cd /etc/haproxy cp haproxy.conf haproxy.conf.bak 在defaults下面 log global mode tcp option tcplog frontend proxynode bind *:80 stats uri /proxystats default_backend k8s-qq backend k8s-qq balance roundrobin server master1 172.19.0.12:6443 check server master2 172.19.0.8:6443 check server master3 172.19.0.4:6443 check systemctl restart haproxy systemctl enable haproxy

8.查看haproxy https://k8s3.example.com/proxystats 能看到三个后端服务器

9.查看运行etcd的pod kubectl -n kube-system get pods | grep etcd 这里我们能看到k8s1,k8s2,k8s3上分别运行etcd

10.查看etcd的日志 kubectl -n kube-system logs etcd-k8s1 kubectl -n kube-system logs etcd-k8s1 -f

11.登录到另一个etcd的pod上检查etcd集群状态 kubectl -n kube-system exec -it k8s2 — /bin/sh /# ETCDCTL_API=3 etcdctl -w table
—endpoints 172.19.0.12:2379, 172.19.0.4:2379, 172.19.0.8:2379
—cacert /etc/kubernetes/pki/etcd/ca.crt
—cert /etc/kubernetes/pki/etcd/server.crt
—key /etc/kubernetes/pki/etcd/server.key
endpoint status 这里会显示我们的三个etcd,其中一个为true,二个为false.

12.测试故障转移 12.1.假设现在k8s2为ture,ssh登录到k8s2,然后关闭docker systemctl stop docker 12.2.查看节点信息 kubectl get node 显示k8s2为NotReady状态。 12.4.在k8s3上再次查看endpoint status,发现k8s2现在为false,现在k8s3为true 12.5.不能关闭k8s1的docker测试,关闭k8s1,整个集群不可用。 12.6.查看haproxy的统计报告。 12.7.测试完后,启动docker