乐趣区

最简单的kubernetes HA安装方式-sealos详解

kubernetes 集群三步安装
概述
本文教你如何用一条命令构建 k8s 高可用集群且不依赖 haproxy 和 keepalived,也无需 ansible。通过内核 ipvs 对 apiserver 进行负载均衡,并且带 apiserver 健康检测。
快速入门
sealos 项目地址
准备条件

装好 docker 并启动 docker
把离线安装包 下载好拷贝到所有节点的 /root 目录下, 不需要解压,如果有文件服务器更好,sealos 支持从一个服务器上 wget 到所有节点上

安装
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 配置时需要使用
然后,就没有然后了
其它参数:
–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,只要与你地址不冲突请不要改
清理
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
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
删除一个 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
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
全部删除, 规则就自动被清除光了, 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 服务等

退出移动版