k8s Metallb簡單入門示例
简介
在私有网络上运行 Kubernetes,和御三家相比,对 LoadBalancer
类型的服务的支持应该是众多表面差异中最醒目的一个了。类型为 LoadBalancer
的服务在 Kubernetes 中并没有直接支持,NodePort 和 ExternalIP 方案让很多私有云用户成为了 K8S 世界中的二等公民。接下来介绍的 Metallb,就给私有 Kubernetes 用户带来了一个方便、可用(而且不太成熟)的软件解决方案。MetalLB, bare metal load-balancer for 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 供用户参考。
https://blog.fleeto.us/post/intro-metallb/https://blog.fleeto.us/post/intro-metallb/
相关文章
- OpenKruise v0.8.0 版本发布:K8s 社区首个规模化镜像预热能力
- 从零开始入门 K8s | 可观测性:你的应用健康吗?
- 整理k8s————k8s概念[一]
- k8s部署canal cni插件及配置网络策略
- java操作k8s api示例:通过java完成对kubenetes原生资源对象(pod、node、namespace、servcie、deployment)和自定义资源对象CRD的增删改查或事件监听
- K8S pod亲和性和反亲和性示例:硬策略和软策略及其比较
- k8s节点亲和性示例:硬策略--不调度到某个集群节点
- k8s operator开发:kubebuilder入门项目命令整理
- 【完整示例】采用jenkins pipeline实现自动构建并部署至k8s
- k8s 集群安全机制:rbac实现鉴权示例
- k8s部署oracle-ee-11g:部署、集群内外连接oracle的方式
- k8s pvc + pv + nfs使用示例
- k8s部署daemonset代码示例:每个节点都会运行的守护进程
- 【网址收藏】k8s zookeeper-operator示例
- k8s控制器:Job和CronJob
- k8s示例:RS和Deployment
- k8s资源清单:常用字段说明及pod增删查示例
- 使用K8S Statefulset控制器部署Etcd数据库集群(四十九)
- k8s-网络概念和etcd优化
- k8s node上查看节点
- k8s集群外go客户端示例
- k8s 1.15.2 部署
- 【云原生】K8s pod优雅退出(postStart、terminationGracePeriodSeconds、preStop)
- k8s学习之路 | k8s 工作负载 Job