首页 > 其他分享 >sealos 离线部署 k8s 高可用集群

sealos 离线部署 k8s 高可用集群

时间:2023-12-18 10:05:12浏览次数:24  
标签:kube -- 离线 system 192.168 Running sealos k8s

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架构

sealos 离线部署 k8s 高可用集群_ico

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>

标签:kube,--,离线,system,192.168,Running,sealos,k8s
From: https://blog.51cto.com/u_14620403/8868198

相关文章

  • 下载镜像提示 output: Error response from daemon: Get https://k8s.gcr.io/v2/: x5
    出现这问题可能是两种原因:1、k8s所有节点的时间不统一。2、k8s配置文件镜像仓库有问题问题:[root@master1~]#kubeadmconfigimagespull--configkubeadm-config.yamlW092001:12:10.7940302723configset.go:202]WARNING:kubeadmcannotvalidatecomponentconfigs......
  • k8s集群从一千节点增加到五千台节点遇到的瓶颈
    Kubernetes自从1.6起便号称可以承载5000个以上的节点,但是从数十到5000的路上,难免会遇到问题。在kubernetes5000之路上的经验,包括遇到的问题、尝试解决问题以及找到真正的问题。1、问题一:1~500个节点之后问题:kubectl有时会出现timeout(p.s.kubectl-v=6可以显示所......
  • k8s集群优化
    1、内核参数调化fs.file-max=1000000#max-file表示系统级别的能够打开的文件句柄的数量,一般如果遇到文件句柄达到上限时,会碰到#"Toomanyopenfiles"或者Socket/File:Can’topensomanyfiles等错误。#配置arpcache大小net.ipv4.neigh.default.gc_thresh1=1024#存......
  • k8s的service和ep是如何关联和相互影响的
    1、ephemeralstorage是k8s1.8引入的特性,用作限制临时存储,可为Pod的每个容器单独配置。2、它包括四个方面:EmptyDievolumes、Containerlogs、imagelayers和containerwritablelayers。注:容器可写层即向容器内写入文件时占用的存储。3、当任意一个容器超过限制,或整个Pod超过限......
  • k8s安装metrics-server
    KubernetesMetricsServer:KubernetesMetricsServer是Cluster的核心监控数据的聚合器,kubeadm默认是不部署的。MetricsServer供Dashboard等其他组件使用,是一个扩展的APIServer,依赖于APIAggregator。所以,在安装MetricsServer之前需要先在kube-apiserver中开启API......
  • 查看k8s中etcd数据
    1.查看ETCD集群中运行的ETCDpod[root@master1~]#kubectlgetpod-nkube-system|grepetcdetcd-master11/1Running061metcd-master21/1Running058metcd-master31......
  • 解决k8s Get http://127.0.0.1:10252/healthz: dial tcp 127.0.0.1:10252: connect: c
    安装完k8s集群之后很可能会出现一下情况:[root@master1~]#kubectlgetcsNAMESTATUSMESSAGEERRORschedulerUnhealthyGethttp://127.0.0.1:10251......
  • k8s集群安装KubeSphere3.0
    架构:前提条件:k8s集群版本必须是1.15.x,1.16.x,1.17.x,or1.18.x必须有默认的storageclass内存和cpu最低要求:CPU>1Core,Memory>2G安装并设置默认storageclass略过,可以看之前的我发过的博客1.安装yaml文件(先安装第一个,再安装第二个)kubectlapply-fhttps://github.com......
  • k8s基于NFS部署storageclass实现pv并标记为一个默认的StorageClass
    架构:一.搭建storageclass1、master和node节点安装nfs服务yum-yinstallnfs-utilsrpcbind2、启动nfs并设为开机自启:systemctlstartnfs&&systemctlenablenfssystemctlstartrpcbind&&systemctlenablerpcbind3、master节点创建共享挂载目录(客户端不需要创建共享目录......
  • 理解K8S的CRD
    CRD本身是Kubernetes内置的资源类型,全称是CustomResourceDefinition,可以通过命令查看,kubectlget查看集群内定义的CRD资源。NAMECREATEDATapps.app.o0w0o.cn2019-07-25T07:02:47Zmicroservices.app.o0w0o.cn2019-07-25T07:02:47Z在与人......