当前位置 : 主页 > 网络编程 > 其它编程 >

k8s:使用metalLB来实现负载均衡LoadBalancer

来源:互联网 收集:自由互联 发布时间:2023-07-02
本地自己安装的k8s集群,默认是不支持LoadBlancer的,需要自己安装一个组件来支持.而云上的k8s,肯定是都支持LoadBalancer的.如果自己公司搭建集群,那肯定也是 本地自己安装的k8s集群, 默认是不
本地自己安装的k8s集群,默认是不支持LoadBlancer的,需要自己安装一个组件来支持.而云上的k8s,肯定是都支持LoadBalancer的.如果自己公司搭建集群,那肯定也是

本地自己安装的k8s集群, 默认是不支持LoadBlancer的, 需要自己安装一个组件来支持. 而云上的k8s, 肯定是都支持LoadBalancer的.如果自己公司搭建集群, 那肯定也是需要安装LoadBlancer的, 我们看看都有哪些支持本地集群的实现哪:

  • metalLB: Netlify是一家位于旧金山的云计算公司,为Web应用程序和静态网站提供托管和无服务器后端服务.
  • openelb: 之前是PorterLB, KubeSphere公司开源的, 是有中文文档的, 不过改名的过程中, 有点乱.

然后这是 OpenELB写的对比: https://github.com/kubesphere/openelb/blob/master/doc/zh/compared_with_metallb.md

最终我测试了metalLB

  • openelb的文档太乱了
  • metalLB使用ConfigMap来配置IP池, openELB使用 eip来配置IP池--方便监控
  • metaLB声明的时候无需特殊设置, openELB必须使用 annotations: lb.kubesphere.io/v1alpha1: porter

我们来看看如何安装使用metalLB, (其实步骤都很简单, 切换为openELB也很容易)

确认strictARP模式

如果你的网络是运行在IPVS模式下(默认是iptables), 那么需要设置strictARP模式:

kubectl edit configmap -n kube-system kube-proxy

修改其中的strictARP为true:

apiVersion: kubeproxy.config.k8s.io/v1alpha1kind: KubeProxyConfigurationmode: "ipvs"ipvs: strictARP: true

安装 metalLB:

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/namespace.yamlkubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/metallb.yaml

如果镜像来不下来, 就用vpn.... 我发现用k8s就必须学会用vpn或者迁移大法才行...因为好多镜像都拉不下来...也没警告!!

手工检查Pod是否启动正常, 会不会卡在拉镜像的步骤?

[root@centos1 ~]# k get pods -n metallb-systemNAME READY STATUS RESTARTS AGEcontroller-6b78bff7d9-84cvr 1/1 Running 0 16dspeaker-5n8pm 1/1 Running 0 16dspeaker-5zsbb 1/1 Running 0 16dspeaker-wc47c 1/1 Running 0 16d

如果看到metallb-system命名空间下有controller, speaker等进程已经在Running状态, 说明正常.

配置IP池

这里我们使用layer2协议, 毕竟本地测试没有BGP设备, 如果是正式用, 还是要上BGP设备的.

先找网络管理员申请预留的IP端, 配置如下:

apiVersion: v1kind: ConfigMapmetadata: namespace: metallb-system name: configdata: config: | address-pools: - name: default protocol: layer2 addresses: - 172.18.0.203-172.18.0.210

然后配置上去

kubectl apply -f metallb.ip.yaml

如果是BGP的话, 文档在这: https://metallb.universe.tf/configuration/

测试效果

现在我们来部署一个Nginx来看看

kubectl apply -f nginx.test.yaml

其中内容如下:

apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-metallb-testspec: selector: matchLabels: app: nginx-metallb-test template: metadata: labels: app: nginx-metallb-test spec: containers: - name: nginx image: nginx:1.8 ports: - name: http containerPort: 80---apiVersion: v1kind: Servicemetadata: name: nginx-servicespec: ports: - name: http port: 80 protocol: TCP targetPort: 80 selector: app: nginx-metallb-test type: LoadBalancer

上面声明的Service的类型为LoadBalancer, 无其他特殊设置.

服务创建之后, 我们来看看效果:

[root@centos1 metalLB]# kubectl get svc -o wideNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTORapple-service ClusterIP 10.98.221.159 5678/TCP 17h app=applekubernetes ClusterIP 10.96.0.1 443/TCP 23h nginx-service LoadBalancer 10.103.59.125 172.18.0.203 80:32046/TCP 3s app=nginx-metallb-test

打开浏览器, 访问 172.18.0.203 即可访问nginx.

如果是正式环境, 则使用DNS解析到此IP, 使用域名访问服务即可.

当然如果你有多个服务, 你也可以使用Nginx Ingress来通过域名和路径区分不同的服务, 那就是另外的话题了.

本文来自博客园,作者:飞云~风之谷,转载请注明原文链接:https://www.cnblogs.com/cnscud/p/15305433.html

网友评论