查看原文
其他

SpiderPool:Calico 固定应用 IP 的一种新选择

郭奇峰 道客船长 2023-04-11



Calico 是一套开源的网络和网络安全解决方案,也是作为 Kubernetes 容器网络解决方案 (CNI: Container Network Interface) 的一种实现。它基于 Linux 纯三层路由实现,在一些场景下用户可以将 Pod 子网的路由通过 Calico BGP 模式宣告到网关,来自集群外的客户端可以直接通过 Pod 的 IP 访问 Pod,同时还可以保留客户端的源 IP。

01

当前痛点

在 Calico Underlay 网络模式下,用户还希望 Deployment 或 StatefulSet 类型应用的 IP 地址,能够被固定或是在一个指定的 IP 范围中浮动,因为:

  • Pod 的 IP 地址常常受防火墙策略管控,防火墙只会允许特定的 IP 或者 IP 范围内的目标访问;

  • 传统微服务应用直接使用 Pod IP 进行微服务注册;

  • 一些场景下业务 IP 为固定的 IP,不会变化。

Calico 通过在 Pod 中注入注解: cni.projectcalico.org/ipAddrs 可以实现 Pod 级别的 IP 固定,但是在使用中我们发现以下不足:

  • 固定 IP 只在 Pod 级别生效,对 Deployment、StatefulSet 类型无能为力;

  • 需要管理员保证 Pod 的注解 IP 是不重叠的,避免出现 IP冲突。尤其是在大规模集群下,难以排查冲突的 IP;

  • 固定 IP 地址的配置、管理繁琐,不具有云原生化。

02

解决方式:
SpriderPool

针对上述不足,我们尝试通过 SpiderPool 来实现这点需求。SpiderPool 是一个 Kubernetes 的 IPAM 插件项目,其主要针对于 Underlay 网络的 IP 地址管理需求而设计,能够为任何兼容第三方 IPAM 插件的 CNI 项目所使用。它主要具有以下几个特点:

  • 能为 Deployment、StatefulSet 类型自动化分配固定 IP 地址,并且做到 IP 地址数量随副本数量自动扩缩容;

  • 以 CRD 方式管理、配置 IP 池,极大减少运维成本;

  • 支持第三方控制器创建的 Pod;

  • 支持为 Pod 多网卡指定不同子网。

下面将对 SpiderPool 进行展开介绍

SpiderPool:https://github.com/spidernet-io/spiderpool

安装 SpiderPool

以下是笔者参考 SpiderPool 官方文档: https://spidernet-io.github.io/spiderpool/usage/get-started-calico/#configure-calico-bgp-optional 搭建了一套 Calico BGP 模式搭配 SpiderPool 的环境, 网络环境拓扑图如下:
根据自身环境创建 SpiderSubnet 实例: nginx-subnet-v4,体验 SpiderPool 固定 IP 等功能。
[root@master ~]# kubectl get ss NAME VERSION SUBNET ALLOCATED-IP-COUNT TOTAL-IP-COUNT nginx-subnet-v4   4         10.244.0.0/16   0                    25602

自动为应用固定 IP 池

该功能支持从 SpiderSubnet(10.244.0.0/16) 子网中自动创建 IP 池,并绑定到应用 Pod。并且支持 Pod IP 固定、IP 池数量随副本数量自动扩缩容等功能。

使用 SpiderPool 自动池功能, 创建两个副本的 Nginx Deployment 应用:

  cat <<EOF | kubectl create -f - apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: annotations: ipam.spidernet.io/subnet: '{"ipv4":["nginx-subnet-v4"]}' ipam.spidernet.io/ippool-ip-number: '+3' labels: app: nginx spec: containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80            protocol: TCP

ipam.spidernet.io/subnet: SpiderPool 从 "nginx-subnet-v4" 子网中随机选择一些 IP 来创建固定 IP 池,并与应用绑定

ipam.spidernet.io/ippool-ip-number: '+3' 表示 IP 池的 IP 总量为比副本数多三个,解决应用滚动发布时有临时 IP 可用

当应用 Deployment 被创建,SpiderPool 中自动创建了一个名为 auto-nginx-v4-eth0-452e737e5e12 的 IP 池,并与应用绑定。IP 范围为: 10.244.100.90-10.244.100.95,池 IP 数量为 5:

 [root@master1 ~]# kubectl get po -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-644659db67-6lsmm 1/1 Running 0 12s 10.244.100.93 worker5 <none> <none> nginx-644659db67-n7ttd 1/1 Running 0 12s 10.244.100.91 master1 <none> <none>
[root@master1 ~]# kubectl get sp NAME VERSION SUBNET ALLOCATED-IP-COUNT TOTAL-IP-COUNT DEFAULT DISABLE auto-nginx-v4-eth0-452e737e5e12 4 10.244.0.0/16 2 5 false false
[root@master ~]# kubectl get sp auto-nginx-v4-eth0-452e737e5e12 -o jsonpath='{.spec.ips}'  ["10.244.100.90-10.244.100.95"]

Pod 的 IP 被固定在自动池: auto-nginx-v4-eth0-452e737e5e12(10.244.100.90-10.244.100.95) 中范围内,重启 Pod 其 IP 也被固定在此范围内:

 [root@master1 ~]# kubectl get po -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-644659db67-szgcg 1/1 Running 0 23s 10.244.100.90 worker5 <none> <none> nginx-644659db67-98rcg   1/1     Running       0          23s     10.244.100.92    master1   <none>           <none>

扩容副本,新副本的 IP 地址从自动池: auto-nginx-v4-eth0-452e737e5e12(10.244.100.90-10.244.100.95) 中自动分配,并且 IP 池随副本数量自动扩容:

 [root@master1 ~]# kubectl scale deploy nginx --replicas 3  # scale pods deployment.apps/nginx scaled
[root@master1 ~]# kubectl get po -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-644659db67-szgcg 1/1 Running 0 1m 10.244.100.90 worker5 <none> <none> nginx-644659db67-98rcg 1/1 Running 0 1m 10.244.100.92 master1 <none> <none> nginx-644659db67-brqdg 1/1 Running 0 10s 10.244.100.94 master1 <none> <none>
[root@master1 ~]# kubectl get sp NAME VERSION SUBNET ALLOCATED-IP-COUNT TOTAL-IP-COUNT DEFAULT DISABLE auto-nginx-v4-eth0-452e737e5e12   4         10.244.0.0/16   3                    6                false     false

手动指定 IP 池

在某些场景下,用户希望直接应用 IP 从一个固定的 IP 范围中分配,而不是由 SpiderPool 随机分配,下面是将展示此功能:

创建 IP 池:

 cat << EOF | kubectl apply -f - apiVersion: spiderpool.spidernet.io/v2beta1 kind: SpiderIPPool metadata: name: nginx-v4-ippool spec: ipVersion: 4 subnet: 10.244.0.0/16 ips:   - 10.244.120.10-10.244.120.20

spec.subnet 表示该 IP 池属于哪一个子网

spec.ips 固定 IP 地址范围,范围为 10.244.120.10-10.244.120.20,共计 10 个 IP

通过注解 ipam.spidernet.io/ippool 手动指定 IP 池:nginx-v4-ippool,创建应用:nginx-m:

  cat <<EOF | kubectl create -f - apiVersion: apps/v1 kind: Deployment metadata: name: nginx-m spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: annotations: ipam.spidernet.io/ippool: '{"ipv4":["nginx-v4-ippool"]}' labels: app: nginx spec: containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80            protocol: TCP

SpiderPool 从 nginx-v4-ippool 池中分配两个 IP 并绑定到应用。Pod 无论重启或是扩容,仍然从该池中分配 IP ,达到固定 IP 的效果:

[root@master1 ~]# kubectl get po -o wide | grep nginx-m NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-m-7c879df6bc-26dcq 1/1 Running 0 23s 10.244.120.12 worker5 <none> <none> nginx-m-7c879df6bc-nwdtp 1/1 Running 0 23s 10.244.120.14 master1 <none> <none>
[root@master1 ~]# kubectl get sp NAME VERSION SUBNET ALLOCATED-IP-COUNT TOTAL-IP-COUNT DEFAULT DISABLE auto-nginx-v4-eth0-452e737e5e12 4 10.244.0.0/16 3 6 false false nginx-v4-ippool                   4         10.244.0.0/16   2                    11               false     false

结论

经过测试: 集群外客户端可直接通过 Nginx Pod 的 IP 正常访问,集群内部通讯 Nginx Pod 跨节点也都通信正常 (包括跨 Calico 子网)。在 Calico underlay 场景下,我们可借助 SpiderPool 轻松帮助我们实现 Deployment 等类型应用固定 IP 的需求,这也为该场景下提供了一个新的选择。

更多 SpiderPool 功能介绍参考官方文档: https://github.com/spidernet-io/spiderpool/blob/main/docs/usage/


SpiderPool 官方社区:

https://github.com/spidernet-io/spiderpool


扫码添加微信,备注【SpiderPool】
加入技术讨论群


参考链接:

[1] https://spidernet-io.github.io/spiderpool

[2] https://docs.tigera.io/calico/3.25/networking/configuring/bgp

[3] https://docs.frrouting.org/en/latest/bgp.html





 本文作者 



郭奇峰
现任「DaoCloud 道客」云原生开发工程师





热门推荐

            

访问以下网址,或点击文末【阅读原文】直接下载

新一代云原生操作系统底座--DCE 5.0 社区版:https://docs.daocloud.io/download/dce5/
任何组织、机构和个人,都能免费体验企业级云原生性能




DaoCloud 公司简介

「DaoCloud 道客」云原生领域的创新领导者,成立于 2014 年底,拥有自主知识产权的核心技术,致力于打造开放的云操作系统为企业数字化转型赋能。产品能力覆盖云原生应用的开发、交付、运维全生命周期,并提供公有云、私有云和混合云等多种交付方式。成立迄今,公司已在金融科技、先进制造、智能汽车、零售网点、城市大脑等多个领域深耕,标杆客户包括交通银行、浦发银行、上汽集团、东风汽车、海尔集团、屈臣氏、金拱门(麦当劳)等。目前,公司已完成了 D 轮超亿元融资,被誉为科技领域准独角兽企业。公司在北京、南京、武汉、深圳、成都设立多家分公司及合资公司,总员工人数超过 350 人,是上海市高新技术企业、上海市“科技小巨人”企业和上海市“专精特新”企业,并入选了科创板培育企业名单。


网址:www.daocloud.io

邮件:info@daocloud.io

电话:400 002 6898



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存