单节点部署Kubesphere+OpenELB

KubeSphere 是在Kubernetes 之上构建的面向云原生应用的分布式操作系统,完全开源,支持多云与多集群管理,提供全栈的IT 自动化运维能力,简化企业的DevOps 工作流。在生产环境中,可以部署在GCE GKE、Azure AKS、AWS EKS、DigitalOcean、Linode、Oracle OKE这些国外的托管云上,也可以在国内的阿里云ACK、腾讯云TKE、华为云CCE这些托管云上。

使用托管云有一个很方便的优点是可是直接使用云基础的负载均衡器暴露服务出来,但如果你只是想自建一个基于Linux的K8S(Kubernetes)集群,那么就需要自己解决服务暴露的需求了。如果你使用K3S,也就是rancher的那套东西,可以不用怎么去想这个问题,rancher开箱即用的traefik就可以满足这一点,当然你也可以用其他LB去解决,这不在本文范畴,下次再安排。

以下重点还是围绕KubeSphere的K8S,说一下在Linux上部署安装的K8S应该怎么暴露服务,这里用到的是OpenELB,它的前身是PorterLB,属实是OpenELB更好记忆了。

首先按照KubeSphere的安装说明,完成KubeSphere的安装,本文采取的安装方式是All-in-One,单节点,机器配置为Hetzner AX51-NVME服务器。

安装OpenELB目前有两种方式,一种是直接使用kubectl,另外一种则是需要借助helm进行,这里采用kubectl的安装,个人觉得更方便,也更容易理解和后续维护。

安装 OpenELB

使用 kubectl 安装 OpenELB

  1. 首先使用SSH登录 Kubernetes 集群所在的服务器,登录成功后执行下述命令:
    kubectl apply -f https://raw.githubusercontent.com/openelb/openelb/master/deploy/openelb.yaml
  2. 执行完毕后,请再次执行下述命令检查openelb-manager的状态,当状态变为 READY: 11STATUS: Running 时,那么意味着 OpenELB 已经安装成功了。
    kubectl get po -n openelb-system

执行第二步之后,应该可以看到下述输出:

NAME                               READY   STATUS      RESTARTS   AGE
   openelb-admission-create-cjdg5     0/1     Completed   0          41s
   openelb-admission-patch-2f2sd      0/1     Completed   0          41s
   openelb-keepalive-vip-42z4h        1/1     Running     0          41s
   openelb-manager-774f8cc4dc-s2gbl   1/1     Running     0          41s

使用 kubectl 删除 OpenELB

  1. 如需删除 OpenELB, 首先使用SSH登录 Kubernetes 集群所在的服务器,登录成功后执行下述命令:
    kubectl delete -f https://raw.githubusercontent.com/openelb/openelb/master/deploy/openelb.yaml

请注意!!!

在删除 OpenELB 之前,必须确保openelb-system命名空间下没有任何服务,特别是后面配置到eip时,必须先删除Eip,再删除 OpenELB ,否则你会遇到无法删除Eip的Bug,引用来源:https://kubesphere.com.cn/forum/d/2379-porter/8

执行删除命令之后,你可以执行一次以下命令,检查命名空间下是否还存在openelb-system这个命名空间,如果没有找到,那么OpenELB就已经被删除了。

kubectl get ns

配置 OpenELB

OpenELB在最新的0.5.0的版本中,支持三种模式,分别是BGP模式、Layer2模式、VIP模式。BGP模式适合能够管理到路由器的用户,路由需要支持BGP路由和等价多路经路由;Layer2是大多数用户比较容易做的,只需要机房允许ARP/NDP数据包,就可以了;VIP模式与Layer2的需求差不太多,可以不需要ARP/NDP数据包的支持,但这个模式目前还是测试阶段,有许多不确定的因素,此外它要求Kuberneter集群节点有且只能有一个NIC,而在我的测试中,如果这个NIC上只有一个IP地址,使用VIP模式之后,则会丢失路由

介绍完三种模式,在我们这个案例中,只使用Layer2就可以达成目的,因此以下操作都是基于Layer2模式进行的,如果要了解更多模式的具体区别,请访问官方参考:https://openelb.io/docs/getting-started/installation/install-openelb-on-kubernetes/

步骤1:为 kube-proxy 启用 strictARP

在Layer2模式下,需要为kube-proxy启用strictARP,以便Kubernetes集群中的所有NIC停止响应来自其他NIC的ARP请求,让OpenELB处理ARP请求。

  1. 登录Kubernetes集群,运行下属命令编辑 kube-proxy ConfigMap
    kubectl edit configmap kube-proxy -n kube-system
  2. 在kube-proxy ConfigMap YAML配置中,将data.config.conf.ipvs.strictARP设置为True。
    ipvs:  strictARP: true
  3. 运行以下命令以重新启动kube-proxy:
    kubectl rollout restart daemonset kube-proxy -n kube-system

步骤2(可选):指定用于OpenELB的网卡

如果安装了OpenELB的节点有多个NIC,则需要在第2层模式下指定用于OpenELB的NIC。如果节点只有一个NIC,则可以跳过此步骤。

在本例中,安装了OpenELB的master 1节点有两个NIC(eth0 192.168.0.2 和eth1 192.168.1.2),我们指定 eth0 192.168.0.2 用于OpenELB。

运行以下命令注释master 1以指定NIC:

kubectl annotate nodes master1 layer2.openelb.kubesphere.io/v1alpha1="192.168.0.2"

步骤3:创建公网EIP对象(Eip)

这里的EIP对象充当OpenELB的IP地址池,如果你有多个IP,则填写起始IP-结束IP,如果你只有一个IP,则填写一个就好。在本例中,我们只有一个公网IP。

  1. 运行以下命令为EIP对象创建一个YAML文件:
    vi layer2-eip.yaml
  2. 将以下信息添加到YAML文件:
    apiVersion: network.kubesphere.io/v1alpha2
    kind: Eip
    metadata:
      name: layer2-eip
      spec:
        address: 162.55.6.138
        interface: eth0
        protocol: layer2

请注意!!!

  • SPEC:ADDRESS 中指定的IP地址必须与Kubernetes集群节点位于同一网段上。
  • 如果你有多台服务器需要添加进集群,则应确保每台节点都有一个内网连接可用

然后运行以下命令创建弹性公网IP对象:

kubectl apply -f layer2-eip.yaml

完成以上步骤之后,这时OpenELB的安装已经进行到一半了,剩下的我们需要到KubeSphere中进行。

在KubeSphere启用集群网关,并指定OpenELB为负载均衡器提供商

登录KubeSphere控制台,在【集群】-> 【集群设置】-> 【网关设置】,添加一个集群网关,选择OpenELB为负载均衡器提供商,并在注解(即注释)中添加以下三项:

lb.kubesphere.io/v1alpha1: openelb
protocol.openelb.kubesphere.io/v1alpha1: layer2
eip.openelb.kubesphere.io/v1alpha2: layer2-eip

如下图所示

图片[1] - 单节点部署Kubesphere+OpenELB - EVLIT

最后还需要在【平台管理】-> 【集群管理】,进入集群,在系统项目 kubesphere-controls-system 中找到集群网关对应的服务,本例中的是 kubesphere-router-kubesphere-system。

图片[2] - 单节点部署Kubesphere+OpenELB - EVLIT

编辑服务的配置文件,将 externalTrafficPolicy 改为 Local 模式即可。

图片[3] - 单节点部署Kubesphere+OpenELB - EVLIT

或直接在kubectl中完成,输入下述命令:

kubectl patch svc -n kubesphere-controls-system kubesphere-router-kubesphere-system -p '{"spec": {"externalTrafficPolicy": "Local"}}'

至此,OpenELB的安装结束。后续就可以在项目部署中,直接使用这个集群网关,提供网站80和443端口的暴露了。碍于篇幅这里不做展开。

创作不易,转载请著名出处,谢谢!

相关推荐: 如果OpenLiteSpeed使用了CloudFlare等CDN如何显示访客的真实IP

本文为DirectAdmin面板如何使用OpenLiteSpeed系列的第二章: 第一章:DirectAdmin面板如何使用OpenLiteSpeed替代默认的Apache第二章:如果OpenLiteSpeed使用了CloudFlare等CDN如何显示访客的真…

© 版权声明
THE END
喜欢就支持一下吧
点赞45 分享
评论 共22条
头像
说说你的看法!
提交
头像

昵称

取消
昵称表情代码图片
    • 头像勾魂小寡妇0
    • 头像夜琉璃0
    • 头像鵼絔0
    • 头像ddd0
    • 头像og0
    • 头像hehe0
    • 头像删除记忆0