当前位置: 代码网 > it编程>编程语言>Java > 云原生内容分享(二十四):云原生 EgressGateway,适用于 Calico,Flannel 和 Spiderpool 等 CNI 的出口网关

云原生内容分享(二十四):云原生 EgressGateway,适用于 Calico,Flannel 和 Spiderpool 等 CNI 的出口网关

2024年07月31日 Java 我要评论
左侧节点被 EgressPolicy 策略命中的 Pod 流量,会通过 iptabels, route, ipset 规则并通过 vxlan 转发到网关节点,然后从网关节点将源 IP 转为 Egress IP 离开集群。稍后可以通过创建 EgressPolicy CR 来选择可使用的 EgressGateway,并通过 label 匹配业务 Pod,使业务流量通过网关节点离开集群。如下图集群 B 中的 Pod 为一组应用,管理员希望右侧同一业务组的 Pod 出集群的流量都使用特定 IP。

01 当前痛点

在多个集群互相访问,企业管理员希望规范化跨集群网络请求。如下图集群 b 中的 pod 为一组应用,管理员希望右侧同一业务组的 pod 出集群的流量都使用特定 ip。

图片

02 egressgateway 解决方式

针对上述的需求,我们使用 egressgateway[1] 来解决这个问题。egressgateway 是一个开源的云原生出口网关,兼容如下 calico[2],flannel[3],weave[4] 和 spiderpool[5] 的 cni 网络方案。egressgateway 有如下特性:

  • 支持通过 egresspolicy 配置不通租户的的 egress 策略;

  • 支持通过 egressclusterpolicy 集群级 egress 策略;

  • 支持 ipv4/ipv6 双栈;

  • 拥有低内核兼容性;

  • 自动检测集群内部流量;

  • 支持设置租户/集群默认 egressgateway。

如果你想了解更多详情,请访问 egressgateway 文档站[6]

图片

03 实现原理

在数据面,我们通过实施了如下 datapath 来实现 egressgateway 的功能。左侧节点被 egresspolicy 策略命中的 pod 流量,会通过 iptabels, route, ipset 规则并通过 vxlan 转发到网关节点,然后从网关节点将源 ip 转为 egress ip 离开集群。

图片

04 安装实施

1. 将 calico 的 felix_chaininsertmode 设置为 append

   kubectl set env daemonset -n kube-system calico-node felix_chaininsertmode=append

2. 安装 egressgateway

   helm repo add egressgateway https://spidernet-io.github.io/egressgateway/
   helm repo update
   
   helm install egressgateway egressgateway/egressgateway \
        -n kube-system \
        --set feature.tunnelipv4subnet="192.200.0.1/16" \ # 选择一个没有被使用的虚拟子网
        --wait --debug

3. 验证 egressgateway 都已经启动并就绪。

   $ kubectl get pod -n kube-system | grep egressgateway
   egressgateway-agent-29lt5                  1/1     running   0          9h
   egressgateway-agent-94n8k                  1/1     running   0          9h
   egressgateway-agent-klkhf                  1/1     running   0          9h
   egressgateway-controller-5754f6658-7pn4z   1/1     running   0          9h

4. 选择一个或者多个节点作为出口网关,通过给 node 打上特点的 label 来标识这些节点。

   kubectl get node -o wide
   kubectl label node $node_name egressgateway="true"

5. 创建 egressgateway 实例。创建 egressgateway 时,需要在 spec.nodeselector 中将指定网关节点为上面打 label 的节点,并为这些网关分配可用的 spec.ippools 的地址。

   cat <<eof | kubectl apply -f -
   apiversion: egressgateway.spidernet.io/v1beta1
   kind: egressgateway
   metadata:
     name: default
   spec:
     ippools:
       ipv4:
       - "172.22.0.100-172.22.0.110"
     nodeselector:
       selector:
         matchlabels:
           egressgateway: "true"
   eof

6. 执行下面命令检查刚才创建的网关,此时可以在 status 中看到已经选择的 2 个节点已经就绪。稍后可以通过创建 egresspolicy cr 来选择可使用的 egressgateway,并通过 label 匹配业务 pod,使业务流量通过网关节点离开集群。

   $ kubectl get egressgateway default -o yaml
   apiversion: egressgateway.spidernet.io/v1beta1
   kind: egressgateway
   metadata:
     name: default
     uid: 7ce835e2-2075-4d26-ba63-eacd841aadfe
   spec:
     ippools:
       ipv4:
       - 172.22.0.100-172.22.0.110
       ipv4defaulteip: 172.22.0.110
     nodeselector:
       selector:
         matchlabels:
           egressgateway: "true"
   status:
     nodelist:
     - name: egressgateway-worker1
       status: ready
     - name: egressgateway-worker2
       status: ready

7. 在开始之前先在集群外的任意机器,启动一个容器模拟被访问的外部服务

   docker run -d --net=host ghcr.io/spidernet-io/egressgateway-nettools:latest /usr/bin/nettools-server -protocol web -webport 8080

8. 在集群内部创建一个 deployment,用于模拟需要访问外部使用统一 egress ip 的业务应用。

   kubectl create deployment visitor --image nginx

9. 此时创建一个 egresspolicy,来为其实施 egress 策略。这里是通过 spec.egressgatewayname 制定了上面创建的 egressgateway 名称。

   cat <<eof | kubectl apply -f -
   apiversion: egressgateway.spidernet.io/v1beta1
   kind: egresspolicy
   metadata:
    name: test
    namespace: default
   spec:
    egressgatewayname: default
    appliedto:
     podselector:
      matchlabels:
       app: "visitor"
   eof

10. 通过 kubectl exec 进入创建的业务应用,执行测试

    kubectl exec -it visitor-6764bb48cc-29vq9 bash
    $ curl 10.6.1.92:8080
    remote ip: 172.22.0.110
    ```

通过结果看到,egress ip 已经变为了 egressgateway 池中配置的 ip。当然也可以在创建 egresspolicy 指定使用的 egress ip。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com