
背景
接上篇,我们已经用OT-CONTAINER-KIT/redis-operator部署了一个单节点的Redis,operator默认为这个实例创建了如图所示的三个svc,但是它们的ServiceType均是ClusterIP, 只能在集群内部访问,不能在集群外部访问。

今天我们利用Cilium的CiliumLoadBalancerIPPool来给Redis服务分配外部IP。
Cilium CiliumLoadBalancerIPPool是什么
CiliumLoadBalancerIPPool 是 Cilium CNI 提供的一种自定义资源(CRD), 可以用来管理一段IP地址池,并将这些IP分配K8s中的LoadBalancer类型Service。
核心功能:
自动分配外部IP: 从预定义的IP池中为Servcie分配IP,无需手动指定。 精细控制:通过标签选择器限制哪些Service可以使用该IP池。 支持BGP公告:可与企业级网络设备(路由器)集成,实现IP路由自动化。
为Redis服务配置EXTERNAL-IP
1. 创建Cilium IP Pool
apiVersion: "cilium.io/v2alpha1"# 使用的 Cilium API 版本
kind:CiliumLoadBalancerIPPool # 资源类型:负载均衡 IP 池
metadata:
name:"lb-pool" # IP 池名称(集群内唯一标识)
spec:
blocks:
-cidr:"10.xx.xx.xx/xx" # 可用 IP 范围(需替换为实际 CIDR)
serviceSelector: # 服务选择器(限制哪些 Service 能使用此池)
matchLabels:
role:lb-service # 仅匹配带有 `role: lb-service` 标签的 Service
2. 修改Redis Servcie
由于 Operator 默认创建的是 ClusterIP
,我们首先需要将首先将Service Type改为LoadBalancer,同时为SVC添加匹配CiliumLoadBalancerIPPool的标签。
方法一:直接修改现有的Service
kubectl patch svc <your-service-name> -p '{"spec": {"type": "LoadBalancer"}}'
kubectl patch svc <your-service-name> -p '{"metadata":{"labels":{"role":"lb-service"}}}'
方法二:创建新的LoadBalancer Service(推荐)
Operator 默认创建的 ClusterIP Service 会被持续管理,如果直接修改 Type 或 Label,Operator 可能会覆盖。推荐创建新的 LoadBalancer Service,并通过标签匹配 CiliumLoadBalancerIPPool。
apiVersion: v1
kind:Service
metadata:
name:redis-lb# Service名称
namespace:redis-operator-system
labels:
app:redis-standalone
role:lb-service # 匹配现有 lb-pool
spec:
selector:
app:redis-standalone
redis_setup_type:standalone
role:standalone # 指向 Redis Pod 的真实标签
ports:
-protocol:TCP
port:6379
targetPort:6379
type:LoadBalancer
创建新的Service
kubectl apply -f redis-lb-service.yaml
3. 验证IP分配
检查Service是否获得Extenal-IP;
kubectl get svc <your-service-name> -w
稍等片刻,输出应类似:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
redis-lb LoadBalancer 192.168.4.218 10.xxx.xxx.xxx 6379:30087/TCP 3h18m
网络连通性测试:
# 从集群外部测试端口连通性
nc -zv 10.xxx.xxx.xxx 6379
使用redis-cli测试地址是否能正常访问:
redis-cli -h 10.xxx.xxx.xx -p 6379
4. 其他
如果使用BGP,需要确保正确配置了BGP对等体,适用于企业级网络架构。
常见问题排查
Service未分配到IP(或External-IP为pending状态)*
可能原因:
Service 的 Label 未正确匹配 serviceSelector
。IP 池 CIDR 已耗尽。 Cilium 未正确运行或配置。 检查步骤:
# 确认 Label 已添加
kubectl get svc <your-service-name> --show-labels
# 检查 Cilium 日志
kubectl -n kube-system logs -l k8s-app=cilium | grep -i lb
# 查看 IP 池状态
kubectl get ciliumloadbalancerippool lb-pool -o yaml
官方文档
https://docs.cilium.io/en/stable/network/lb-ipam/ https://ot-container-kit.github.io/redis-operator/
✪ ~本文是小编的第185篇文章,目标是累计输出 1000 篇优质内容,也始终提醒自己:保持学习、保持记录、保持分享,希望以上内容能给你带来一点帮助~

点个“赞 or 在看” 你最好看!
👇👇👇 谢谢各位老板啦!




