专栏首页伪架构师Metallb - 贫苦 K8S 用户的负载均衡支持

Metallb - 贫苦 K8S 用户的负载均衡支持

简介

在私有网络上运行 Kubernetes,和御三家相比,对 LoadBalancer 类型的服务的支持应该是众多表面差异中最醒目的一个了。类型为 LoadBalancer 的服务在 Kubernetes 中并没有直接支持,NodePort 和 ExternalIP 方案让很多私有云用户成为了 K8S 世界中的二等公民。接下来介绍的 Metallb,就给私有 Kubernetes 用户带来了一个方便、可用(而且不太成熟)的软件解决方案。

该项目发布于 2017 年底,当前处于 Beta 阶段。

Metallb 会在 Kubernetes 内运行,监控服务对象的变化,一旦察觉有新的 LoadBalancer 服务运行,并且没有可申请的负载均衡器之后,就会完成两部分的工作:

地址分配

用户需要在配置中提供一个地址池,Metallb 将会在其中选取地址分配给服务。

地址广播

根据不同配置,Metallb 会以二层(ARP/NDP)或者 BGP 的方式进行地址的广播。

支持范围

不支持 IPVS

网络插件

兼容性

Calico

部分支持(有附加文档)

Flannel

支持

Kube-router

不支持(正在跟进)

Romana

支持(有附加文档)

Weave Net

支持

一个小测试

安装

Metallb 支持 Helm 和 YAML 两种安装方法,这里我们使用第二种:

kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.7.1/manifests/metallb.yaml

很简单,Metallb 就会开始安装,会生成自己的命名空间以及 RBAC 配置。

$ kubectl get pods -n metallb-system
NAME                         READY     STATUS    RESTARTS   AGE
controller-b7896bf94-g449l   1/1       Running   0          51m
speaker-mt6kd                1/1       Running   0          51m
speaker-sqbn4                1/1       Running   0          51m

配置

接下来我们要生成一个 Configmap 文件,为 Metallb 设置网址范围以及协议相关的选择和配置,这里以一个简单的二层配置为例:

apiVersion: v1
kind: ConfigMap
metadata:
 namespace: metallb-system
 name: config
data:
 config: |
   address-pools:
   - name: my-ip-space
     protocol: layer2
     addresses:
     - 10.211.55.240/28

注意:这里的 IP 地址范围需要跟集群实际情况相对应。

使用 kubectl apply 命令应用之后,使用 kubectl logs -f [metallb-controller-pod] 会看到配置更新过程。

测试

创建一个 Nginx 的服务,服务类型为 LoadBalancer

apiVersion: apps/v1beta2
kind: Deployment
metadata:
 name: nginx
spec:
 selector:
   matchLabels:
     app: nginx
 template:
   metadata:
     labels:
       app: nginx
   spec:
     containers:
     - name: nginx
       image: nginx:1
       ports:
       - name: http
         containerPort: 80---
apiVersion: v1
kind: Service
metadata:
 name: nginx
spec:
 ports:
 - name: http
   port: 80
   protocol: TCP
   targetPort: 80
 selector:
   app: nginx
 type: LoadBalancer

服务创建运行之后,可以列出服务信息:

kubectl get svc
NAME       TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)         AGE
kube-dns   ClusterIP      10.96.0.10      <none>          53/UDP,53/TCP   7d
nginx      LoadBalancer   10.96.245.212   10.211.55.240   80:32207/TCP    54m

这里就发现,LoadBalancer 类型的服务,分配到了我们地址池中的第一个 IP。

curl http://10.211.55.240 验证,就会发现返回了 Nginx 的欢迎信息。

补充

除了这里提到的一点点简单配置之外,Metallb 的配置能力还是比较强大的,这点可以参考官网,其中谈及了不少较为务实的案例,另外还提到了部分 Issue 供用户参考。

本文分享自微信公众号 - 伪架构师(fake-architect),作者:崔秀龙

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-07-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 小玩闹:给 Node Exporter 加上 Basic 认证

    前两天在成老师群里问了个无聊的问题——Node Exporter 输出的数据,是不是就应该匿名获取呢?本着 0 信任原则,缺省情况下使用 Host Networ...

    崔秀龙
  • 用 Python 脚本拉取 Docker 镜像

    好久没有介绍小工具了,今天碰到一个,简单粗糙但是有用的一个,这个工具有多简单粗糙呢?证据有二:

    崔秀龙
  • 使用 Kyverno 定义 Kubernetes 策略

    Kubernetes 的日常使用过程中,在对象提交给集群之前,我们会有很多机会,很多方法对资源的 Yaml 定义进行检查和处理。很多读者应该也会知道,资源提交之...

    崔秀龙
  • 使用 Vanilla JavaScript 框架创建一个简单的天气应用

    大家好,不知道大家听说过 Vanilla JavaScript 这款 框架吗?最近我在浏览国外的一些技术网站时,这个词出现的频率实在是在太高了,好多框架都宣称自...

    前端达人
  • 使用 Vanilla JavaScript 框架创建一个简单的天气应用

    大家好,不知道大家听说过 Vanilla JavaScript 这款框架吗?最近我在浏览国外的一些技术网站时,这个词出现的频率实在是太高了,好多框架都宣称自己是...

    前端达人
  • 3天破9亿!上万条评论解读《西虹市首富》是否值得一看

    作者介绍:徐麟,目前就职于上海唯品会产品技术中心,哥大统计数据狗,从事数据挖掘&分析工作,喜欢用R&Python玩一些不一样的数据

    Python技术与生活认知的分享
  • [原创]Google SEO教程之Google Indexing API第一时间抓取新页面

    1 Google SEO教程之Google Indexing API第一时间抓取新页面

    极客中心
  • (63) 实用序列化: JSON/XML/MessagePack / 计算机程序的思维逻辑

    上节,我们介绍了Java中的标准序列化机制,我们提到,它有一些重要的限制,最重要的是不能跨语言,实践中经常使用一些替代方案,比如XML/JSON/Message...

    swiftma
  • 香港中文大学多媒体实验室 | 开源视频目标检测&跟踪平台(附源码下载)

    MMDetection V1.0版本发布以来,就获得很多用户的喜欢,发布以来,其中有不少有价值的建议,同时也有很多开发者贡献代码,在2020年5月6日,发布了M...

    计算机视觉研究院
  • sass学习入门篇(三)

    这章我们讲“嵌套”,嵌套包括两种:一,选择器嵌套。二是属性的嵌套。一般用选择器嵌套居多

    用户3055976

扫码关注云+社区

领取腾讯云代金券