sealos 部署 kubernetes 高可用集群

sealos简介

sealos是一个纯golang开发的极简kubernetes高可用集群部署工具,一个二进制工具加一个资源包,不依赖haproxy keepalived ansible等重量级工具,一条命令就可实现kubernetes高可用集群构建,无论是单节点还是集群,单master还是多master,生产还是测试都能很好支持!简单不意味着阉割功能,照样能全量支持kubeadm所有配置。

在这里插入图片描述

支持99年证书,不用担心生产集群证书过期,ipvs负载多master可用性与稳定性更高,已经有上千用户在生产环境中使用sealos, 有超过上千台服务器生产环境中使用sealos。

底层架构:
在这里插入图片描述

官方网站:https://sealyun.com/

项目地址:https://github.com/fanux/sealos

部署kubernetes集群

准备节点清单,部署3个master节点1个worker节点:

节点名称IP地址OS版本角色
node01192.168.72.50ubuntu 22.04 LTSmaster
node02192.168.72.51ubuntu 22.04 LTSmaster
node03192.168.72.52ubuntu 22.04 LTSmaster
node04192.168.72.53ubuntu 22.04 LTSworker

所有节点必须配置不同主机名

hostnamectl set-hostname xxx

所有节点时间同步

yum install -y chrony
systemctl enable --now chronyd  
timedatectl set-timezone Asia/Shanghai

第一个node节点安装sealos工具:

wget -c https://sealyun-home.oss-cn-beijing.aliyuncs.com/sealos-4.0/latest/sealos-amd64 -O sealos && \
    chmod +x sealos && mv sealos /usr/bin

第一个node节点执行以下命令部署kubernetes集群:

sealos run labring/kubernetes:v1.24.2 labring/calico:v3.22.1 \
     --masters 192.168.72.50,192.168.72.51,192.168.72.52 \
     --nodes 192.168.72.53 -p 123456

参数说明:

  • labring/kubernetes:v1.24.2: dockerhub中的镜像,为kubernetes核心组件
  • labring/calico:v3.22.1: dockerhub中的镜像,为kubernetes网络插件
  • -p:为所有节点root密码

查看集群节点信息

root@node01:~# kubectl get nodes -o wide
NAME     STATUS   ROLES           AGE     VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE           KERNEL-VERSION      CONTAINER-RUNTIME
node01   Ready    control-plane   4h27m   v1.24.2   192.168.72.50   <none>        Ubuntu 22.04 LTS   5.15.0-27-generic   containerd://1.6.2
node02   Ready    control-plane   4h26m   v1.24.2   192.168.72.51   <none>        Ubuntu 22.04 LTS   5.15.0-27-generic   containerd://1.6.2
node03   Ready    control-plane   4h25m   v1.24.2   192.168.72.52   <none>        Ubuntu 22.04 LTS   5.15.0-27-generic   containerd://1.6.2
node04   Ready    <none>          4h24m   v1.24.2   192.168.72.53   <none>        Ubuntu 22.04 LTS   5.15.0-27-generic   containerd://1.6.2

查看集群pods信息

root@node01:~# kubectl get pods -A
NAMESPACE         NAME                                       READY   STATUS    RESTARTS        AGE
calico-system     calico-kube-controllers-6b44b54755-9x2hb   1/1     Running   0               3m20s
calico-system     calico-node-bz6ff                          1/1     Running   0               3m20s
calico-system     calico-node-kwz5f                          1/1     Running   0               3m20s
calico-system     calico-node-sm52x                          1/1     Running   0               3m20s
calico-system     calico-node-svqkp                          1/1     Running   0               3m20s
calico-system     calico-typha-845987b4fc-7tv9p              1/1     Running   0               3m21s
calico-system     calico-typha-845987b4fc-xg5mx              1/1     Running   0               3m10s
kube-system       coredns-6d4b75cb6d-rx9fd                   1/1     Running   0               6m11s
kube-system       coredns-6d4b75cb6d-vsdcf                   1/1     Running   0               6m11s
kube-system       etcd-node01                                1/1     Running   0               6m25s
kube-system       etcd-node02                                1/1     Running   0               5m1s
kube-system       etcd-node03                                1/1     Running   0               4m
kube-system       kube-apiserver-node01                      1/1     Running   0               6m22s
kube-system       kube-apiserver-node02                      1/1     Running   0               4m59s
kube-system       kube-apiserver-node03                      1/1     Running   0               3m54s
kube-system       kube-controller-manager-node01             1/1     Running   1 (2m46s ago)   6m22s
kube-system       kube-controller-manager-node02             1/1     Running   0               4m5s
kube-system       kube-controller-manager-node03             1/1     Running   0               3m59s
kube-system       kube-proxy-6m2nw                           1/1     Running   0               3m39s
kube-system       kube-proxy-7ngqv                           1/1     Running   0               6m11s
kube-system       kube-proxy-dkqkz                           1/1     Running   0               5m12s
kube-system       kube-proxy-xvzh2                           1/1     Running   0               4m1s
kube-system       kube-scheduler-node01                      1/1     Running   1 (5m1s ago)    6m22s
kube-system       kube-scheduler-node02                      1/1     Running   1 (2m37s ago)   3m46s
kube-system       kube-scheduler-node03                      1/1     Running   0               3m56s
kube-system       kube-sealyun-lvscare-node04                1/1     Running   0               3m32s
tigera-operator   tigera-operator-d7957f5cc-wsndk            1/1     Running   1 (2m45s ago)   3m32s

其他常用命令

  • sealos reset:清理集群
  • sealos add:增加节点
  • sealos delete:删除节点
  • sealos save:保存离线镜像包
  • sealos load:加载离线镜像包

sealos设计原理

本地负载就是在每个node节点上都启动一个负载均衡,上游就是三个master,负载方式有很多 ipvs envoy nginx等,我们最终使用内核ipvs。

使用ipvs可以在join之前先把ipvs规则建立好,再去join就可以join进去了,然后对规则进行守护即可。一旦apiserver不可访问了,会自动清理掉所有node上对应的ipvs规则, master恢复正常时添加回来。

有个细节是所有对apiserver进行访问都是通过域名,因为master上连接自己就行,node需要通过虚拟ip链接多个master,这个每个节点的kubelet与kube-proxy访问apiserver的地址是不一样的,而kubeadm又只能在配置文件中指定一个地址,所以使用一个域名但是每个节点解析不同。

在 worker 上起了一个lvscare的static pod去守护这个 ipvs, 一旦apiserver不可访问了,会自动清理掉所有node上对应的ipvs规则, master恢复正常时添加回来。所以在node上加了三个东西,可以直观的看到:

cat /etc/kubernetes/manifests   # 这下面增加了lvscare的static pod
ipvsadm -Ln                     # 可以看到创建的ipvs规则
cat /etc/hosts                  # 增加了虚拟IP的地址解析

在/etc/kubernetes/manifests/下面增加了lvscare的static pod

root@node04:~# cat /etc/kubernetes/manifests/kube-sealyun-lvscare.yaml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  name: kube-sealyun-lvscare
  namespace: kube-system
spec:
  containers:
  - args:
    - care
    - --vs
    - 10.103.97.2:6443
    - --health-path
    - /healthz
    - --health-schem
    - https
    - --rs
    - 192.168.72.50:6443
    - --rs
    - 192.168.72.51:6443
    - --rs
    - 192.168.72.52:6443
    command:
    - /usr/bin/lvscare
    env:
    - name: LVSCARE_NODE_IP
      value: 192.168.72.53
    image: ghcr.io/labring/lvscare:v1.1.3-beta.7
    imagePullPolicy: IfNotPresent
    name: kube-sealyun-lvscare
    resources: {}
    securityContext:
      privileged: true
    volumeMounts:
    - mountPath: /lib/modules
      name: lib-modules
      readOnly: true
  hostNetwork: true
  volumes:
  - hostPath:
      path: /lib/modules
      type: ""
    name: lib-modules
status: {}

查看kube-system多创建出的负载均衡pod

# kubectl -n kube-system get pods -o wide | grep lvscare
kube-sealyun-lvscare-izj6ccgq3cou36gpcrkcyuz      1/1     Running   0          9m3s    192.168.0.174    izj6ccgq3cou36gpcrkcyuz   <none>           <none>

查看ipvs规则

yum install -y ipvsadm
ipvsadm -Ln

master示例

[root@iZj6ccgq3cou36gpcrkcyuZ ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.96.0.1:443 rr
  -> 192.168.0.171:6443           Masq    1      1          0         
  -> 192.168.0.172:6443           Masq    1      1          0         
  -> 192.168.0.173:6443           Masq    1      0          0         
TCP  10.96.0.10:53 rr
  -> 100.69.190.1:53              Masq    1      0          0         
  -> 100.84.118.130:53            Masq    1      0          0         
TCP  10.96.0.10:9153 rr
  -> 100.69.190.1:9153            Masq    1      0          0         
  -> 100.84.118.130:9153          Masq    1      0          0         
TCP  10.103.97.2:6443 rr
  -> 192.168.0.171:6443           Masq    1      1          0         
  -> 192.168.0.172:6443           Masq    1      1          0         
  -> 192.168.0.173:6443           Masq    1      0          0         
UDP  10.96.0.10:53 rr
  -> 100.69.190.1:53              Masq    1      0          0         
  -> 100.84.118.130:53            Masq    1      0          0

node示例

[root@iZj6ccgq3cou36gpcrkcytZ ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.96.0.1:443 rr
  -> 192.168.0.171:6443           Masq    1      2          0         
  -> 192.168.0.172:6443           Masq    1      2          0         
  -> 192.168.0.173:6443           Masq    1      0          0         
TCP  10.96.0.10:53 rr
  -> 100.69.190.1:53              Masq    1      0          0         
  -> 100.84.118.130:53            Masq    1      0          0         
TCP  10.96.0.10:9153 rr
  -> 100.69.190.1:9153            Masq    1      0          0         
  -> 100.84.118.130:9153          Masq    1      0          0         
UDP  10.96.0.10:53 rr
  -> 100.69.190.1:53              Masq    1      0          0         
  -> 100.84.118.130:53            Masq    1      0          0

查看/etc/hosts虚拟IP地址解析

每个master节点

# cat /etc/hosts
192.168.0.171   iZj6ccgq3cou36gpcrkcytZ iZj6ccgq3cou36gpcrkcytZ

192.168.0.171 apiserver.cluster.local

每个node节点

# cat /etc/hosts
192.168.0.172   iZj6ccgq3cou36gpcrkcyuZ iZj6ccgq3cou36gpcrkcyuZ

10.103.97.2 apiserver.cluster.local
  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值