操做系統爲ubuntu18
kubernetes版本爲v1.15.1node
k8s默認在控制平面節點上的kubelet管理的靜態pod中運行單個成員的etcd集羣,但這不是高可用的方案。
etcd高可用集羣至少須要三個成員組成。docker
etcd默認端口爲2379,2380,三個節點的這兩個端口都要能通。
能夠在kubeadm配置文件更改默認端口。ubuntu
這個實驗有五個服務器。
我開的騰訊雲香港服務器作的實驗,網速很快,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的命令。frontend
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 0e1e2844d565e657465f41707d8995b2d9d64246d5f2bf90f475b7782343254fssh
5.在node1上執行join命令
kubeadm join k8s1:6443 --token 8vqitz.g1qyah1wpd3n723o --discovery-token-ca-cert-hash sha256:abd9a745b8561df603ccd58e162d7eb11b416feb4a7bbe1216a3aa114f4fecd9 tcp
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.3.在k8s3上再次查看endpoint status,發現k8s2如今爲false,如今k8s3爲true
12.4.不能關閉k8s1的docker測試,關閉k8s1,整個集羣不可用。
12.5.查看haproxy的統計報告。
12.6測試完後,啓動docker