細述kubernetes HA安裝方式- sealos詳解

概述node

本文教你如何用一條命令構建k8s高可用集羣且不依賴haproxy和keepalived,也無需ansible。經過內核ipvs對apiserver進行負載均衡,而且帶apiserver健康檢測。linux

準備條件nginx

裝好docker並啓動docker,把離線安裝包 下載好拷貝到全部節點的/root目錄下, 不須要解壓,若是有文件服務器更好,sealos支持從一個服務器上wget到全部節點上docker

安裝shell

sealos已經放在離線包中,解壓後在kube/bin目錄下(能夠解壓一個,獲取sealos bin文件)後端

sealos init \
    --master 192.168.0.2 \
    --master 192.168.0.3 \
    --master 192.168.0.4 \          # master地址列表
    --node 192.168.0.5 \            # node地址列表
    --user root \                   # 服務用戶名
    --passwd your-server-password \ # 服務器密碼,用於遠程執行命令
    --pkg kube1.14.1.tar.gz  \      # 離線安裝包名稱
    --version v1.14.1               # kubernetes 離線安裝包版本,這渲染kubeadm配置時須要使用

而後,就沒有而後了api

其它參數服務器

--kubeadm-config string   kubeadm-config.yaml local # 自定義kubeadm配置文件,若有這個sealos就不去渲染kubeadm配置
 --pkg-url string          http://store.lameleg.com/kube1.14.1.tar.gz download offline pakage url # 支持從遠程拉取離線包,省的每一個機器拷貝,前提你得有個http服務器放離線包
 --vip string              virtual ip (default "10.103.97.2") # 代理master的虛擬IP,只要與你地址不衝突請不要改

清理app

sealos clean \
    --master 192.168.0.2 \
    --master 192.168.0.3 \
    --master 192.168.0.4 \          # master地址列表
    --node 192.168.0.5 \            # node地址列表
    --user root \                   # 服務用戶名
    --passwd your-server-password

增長節點負載均衡

新增節點可直接使用kubeadm, 到新節點上解壓

cd kube/shell && init.sh
echo "10.103.97.2 apiserver.cluster.local" >> /etc/hosts   # using vip
kubeadm join 10.103.97.2:6443 --token 9vr73a.a8uxyaju799qwdjv \
    --master 10.103.97.100:6443 \
    --master 10.103.97.101:6443 \
    --master 10.103.97.102:6443 \
    --discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866

安裝dashboard prometheus

離線包裏包含了yaml配置和鏡像,用戶按需安裝。

cd /root/kube/conf
kubectl taint nodes --all node-role.kubernetes.io/master-  # 去污點,根據需求看狀況,去了後master容許調度
kubectl apply -f heapster/ # 安裝heapster, 不安裝dashboard上沒監控數據
kubectl apply -f heapster/rbac 
kubectl apply -f dashboard  # 裝dashboard
kubectl apply -f prometheus # 裝監控

是否是很神奇,究竟是如何作到這點的?那就須要去看下面兩個東西

關於超級kubeadm

咱們定製了kubeadm,作了兩個事情:

在每一個node節點上增長了一條ipvs規則,其後端代理了三個master

在node上起了一個lvscare的static pod去守護這個 ipvs, 一旦apiserver不可訪問了,會自動清理掉全部node上對應的ipvs規則, master恢復正常時添加回來。

經過這樣的方式實現每一個node上經過本地內核負載均衡訪問masters:

+----------+                       +---------------+  virturl server: 127.0.0.1:6443
  | mater0   |< ----------------------| ipvs nodes    |    real servers:
  +----------+                      |+---------------+            10.103.97.200:6443
                                    |                             10.103.97.201:6443
  +----------+                      |                             10.103.97.202:6443
  | mater1   |<---------------------+
  +----------+                      |
                                    |
  +----------+                      |
  | mater2   |<---------------------+
  +----------+

其實sealos就是幫你執行了以下命令:

super-kubeadm

在你的node上增長了三個東西:

cat /etc/kubernetes/manifests   # 這下面增長了lvscare的static pod
ipvsadm -Ln                     # 能夠看到建立的ipvs規則
cat /etc/hosts                  # 增長了虛擬IP的地址解析

關於lvscare

這是一個超級簡單輕量級的lvs建立與守護進程,支持健康檢查,底層與kube-proxy使用的是相同的庫,支持HTTP的健康檢測。

清理機器上的IPVS規則

ipvsadm -C

啓動幾個nginx做爲ipvs代理後端的realserver

docker run -p 8081:80 --name nginx1 -d nginx
docker run -p 8082:80 --name nginx2 -d nginx
docker run -p 8083:80 --name nginx3 -d nginx

啓動lvscare守護它們

lvscare care --vs 10.103.97.12:6443 --rs 127.0.0.1:8081 --rs 127.0.0.1:8082 --rs 127.0.0.1:8083 \
--health-path / --health-schem http

能夠看到規則已經被建立

ipvsadm -Ln

[root@iZj6c9fiza9orwscdhate4Z ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.103.97.12:6443 rr
  -> 127.0.0.1:8081               Masq    1      0          0         
  -> 127.0.0.1:8082               Masq    1      0          0         
  -> 127.0.0.1:8083               Masq    1      0          0 
curl vip:

[root@iZj6c9fiza9orwscdhate4Z ~]# curl 10.103.97.12:6443

刪除一個nginx,規則就少了一條

[root@iZj6c9fiza9orwscdhate4Z ~]# docker stop nginx1
nginx1
[root@iZj6c9fiza9orwscdhate4Z ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.103.97.12:6443 rr
  -> 127.0.0.1:8082               Masq    1      0          0         
  -> 127.0.0.1:8083               Masq    1      0          1

再刪除一個:

[root@iZj6c9fiza9orwscdhate4Z ~]# docker stop nginx2
nginx2
[root@iZj6c9fiza9orwscdhate4Z ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.103.97.12:6443 rr
  -> 127.0.0.1:8083               Masq    1      0          0

此時VIP任然能夠訪問:

[root@iZj6c9fiza9orwscdhate4Z ~]# curl 10.103.97.12:6443

所有刪除, 規則就自動被清除光了, curl也curl不通了,由於沒realserver可用了

[root@iZj6c9fiza9orwscdhate4Z ~]# docker stop nginx3
nginx3
[root@iZj6c9fiza9orwscdhate4Z ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.103.97.12:6443 rr
[root@iZj6c9fiza9orwscdhate4Z ~]# curl 10.103.97.12:6443 
curl: (7) Failed connect to 10.103.97.12:6443; 拒絕鏈接

再把nginx都啓動起來,規則就自動被加回來

[root@iZj6c9fiza9orwscdhate4Z ~]# docker start nginx1 nginx2 nginx3
nginx1
nginx2
nginx3
[root@iZj6c9fiza9orwscdhate4Z ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.103.97.12:6443 rr
  -> 127.0.0.1:8081               Masq    1      0          0         
  -> 127.0.0.1:8082               Masq    1      0          0         
  -> 127.0.0.1:8083               Masq    1      0          0

因此sealos中,上面apiserver就是上面三個nginx,lvscare會對其進行健康檢測。固然你也能夠把lvscare用於一些其它場景,好比代理本身的TCP服務等

相關文章
相關標籤/搜索