k8s
组件 资源清单
pod 生命周期
pod 控制器
服务发现
runcher
KubeSphere
Helm
helm命令
helm 常用内置对象
helm 内置函数
helm 的逻辑 和 流程控制
helm 中变量在作用域、列表、元祖、字典中的引用
helm 使用define定义子模版、template和include调用
helm 获取其他文件的内容和文件名
社区的Helm chart仓库
helm几个常用仓库
存储 configMap
进入k8s pod
k8s Node节点的调试
k8s 部署
sealos 部署
kubeadm 1.28部署
增加 node 节点
在aws 上自建k8s
利用NFS动态提供Kubernetes后端存储卷
rook-ceph
CephFS挂载
Ceph Dashboard
ingress
k8s集成kube-prometheus
ServiceMonitor 添加配置
Prometheus 长期远程存储方案 VictoriaMetrics
解决ControllerManager、Scheduler、watchdog监控问题
抓取配置说明
kubernetes配置imagePullSecrets秘钥来拉取镜像
在 Kubernetes 裡跑 curl 來測試內部服務
MetalLB
cloudflare-tunnel-ingress-controller
K8S kubectl 自动补全
argocd
helm部署redis-culster集群
改变默认 StorageClass
自定义指标HPA
istio
kiali
k8s接入graylog
Labels
DNS
HPA
ConfigMap挂载导致容器目录覆盖的问题
污点容忍度
身份认证与权限 RBAC
command
运行crictl ps -a 报错
etcd
cka证书
cert-manager
Kubernetes 创建普通账号
部署 metrics-server 指标
deployment 重启
Kubernetes中如何优雅的解决Pod时区问题
alertmanager
oom killed
eks挂载efs
eks创建集群
eksctl awscli kubectl
污点和容忍度
Kubernetes 删除namespace Terminating解决脚本
k8s 部署 kafka 集群
ack ingress获取客户端客户端真实IP
ingress 反向代理 ws
本文档使用 MrDoc 发布
-
+
首页
MetalLB
``` Repo: https://github.com/metallb/metallb 官网: https://metallb.universe.tf/installation ``` # 一句话描述,什么是 MetalLB MetalLB is a load-balancer implementation for bare metal Kubernetes clusters, using standard routing protocols. MetalLB 是一个用于裸机 Kubernetes 集群的负载均衡器实现,使用标准路由协议。 k8s 并没有为裸机集群实现负载均衡器,因此我们只有在以下 IaaS 平台(GCP, AWS, Azure)上才能使用 LoadBalancer 类型的 service。 因此裸机集群只能使用 NodePort 或者 externalIPs service 来对面暴露服务,然而这两种方式和 LoadBalancer service 相比都有很大的缺点。 而 MetalLB 的出现就是为了解决这个问题。 ## 网络环境 ![](/media/202309/2023-09-04_150220_4100210.9669835732267553.png) ## Layer 2 工作原理 Layer 2 中的 Speaker 工作负载是 DeamonSet 类型,在每台节点上都调度一个 Pod。首先,几个 Pod 会先进行选举,选举出 Leader。Leader 获取所有 LoadBalancer 类型的 Service,将已分配的 IP 地址绑定到当前主机到网卡上。也就是说,所有 LoadBalancer 类型的 Service 的 IP 同一时间都是绑定在同一台节点的网卡上。 当外部主机有请求要发往集群内的某个 Service,需要先确定目标主机网卡的 mac 地址(至于为什么,参考维基百科[10])。这是通过发送 ARP 请求,Leader 节点的会以其 mac 地址作为响应。外部主机会在本地 ARP 表中缓存下来,下次会直接从 ARP 表中获取。 请求到达节点后,节点再通过 kube-proxy 将请求负载均衡目标 Pod。所以说,假如Service 是多 Pod 这里有可能会再跳去另一台主机。 ![](/media/202309/2023-09-04_150317_1237710.5609346023961698.png) * 优缺点 优点很明显,实现起来简单(相对于另一种 BGP 模式下路由器要支持 BPG),只要保证 IP 地址库与集群是同一个网段即可。 当然缺点更加明显了,Leader 节点的带宽会成为瓶颈;与此同时,可用性欠佳,故障转移需要 10 秒钟的时间(每个 speaker 进程有个 10s 的循环[11])。 前面我们使用 MetalLB 的 Layer2 模式作为 LoadBalancer 的实现,将 Kubernetes 集群中的服务暴露到集群外。 还记得我们在 Configmap 中为 MetalLB 分配的 IP 地址池么? 这里分配的 192.168.1.30-192.168.1.49 IP 段正好是在笔者的家庭网络中,当我们用 192.168.1.30 可以成功访问服务。 之前有提过 Layer2 的缺点时还漏了一点,除了故障转移过程中对可用性有影响且存在单点网络瓶颈,还有就是客户端需要与地址池位于同一个子网。 虽然缺点很明显,但是 Layer2 模式有更强的通用性,不像 BGP 模式需要支持 BGP 的路由。 ## 实际部署 ### QuickStart 安装 MetalLB 很简单,不过还是有一些限制: * 1)需要 Kubernetes v1.13.0 或者更新的版本 * 2)集群中的 CNI 要能兼容 MetalLB,具体兼容性参考这里 network-addons * 像常见的 Flannel、Cilium 等都是兼容的,Calico 的话大部分情况都兼容,BGP 模式下需要额外处理 * 3)提供一下 IPv4 地址给 MetalLB 用于分配 * 一般在内网使用,提供同一网段的地址即可。 * 4)BGP 模式下需要路由器支持 BGP * 5)L2 模式下需要各个节点间 7946 端口联通 看起来限制比较多,实际上这些都比较容器满足,除了第四条。 ### 安装 MetalLB 官方提供了好几种安装方式,yaml、helm、operator 等,这里使用 yaml 方式安装。 如果 kube-proxy 使用的是 ipvs 模式,需要修改 kube-proxy 配置文件,启用严格的 ARP ``` kubectl edit configmap -n kube-system kube-proxy # 修改点如下,黄色标记 apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: "ipvs" ipvs: strictARP: true ``` 使用yaml 安装 ``` # 原生 kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-native.yaml # 启用 FRR kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-frr.yaml ``` 这里要先创建,再做下面一步,否则pod启动不了,会Error: secret "memberlist" not found错误 ``` kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)" ``` ### 配置 MetalLB 有 Layer2 模式和 BGP 模式,`任选一种模式进行配置即可` `因为 BGP 对路由器有要求,因此建议测试时使用 Layer2 模式。` ### Layer 2 模式配置 1)创建 IPAdressPool ``` cat <<EOF > IPAddressPool.yaml apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: first-pool namespace: metallb-system spec: addresses: # 可分配的 IP 地址,可以指定多个,包括 ipv4、ipv6 - 172.20.175.140-172.20.175.150 EOF kubectl apply -f IPAddressPool.yaml ``` 2)创建 L2Advertisement,并关联 IPAdressPool ``` cat <<EOF > L2Advertisement.yaml apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: example namespace: metallb-system spec: ipAddressPools: - first-pool #上一步创建的 ip 地址池,通过名字进行关联 EOF kubectl apply -f L2Advertisement.yaml ``` ### 测试 创建一个 nginx deploy 以及一个 loadbalance 类型的 svc 来测试。 使用以下命令创建 nginx deploy: ``` cat <<EOF > nginx-dp.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: docker.io/nginx:latest ports: - containerPort: 80 EOF kubectl apply -f nginx-dp.yaml ``` 使用以下命令创建 nginx-svc: ``` cat <<EOF > nginx-svc.yaml apiVersion: v1 kind: Service metadata: name: nginx2 labels: app: nginx spec: selector: app: nginx ports: - name: nginx-port protocol: TCP port: 80 targetPort: 80 type: LoadBalancer EOF kubectl apply -f nginx-svc.yaml ``` 然后查看 svc,看看是不是真的分配了 ExternalIP ``` [root@iam2 ~]# kubectl get svc nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx LoadBalancer 10.103.240.239 192.168.1.241 80:30164/TCP 5s ``` ## 参考文档 https://www.lixueduan.com/posts/cloudnative/01-metallb/#%E5%AE%89%E8%A3%85-metallb https://www.cnblogs.com/hahaha111122222/p/17222831.html
admin
2024年1月7日 22:52
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码