sealos簡介
sealos 特性與優勢:
通過內核 ipvs 對 apiserver 進行負載均衡,並且帶 apiserver 健康檢測,並不依賴 haproxy 和 keepalived。
支持離線安裝,工具與資源包(二進制程序 配置文件 鏡像 yaml文件等)分離,這樣不同版本替換不同離線包即可
證書延期
使用簡單
支持自定義配置
內核負載,極其穩定,因為簡單所以排查問題也極其簡單
支持99年證書,不用擔心生產集群證書過期,ipvs負載多master可用性與穩定性更高,已經有上千用戶在生產環境中使用sealos, 有超過上千台服務器生產環境中使用sealos。
為什么不用 keepalived haproxy?
haproxy 用 static pod 跑沒有太大問題,還算好管理,keepalived 現在大部分開源 ansible 腳本都用 yum 或者 apt 等裝,這樣非常的不可控,有如下劣勢:
源不一致可能導致版本不一致,版本不一直連配置文件都不一樣,我曾經檢測腳本不生效一直找不到原因,后來才知道是版本原因。
系統原因安裝不上,依賴庫問題某些環境就直接裝不上了。
看了網上很多安裝腳本,很多檢測腳本與權重調節方式都不對,直接去檢測 haproxy 進程在不在,其實是應該去檢測 apiserver 是不是 healthz 的,如果 apiserver 掛了,即使 haproxy 進程存在,集群也會不正常了,就是偽高可用了。
管理不方便,通過 prometheus 對集群進行監控,是能直接監控到 static pod 的但是用 systemd 跑又需要單獨設置監控,且重啟啥的還需要單獨拉起。不如 kubelet 統一管理來的干凈簡潔。
我們還出現過 keepalived 把 CPU 占滿的情況。
所以為了解決這個問題,我把 keepalived 跑在了容器中(社區提供的鏡像基本是不可用的) 改造中間也是發生過很多問題,最終好在解決了。
總而言之,累覺不愛,所以在想能不能甩開 haproxy 和 keepalived 做出更簡單更可靠的方案出來,還真找到了。。。
本地負載為什么不使用 envoy 或者 nginx?
我們通過本地負載解決高可用問題。
本地負載:在每個 node 節點上都啟動一個負載均衡,上游就是三個 master。
如果使用 envoy 之類的負載均衡器,則需要在每個節點上都跑一個進程,消耗的資源更多,這是我不希望的。ipvs 實際也多跑了一個進程 lvscare,但是 lvscare 只是負責管理 ipvs 規則,和 kube-proxy 類似,真正的流量還是從很穩定的內核走的,不需要再把包丟到用戶態中去處理。
在架構實現上有個問題會讓使用 envoy 等變得非常尷尬,就是 join 時如果負載均衡沒有建立那是會卡住的,kubelet 就不會起來,所以為此你需要先啟動 envoy,意味着你又不能用 static pod 去管理它,同上面 keepalived 宿主機部署一樣的問題,用 static pod 就會相互依賴,邏輯死鎖,雞說要先有蛋,蛋說要先有雞,最后誰都沒有。
使用 ipvs 就不一樣,我可以在 join 之前先把 ipvs 規則建立好,再去 join 就可以了,然后對規則進行守護即可。一旦 apiserver 不可訪問了,會自動清理掉所有 node 上對應的 ipvs 規則, 等到 master 恢復正常時添加回來。
為什么要定制 kubeadm?
首先是由於 kubeadm 把證書過期時間寫死了,所以需要定制把它改成 99 年,雖然大部分人可以自己去簽個新證書,但是我們還是不想再依賴個別的工具,就直接改源碼了。
其次就是做本地負載時修改 kubeadm 代碼是最方便的,因為在 join 時我們需要做兩個事,第一是 join 之前先創建好 ipvs 規則,第二是創建 static pod。如果這塊不去定制 kubeadm 就把報靜態 pod 目錄已存在的錯誤,忽略這個錯誤很不優雅。 而且 kubeadm 中已經提供了一些很好用的 sdk 供我們去實現這個功能。
且這樣做之后最核心的功能都集成到 kubeadm 中了,sealos 就單單變成分發和執行上層命令的輕量級工具了,增加節點時我們也就可以直接用 kubeadm 了。
sealos架構
1、安裝 docker(略)
2、下載安裝 sealos
[root@master1 ~]# wget -c https://github.com/fanux/sealos/releases/download/v3.3.8/sealos && chmod +x sealos && mv sealos /usr/bin/
[root@master1 ~]# sealos
A longer description that spans multiple lines and likely contains
examples and usage of using your application. For example:
Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.
Usage:
sealos [command]
Available Commands:
cert generate certs
clean Simplest way to clean your kubernets HA cluster
cloud sealos on cloud
config print config template to console
help Help about any command
init Simplest way to init your kubernets HA cluster
install install kubernetes apps, like dashboard prometheus ..
ipvs sealos create or care local ipvs lb
join Simplest way to join your kubernets HA cluster
version show sealos version
Flags:
--config string config file (default is $HOME/.sealos/config.yaml)
-h, --help help for sealos
-t, --toggle Help message for toggle
Use "sealos [command] --help" for more information about a command.
subcommand is required
3、設置所有節點 hostname 主機名
[root@master1 ~]# hostnamectl set-hostname xxx
4、各節點配置 /etc/hosts
[root@master1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.x.x master1
192.168.x.x master2
192.168.x.x master3
192.168.x.x node1
5、同步各節點時間
timedatectl set-timezone Asia/Shanghai
chronyc -a makestep
6、下載 k8s 安裝包
wget https://github.com/sealstore/cloud-kernel/releases/download/offline/kube1.14.1.tar.gz
7、部署多master多node集群,admin 是服務器密碼(根據自己服務器密碼填寫)
sealos init --passwd admin \
--master 192.168.200.x \
--master 192.168.200.x \
--master 192.168.200.x \
--node 192.168.200.x \
--pkg-url /root/kube1.14.1.tar.gz \
--version v1.14.1
8、部署單master多node集群
sealos init --passwd admin \
--master 192.168.200.x \
--node 192.168.200.x \
--node 192.168.200.x
--pkg-url /root/kube1.14.1.tar.gz \
--version v1.14.1
9、重置集群
sealos clean --all -f
10、增加或刪除節點
sealos join --master 192.168.0.x --master 192.168.0.x
sealos join --master 192.168.0.x-192.168.0.x # 或者多個連續IP
sealos join --node 192.168.0.x --node 192.168.0.x
sealos join --node 192.168.0.x-192.168.0.x # 或者多個連續IP
sealos clean --master 192.168.0.x --master 192.168.0.x
sealos clean --master 192.168.0.x-192.168.0.x # 或者多個連續IP
sealos clean --node 192.168.0.x --node 192.168.0.x
sealos clean --node 192.168.0.x-192.168.0.x # 或者多個連續IP
11、查看所有節點狀態
[root@master1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready master 141m v1.14.1
master2 Ready master 141m v1.14.1
master3 Ready master 141m v1.14.1
node1 Ready <none> 140m v1.14.1
[root@master1 ~]# kubectl get po --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-7cc5c56498-bdc5g 1/1 Running 0 142m
kube-system calico-node-2kl4x 1/1 Running 0 141m
kube-system calico-node-xmnsx 1/1 Running 0 141m
kube-system calico-node-z5nl5 1/1 Running 0 142m
kube-system calico-node-z9r2l 1/1 Running 0 142m
kube-system coredns-fb8b8dccf-56km8 1/1 Running 0 142m
kube-system coredns-fb8b8dccf-jxc9j 1/1 Running 0 142m
kube-system etcd-master1 1/1 Running 0 141m
kube-system etcd-master2 1/1 Running 0 142m
kube-system etcd-master3 1/1 Running 0 141m
kube-system kube-apiserver-master1 1/1 Running 0 141m
kube-system kube-apiserver-master2 1/1 Running 1 142m
kube-system kube-apiserver-master3 1/1 Running 1 141m
kube-system kube-controller-manager-master1 1/1 Running 1 141m
kube-system kube-controller-manager-master2 1/1 Running 0 141m
kube-system kube-controller-manager-master3 1/1 Running 0 141m
kube-system kube-proxy-2mhdv 1/1 Running 0 141m
kube-system kube-proxy-nd6vr 1/1 Running 0 141m
kube-system kube-proxy-sl9cd 1/1 Running 0 142m
kube-system kube-proxy-vlt9r 1/1 Running 0 142m
kube-system kube-scheduler-master1 1/1 Running 1 141m
kube-system kube-scheduler-master2 1/1 Running 0 140m
kube-system kube-scheduler-master3 1/1 Running 0 141m
kube-system kube-sealyun-lvscare-node1 1/1 Running 0 141m
[root@master1 ~]# kubectl get po --all-namespaces -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system calico-kube-controllers-7cc5c56498-bdc5g 1/1 Running 0 142m 100.97.40.65 master1 <none> <none>
kube-system calico-node-2kl4x 1/1 Running 0 141m 192.168.200.6 node1 <none> <none>
kube-system calico-node-xmnsx 1/1 Running 0 141m 192.168.200.5 master3 <none> <none>
kube-system calico-node-z5nl5 1/1 Running 0 142m 192.168.200.4 master2 <none> <none>
kube-system calico-node-z9r2l 1/1 Running 0 142m 192.168.200.3 master1 <none> <none>
kube-system coredns-fb8b8dccf-56km8 1/1 Running 0 142m 100.97.40.67 master1 <none> <none>
kube-system coredns-fb8b8dccf-jxc9j 1/1 Running 0 142m 100.97.40.66 master1 <none> <none>
kube-system etcd-master1 1/1 Running 0 141m 192.168.200.3 master1 <none> <none>
kube-system etcd-master2 1/1 Running 0 142m 192.168.200.4 master2 <none> <none>
kube-system etcd-master3 1/1 Running 0 142m 192.168.200.5 master3 <none> <none>
kube-system kube-apiserver-master1 1/1 Running 0 141m 192.168.200.3 master1 <none> <none>
kube-system kube-apiserver-master2 1/1 Running 1 142m 192.168.200.4 master2 <none> <none>
kube-system kube-apiserver-master3 1/1 Running 1 142m 192.168.200.5 master3 <none> <none>
kube-system kube-controller-manager-master1 1/1 Running 1 142m 192.168.200.3 master1 <none> <none>
kube-system kube-controller-manager-master2 1/1 Running 0 141m 192.168.200.4 master2 <none> <none>
kube-system kube-controller-manager-master3 1/1 Running 0 141m 192.168.200.5 master3 <none> <none>
kube-system kube-proxy-2mhdv 1/1 Running 0 141m 192.168.200.6 node1 <none> <none>
kube-system kube-proxy-nd6vr 1/1 Running 0 141m 192.168.200.5 master3 <none> <none>
kube-system kube-proxy-sl9cd 1/1 Running 0 142m 192.168.200.4 master2 <none> <none>
kube-system kube-proxy-vlt9r 1/1 Running 0 142m 192.168.200.3 master1 <none> <none>
kube-system kube-scheduler-master1 1/1 Running 1 142m 192.168.200.3 master1 <none> <none>
kube-system kube-scheduler-master2 1/1 Running 0 141m 192.168.200.4 master2 <none> <none>
kube-system kube-scheduler-master3 1/1 Running 0 141m 192.168.200.5 master3 <none> <none>
kube-system kube-sealyun-lvscare-node1 1/1 Running 0 141m 192.168.200.6 node1 <none> <none>