暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis Operator + Cilium IP Pool:轻松实现Redis集群外部访问

60



背景

上篇,我们已经用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

官方文档

  1. https://docs.cilium.io/en/stable/network/lb-ipam/
  2. https://ot-container-kit.github.io/redis-operator/

#Redis #K8s #Cilium

✪ ~本文是小编的第185篇文章,目标是累计输出 1000 篇优质内容,也始终提醒自己:保持学习、保持记录、保持分享,希望以上内容能给你带来一点帮助~


 or  


👇👇👇 


文章转载自PostgreSQL运维技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论