ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

06_在k8s集群中安装MetalLB实现LoadBalancer

06_在k8s集群中安装MetalLB实现LoadBalancer 文章目录0 背景与架构0.1 为什么需要MetalLB0.2 环境架构0.3 镜像拉取方案1 安装前准备1.1 检查kube-proxy模式1.2 确认集群状态2 安装MetalLB2.1 应用官方Manifest2.2 处理镜像拉取问题2.3 验证安装3 配置IP地址池3.1 创建IPAddressPool3.2 创建L2Advertisement3.3 验证配置4 Mac宿主机用 Safari 浏览器就行5 测试LoadBalancer Service5.1 创建svc5.2 验证EXTERNAL-IP5.3 从宿主机访问6 常见问题与解决6.1 镜像拉取失败7 总结感谢阅读0 背景与架构0.1 为什么需要MetalLB在 《02_在多个RockyLinux10虚拟机上安装k8s集群》 搭建的三节点集群中如果我们创建一个type: LoadBalancer的 Service它的EXTERNAL-IP会一直显示pending[rootrockylinux10-1 ~]# kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)AGE kiada-loadbalancer-svc LoadBalancer10.1.147.173pending80:30080/TCP,443:30443/TCP 30s原因是 Kubernetes 本身并不提供裸金属环境的负载均衡器实现它自带的 Network LB 都是调用云平台GCP、AWS、Azure的接口。如果不在受支持的 IaaS 平台上LoadBalancer 类型的 Service 就会永远处于 pending 状态。MetalLB 正是为了解决这个问题而生的——它为裸金属 Kubernetes 集群提供了 LoadBalancer 的实现使用标准路由协议来对外暴露服务。0.2 环境架构IP虚拟机名称角色说明192.168.56.101rockylinux10-1control-planek8s master 节点192.168.56.102rockylinux10-2workerk8s worker 节点192.168.56.103rockylinux10-3workerk8s worker 节点0.3 镜像拉取方案由于国内网络限制我们采用以下镜像源原始仓库替换地址用途docker.iodocker.m.daocloud.ioDaoCloud 镜像加速quay.ioquay.m.daocloud.ioDaoCloud 的 quay 镜像代理1 安装前准备1.1 检查kube-proxy模式MetalLB 的 L2 模式需要确认 kube-proxy 的运行模式。只有在IPVS 模式下才需要启用strictARP而 iptables 模式默认则不需要。执行以下命令查看当前模式kubectl get cm kube-proxy-nkube-system-oyaml|grepmode如果输出为mode: 表示使用默认的 iptables 模式无需任何额外配置直接继续安装即可。说明只有在输出为mode: ipvs时才需要执行sed -e s/strictARP: false/strictARP: true/并重启 kube-proxy。iptables 模式下 strictARP 参数不生效也不需要修改。如果输出为mode: ipvs执行以下命令启用 strict ARPkubectl get configmap kube-proxy-nkube-system-oyaml|\sed-es/strictARP: false/strictARP: true/|\kubectl apply-f--nkube-system之后重启 kube-proxy Podkubectl rollout restart daemonset kube-proxy-nkube-system1.2 确认集群状态kubectl get nodes kubectl get pods-nkube-system确保所有节点为Ready控制平面 Pod 正常运行。2 安装MetalLB2.1 应用官方ManifestMetalLB 提供了多种 Manifest对于 L2 模式使用metallb-native版本即可kubectl apply-fhttps://raw.githubusercontent.com/metallb/metallb/v0.16.1/config/manifests/metallb-native.yaml如果该地址因网络问题无法访问可以先将文件下载到本地再应用# 在可以访问外网的机器上下载curl-L-ometallb-native.yaml https://raw.githubusercontent.com/metallb/metallb/v0.16.1/config/manifests/metallb-native.yaml# 传输到 master 节点scpmetallb-native.yaml root192.168.56.101:/root/# 在 master 上应用kubectl apply-f/root/metallb-native.yaml2.2 处理镜像拉取问题安装后查看 Pod 状态kubectl get pods-nmetallb-system如果出现ImagePullBackOff执行以下命令查看使用的镜像kubectl describe pod-nmetallb-systempod-name|grep-EImage:|FailedMetalLB 的镜像通常来自quay.io/metallb/可以将quay.io替换为quay.m.daocloud.io。修改方式是在 Manifest 中全局替换镜像地址或者手动拉取并打标签。2.3 验证安装kubectl get pods-nmetallb-system期望输出NAME READY STATUS RESTARTS AGE controller-7d8f9c6b8b-xxxxx 1/1 Running 0 2m speaker-xxxxx 1/1 Running 0 2m speaker-yyyyy 1/1 Running 0 2m speaker-zzzzz 1/1 Running 0 2mcontroller是集群范围的控制器负责 IP 地址分配speaker是 DaemonSet负责通过协议L2 或 BGP让服务可达。3 配置IP地址池3.1 创建IPAddressPoolMetalLB 需要知道可以为 Service 分配哪些 IP。地址范围必须与你的 VirtualBox Host-Only 网络在同一网段且不能与节点 IP、DHCP 地址池重叠。创建文件ip-pool.yamlapiVersion:metallb.io/v1beta1kind:IPAddressPoolmetadata:name:first-poolnamespace:metallb-systemspec:addresses:-192.168.56.240-192.168.56.250应用kubectl apply-fip-pool.yaml3.2 创建L2AdvertisementL2 模式是最简单的配置方式只需将IPAddressPool与L2Advertisement关联即可创建文件l2-advertisement.yamlapiVersion:metallb.io/v1beta1kind:L2Advertisementmetadata:name:first-l2namespace:metallb-systemspec:ipAddressPools:-first-pool应用kubectl apply-fl2-advertisement.yaml3.3 验证配置kubectl get ipaddresspool-nmetallb-system kubectl get l2advertisement-nmetallb-system4 Mac宿主机用 Safari 浏览器就行如果宿主机是 mac 电脑那么直接用 safari 浏览器访问 k8s 的 service 的 ip 吧。Chrome 浏览器可能无法访问 k8s 的 svc5 测试LoadBalancer Service参照 k8s in action 这本书的第11章的11.2.2 Exposing a service through an external load balancer小节所说5.1 创建svc创建文件svc.kiada.loadbalancer.yamlapiVersion:v1kind:Servicemetadata:name:kiada-loadbalancer-svcspec:type:LoadBalancerselector:app:kiadaports:-name:httpport:80targetPort:8080nodePort:30080protocol:TCP-name:httpsport:443targetPort:8443nodePort:30443protocol:TCP应用kubectl apply-fsvc.kiada.loadbalancer.yaml5.2 验证EXTERNAL-IPkubectl get svc期望输出NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kiada-loadbalancer-svc LoadBalancer 10.1.147.173 192.168.56.240 80:30080/TCP,443:30443/TCP 9hEXTERNAL-IP从pending变为192.168.56.240说明 MetalLB 已成功分配 IP。5.3 从宿主机访问如果宿主机是 Mac 那么就在 Safari 浏览器访问http://192.168.56.240应该能看到 Kiada 的页面。Chrome 浏览器是不行的访问不了。6 常见问题与解决6.1 镜像拉取失败现象MetalLB Pod 处于ImagePullBackOff。解决将quay.io替换为quay.m.daocloud.io或手动拉取镜像并打标签sudoctr-nk8s.io images pull quay.m.daocloud.io/metallb/controller:v0.16.1sudoctr-nk8s.io images tag quay.m.daocloud.io/metallb/controller:v0.16.1 quay.io/metallb/controller:v0.16.17 总结通过本文我们完成了以下工作理解了 MetalLB 的用途为裸金属 Kubernetes 集群提供 LoadBalancer 类型的 Service 实现确认了 kube-proxy 模式iptables 模式下无需配置 strictARP安装了 MetalLB通过官方 Manifest 部署了 controller 和 speaker配置了 IP 地址池和 L2Advertisement为负载均衡 Service 提供可分配的 IP 范围测试了 LoadBalancer Service验证了EXTERNAL-IP从 pending 变为实际 IP感谢阅读
返回列表