<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: opmlee</title>
    <description>The latest articles on Forem by opmlee (@opmlee).</description>
    <link>https://forem.com/opmlee</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1222602%2F626604ea-0e73-4e1a-8dd5-3f97df24eedd.png</url>
      <title>Forem: opmlee</title>
      <link>https://forem.com/opmlee</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/opmlee"/>
    <language>en</language>
    <item>
      <title>云原生 EgressGateway：适用于 Calico，Flannel，Weave 和 Spiderpool 等 CNI 的出口网关</title>
      <dc:creator>opmlee</dc:creator>
      <pubDate>Fri, 29 Dec 2023 10:14:05 +0000</pubDate>
      <link>https://forem.com/opmlee/yun-yuan-sheng-egressgatewaygua-yong-yu-calicoflannelweave-he-spiderpool-deng-cni-de-chu-kou-wang-guan-3npg</link>
      <guid>https://forem.com/opmlee/yun-yuan-sheng-egressgatewaygua-yong-yu-calicoflannelweave-he-spiderpool-deng-cni-de-chu-kou-wang-guan-3npg</guid>
      <description>&lt;p&gt;Calico 是一套开源的网络和网络安全解决方案，也是作为 Kubernetes 容器网络解决方案 (CNI: Container Network Interface) 的一种实现。&lt;/p&gt;

&lt;h2&gt;
  
  
  当前痛点
&lt;/h2&gt;

&lt;p&gt;在多个集群互相访问，企业管理员希望规范化跨集群网络请求。如下图集群 B 中的 Pod 为一组应用，管理员希望右侧同一业务组的 Pod 出集群的流量都使用特定 IP。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--D8CJsz7t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://lh7-us.googleusercontent.com/p6UxrvG7KbXzPjvkHBcFH8JshrH4UEdVumAwYQrauGqRMIWrPIl0Ms8aIuzkduP45eqxfYfPzxN_ad_eCoH3ROfUqOLVagt6xwwQVtQApl01argjrB3ogKc9ujXs4wJbc2Mtzv2XCpPb8xGeYl94NzDiqg%3Ds2048" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--D8CJsz7t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://lh7-us.googleusercontent.com/p6UxrvG7KbXzPjvkHBcFH8JshrH4UEdVumAwYQrauGqRMIWrPIl0Ms8aIuzkduP45eqxfYfPzxN_ad_eCoH3ROfUqOLVagt6xwwQVtQApl01argjrB3ogKc9ujXs4wJbc2Mtzv2XCpPb8xGeYl94NzDiqg%3Ds2048" alt="img" width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  EgressGateway 解决方式
&lt;/h2&gt;

&lt;p&gt;👋 针对上述的需求，我们使用 &lt;a href="https://github.com/spidernet-io/egressgateway"&gt;https://github.com/spidernet-io/egressgateway&lt;/a&gt; 来解决这个问题。EgressGateway 是一个开源的云原生出口网关，兼容如下 &lt;a href="https://github.com/projectcalico/calico"&gt;Calico&lt;/a&gt;，&lt;a href="https://github.com/flannel-io/flannel"&gt;Flannel&lt;/a&gt;，&lt;a href="https://github.com/weaveworks/weave"&gt;Weave&lt;/a&gt; 和 &lt;a href="https://github.com/spidernet-io/spiderpool"&gt;Spiderpool&lt;/a&gt; 的 CNI 网络方案。EgressGateway 有如下特性：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;支持通过 &lt;code&gt;EgressPolicy&lt;/code&gt; 配置不通租户的的 Egress 策略&lt;/li&gt;
&lt;li&gt;支持通过 &lt;code&gt;EgressClusterPolicy&lt;/code&gt; 集群级 Egress 策略；&lt;/li&gt;
&lt;li&gt;支持 IPv4/IPv6 双栈；&lt;/li&gt;
&lt;li&gt;拥有低内核兼容性；&lt;/li&gt;
&lt;li&gt;自动检测集群内部流量；&lt;/li&gt;
&lt;li&gt;支持设置租户/集群默认 EgressGateway。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果你想了解更多详情，请访问 EgressGateway &lt;a href="https://spidernet-io.github.io/egressgateway/dev/"&gt;https://spidernet-io.github.io/egressgateway/dev/&lt;/a&gt; 文档站。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--x6DuR21J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://lh7-us.googleusercontent.com/ynkH_Fy1VURx9puFnQ5OZ4ZbgNhbgRDKjY2Divknk5BUkbfq5NuqPWRD_awtRiGDykPIyarZxoeAidF7LgPuR9QZirt9cHTLkZ_irgYKwQWji_8r_wGbmbKmtqocQcPugqjux8-6m6KxLO4DaWc9-vchMA%3Ds2048" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--x6DuR21J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://lh7-us.googleusercontent.com/ynkH_Fy1VURx9puFnQ5OZ4ZbgNhbgRDKjY2Divknk5BUkbfq5NuqPWRD_awtRiGDykPIyarZxoeAidF7LgPuR9QZirt9cHTLkZ_irgYKwQWji_8r_wGbmbKmtqocQcPugqjux8-6m6KxLO4DaWc9-vchMA%3Ds2048" alt="img" width="800" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  实现原理
&lt;/h3&gt;

&lt;p&gt;在数据面，我们通过实施了如下 datapath 来实现 EgressGateway 的功能。左侧节点被 EgressPolicy 策略命中的 Pod 流量，会通过 iptabels, route, ipset 规则并通过 vxlan 转发到网关节点，然后从网关节点将源 IP 转为 Egress IP 离开集群。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wJiE80Bl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/spidernet-io/egressgateway/blob/main/docs/proposal/01-egress-gateway/Egress-Gateway-Datapath.png%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wJiE80Bl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/spidernet-io/egressgateway/blob/main/docs/proposal/01-egress-gateway/Egress-Gateway-Datapath.png%3Fraw%3Dtrue" alt="Egress-Gateway-Datapath.png" width="800" height="302"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  安装实施
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;将 Calico 的的 &lt;code&gt;FELIX_CHAININSERTMODE&lt;/code&gt; 设置为 &lt;code&gt;Append&lt;/code&gt;。
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   kubectl &lt;span class="nb"&gt;set env &lt;/span&gt;daemonset &lt;span class="nt"&gt;-n&lt;/span&gt; kube-system calico-node &lt;span class="nv"&gt;FELIX_CHAININSERTMODE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Append
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;安装 EgressGateway。
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   helm repo add egressgateway https://spidernet-io.github.io/egressgateway/
   helm repo update

   helm &lt;span class="nb"&gt;install &lt;/span&gt;egressgateway egressgateway/egressgateway &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-n&lt;/span&gt; kube-system &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;--set&lt;/span&gt; feature.tunnelIpv4Subnet&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"192.200.0.1/16"&lt;/span&gt; &lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="c"&gt;# 选择一个没有被使用的虚拟子网&lt;/span&gt;
        &lt;span class="nt"&gt;--wait&lt;/span&gt; &lt;span class="nt"&gt;--debug&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;验证 EgressGateway 都已经启动并就绪。
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get pod &lt;span class="nt"&gt;-n&lt;/span&gt; kube-system | &lt;span class="nb"&gt;grep &lt;/span&gt;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
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;选择一个或者多个节点作为出口网关。我们通过给 node 打上特点的 label 来标识这些节点。
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   kubectl get node &lt;span class="nt"&gt;-o&lt;/span&gt; wide
   kubectl label node &lt;span class="nv"&gt;$NODE_NAME&lt;/span&gt; &lt;span class="nv"&gt;egressgateway&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"true"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;创建 EgressGateway 实例。在创建 EgressGateway 时，我们在 &lt;code&gt;spec.nodeSelector&lt;/code&gt; 中将指定网关节点为上面打 label 的节点，并为这些网关分配了可用的 &lt;code&gt;spec.ippools&lt;/code&gt; 的地址。
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; | 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"
&lt;/span&gt;&lt;span class="no"&gt;   EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;执行下面命令检查刚才创建的网关，我们可以在 &lt;code&gt;status&lt;/code&gt; 中看到已经选择的 2 个节点已经就绪。稍后我们可以通过创建 &lt;code&gt;EgressPolicy&lt;/code&gt; CR 来选择可使用的 EgressGateway，并通过 label 匹配业务 Pod，使业务流量通过网关节点离开集群。
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;   &lt;span class="s"&gt;$ kubectl get EgressGateway default -o yaml&lt;/span&gt;
   &lt;span class="s"&gt;apiVersion&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;egressgateway.spidernet.io/v1beta1&lt;/span&gt;
   &lt;span class="s"&gt;kind&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;EgressGateway&lt;/span&gt;
   &lt;span class="s"&gt;metadata&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
     &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
     &lt;span class="na"&gt;uid&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;7ce835e2-2075-4d26-ba63-eacd841aadfe&lt;/span&gt;
   &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
     &lt;span class="na"&gt;ippools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
       &lt;span class="na"&gt;ipv4&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
       &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;172.22.0.100-172.22.0.110&lt;/span&gt;
       &lt;span class="na"&gt;ipv4DefaultEIP&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;172.22.0.110&lt;/span&gt;
     &lt;span class="na"&gt;nodeSelector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
       &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
         &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
           &lt;span class="na"&gt;egressgateway&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;true"&lt;/span&gt;
   &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
     &lt;span class="na"&gt;nodeList&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
     &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;egressgateway-worker1&lt;/span&gt;
       &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Ready&lt;/span&gt;
     &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;egressgateway-worker2&lt;/span&gt;
       &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Ready&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;在开始之前我们先在集群外的任意机器，启动一个容器模拟被访问的外部服务。
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host ghcr.io/spidernet-io/egressgateway-nettools:latest /usr/bin/nettools-server &lt;span class="nt"&gt;-protocol&lt;/span&gt; web &lt;span class="nt"&gt;-webPort&lt;/span&gt; 8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;我们在集群内部创建一个 Deployment，用于模拟需要访问外部使用统一 Egress IP 的业务应用。
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   kubectl create deployment visitor &lt;span class="nt"&gt;--image&lt;/span&gt; nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;此时我们创建一个 EgressPolicy，来为其实施 Egress 策略。我们通过 &lt;code&gt;spec.egressGatewayName&lt;/code&gt; 制定了上面创建的 EgressGateway 名称。
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; | kubectl apply -f -
   apiVersion: egressgateway.spidernet.io/v1beta1
   kind: EgressPolicy
   metadata:
    name: test
    namespace: default
   spec:
    egressGatewayName: default
    appliedTo:
     podSelector:
      matchLabels:
       app: "visitor"
&lt;/span&gt;&lt;span class="no"&gt;   EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;通过 kubectl exec 进我们创建的业务应用，执行测试。&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; visitor-6764bb48cc-29vq9 bash
&lt;span class="nv"&gt;$ &lt;/span&gt;curl 10.6.1.92:8080
Remote IP: 172.22.0.110
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;🎉 通过结果看到，我们的 Egress IP 已经变为了 EgressGateway 池中配置的 IP。当然也可以在创建 EgressPolicy 指定使用的 Egress IP。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  总结
&lt;/h2&gt;

&lt;p&gt;在本文中我们分析了 Calico 网络下的 Egress IP 网络需求，并通过 EgressGateway 来解决这个问题，同时对 EgressGateway 的网络原理做了阐述，最后我们介绍了 EgressGateway 的更多功能。&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>egress</category>
      <category>ingress</category>
      <category>k8s</category>
    </item>
    <item>
      <title>Kubernetes Egress Gateway</title>
      <dc:creator>opmlee</dc:creator>
      <pubDate>Thu, 30 Nov 2023 09:35:24 +0000</pubDate>
      <link>https://forem.com/opmlee/kubernetes-egress-gateway-47ga</link>
      <guid>https://forem.com/opmlee/kubernetes-egress-gateway-47ga</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffgxzowgn0fnd1izh116m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffgxzowgn0fnd1izh116m.png" alt="Kubernetes Egress Gateway"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Starting with 2021, we received some feedback as follows.&lt;/p&gt;

&lt;p&gt;There are two clusters A and B. Cluster A is VMWare-based and runs mainly Database workloads, and Cluster B is a Kubernetes cluster. Some applications in Cluster B need to access the database in Cluster A, and the network administrator wants the cluster Pods to be managed through an egress gateway. &lt;/p&gt;

&lt;p&gt;We have developed and open-sourced the &lt;a href="https://github.com/spidernet-io/egressgateway" rel="noopener noreferrer"&gt;EgressGateway&lt;/a&gt; project to address this issue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduce
&lt;/h2&gt;

&lt;p&gt;In a Kubernetes cluster, when Pods access external services, their Egress IP addresses are not fixed. In the Overlay network, the Egress IP address is determined by the node where the Pod resides. While in the Underlay network, Pods directly use their own IP addresses for external communication. Consequently, when Pods are rescheduled, regardless of the network mode, their IP addresses for external communication change. This instability poses a challenge for system administrators in managing IP addresses, especially as the cluster scales and during network fault diagnostics. Controlling egress traffic based on a Pod's original egress IP outside the cluster becomes difficult.&lt;/p&gt;

&lt;p&gt;To solve this problem, &lt;a href="https://github.com/spidernet-io/egressgateway" rel="noopener noreferrer"&gt;EgressGateway&lt;/a&gt; has been introduced into the k8s cluster. It is an open-source EgressGateway designed to resolve egress egress IP address issues across various CNI network modes, such as Calico, Flannel, Weave, and Spiderpool. Through flexible configuration and management of egress policies, EgressGateway allows setting egress IP addresses for tenant-level or cluster-level workloads. When Pods need to access the external network, the system consistently uses the configured Egress IP as the egress address, providing a stable solution for egress traffic management.&lt;/p&gt;

&lt;h3&gt;
  
  
  Compatible with the following network solutions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/projectcalico/calico" rel="noopener noreferrer"&gt;Calico&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/flannel-io/flannel" rel="noopener noreferrer"&gt;Flannel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/weaveworks/weave" rel="noopener noreferrer"&gt;Weave&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/spidernet-io/spiderpool" rel="noopener noreferrer"&gt;Spiderpool&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Solve IPv4 IPv6 dual-stack connectivity.&lt;/li&gt;
&lt;li&gt;Solve the high availability of Egress Nodes.&lt;/li&gt;
&lt;li&gt;Allow filtering Pods Egress Policy (&lt;em&gt;Destination CIDR&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Allow filtering of egress Applications (&lt;em&gt;Pods&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Can be used in low kernel version.&lt;/li&gt;
&lt;li&gt;Support multiple egress gateways instance.&lt;/li&gt;
&lt;li&gt;Support namespaced egress IP.&lt;/li&gt;
&lt;li&gt;Supports automatic detection of cluster traffic for egress gateways policies.&lt;/li&gt;
&lt;li&gt;Support namespace default egress instances.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;A self-managed Kubernetes cluster with a minimum of 2 nodes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Helm has been installed in your cluster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Let's take calico CNI as an example. For more you can ref to our &lt;a href="https://spidernet-io.github.io/egressgateway/" rel="noopener noreferrer"&gt;Docs Website&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If your cluster is using &lt;a href="https://www.tigera.io/project-calico/" rel="noopener noreferrer"&gt;Calico&lt;/a&gt;  as the CNI plugin, run the following command to ensure that EgressGateway's iptables rules are not overridden by Calico rules. Failure to do so may cause EgressGateway to malfunction.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="c"&gt;# set chainInsertMode&lt;/span&gt;
  &lt;span class="nv"&gt;$ &lt;/span&gt;kubectl patch felixconfigurations  default &lt;span class="nt"&gt;--type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'merge'&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s1"&gt;'{"spec":{"chainInsertMode":"Append"}}'&lt;/span&gt;

  &lt;span class="c"&gt;# check status&lt;/span&gt;
  &lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get FelixConfiguration default &lt;span class="nt"&gt;-o&lt;/span&gt; yaml
    apiVersion: crd.projectcalico.org/v1
    kind: FelixConfiguration
    metadata:
      generation: 2
      name: default
      resourceVersion: &lt;span class="s2"&gt;"873"&lt;/span&gt;
      uid: 0548a2a5-f771-455b-86f7-27e07fb8223d
      spec:
        chainInsertMode: Append
      ......
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Regarding &lt;code&gt;spec.chainInsertMode&lt;/code&gt;, refer to &lt;a href="https://projectcalico.docs.tigera.io/reference/resources/felixconfig" rel="noopener noreferrer"&gt;Calico docs&lt;/a&gt; for details&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Install EgressGateway
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Add EgressGateway Repo
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm repo add egressgateway &lt;a href="https://spidernet-io.github.io/egressgateway/" rel="noopener noreferrer"&gt;https://spidernet-io.github.io/egressgateway/&lt;/a&gt;&lt;br&gt;
helm repo update&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h4&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Install EgressGateway&lt;br&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Quickly install EgressGateway through the following command:&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm &lt;span class="nb"&gt;install &lt;/span&gt;egressgateway egressgateway/egressgateway &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;-n&lt;/span&gt; kube-system &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;--set&lt;/span&gt; feature.tunnelIpv4Subnet&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"192.200.0.1/16"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;--wait&lt;/span&gt; &lt;span class="nt"&gt;--debug&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the installation command, please consider the following points:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make sure to provide the IPv4 and IPv6 subnets for the EgressGateway tunnel nodes in the installation command. These subnets should not conflict with other addresses within the cluster.&lt;/li&gt;
&lt;li&gt;You can customize the network interface used for EgressGateway tunnels by using the &lt;code&gt;--set feature.tunnelDetectMethod="interface=eth0"&lt;/code&gt; option. By default, it uses the network interface associated with the default route.&lt;/li&gt;
&lt;li&gt;If you want to enable IPv6 support, set the &lt;code&gt;--set feature.enableIPv6=true&lt;/code&gt; option and also &lt;code&gt;feature.tunnelIpv6Subnet&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The EgressGateway Controller supports high availability and can be configured using &lt;code&gt;--set controller.replicas=2&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;To enable return routing rules on the gateway nodes, use &lt;code&gt;--set feature.enableGatewayReplyRoute=true&lt;/code&gt;. This option is required when using Spiderpool to work with underlay CNI.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Verify that all EgressGateway Pods are running properly.&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get pod &lt;span class="nt"&gt;-n&lt;/span&gt; kube-system | &lt;span class="nb"&gt;grep &lt;/span&gt;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
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Any feature configurations can be achieved by adjusting the Helm values of the EgressGateway application.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Create EgressGateway release
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;EgressGateway defines a group of nodes as the cluster's egress gateway, responsible for forwarding egress traffic out of the cluster. To define a group of EgressGateway, run the following command:&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; | 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"
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Descriptions:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the provided YAML example, adjust &lt;code&gt;spec.ippools.ipv4&lt;/code&gt; to define egress exit IP addresses based on your specific environment.&lt;/li&gt;
&lt;li&gt;Ensure that the CIDR of &lt;code&gt;spec.ippools.ipv4&lt;/code&gt; matches the subnet of the egress interface on the gateway nodes (usually the interface associated with the default route). Mismatched subnets can cause connectivity issues for egress traffic.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;spec.nodeSelector&lt;/code&gt; in the EgressGateway to select a group of nodes as the egress gateway. You can select multiple nodes to achieve high availability.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Label the egress gateway nodes by applying labels to them. For production environments, it is recommended to label at least 2 nodes. For POC environments, label 1 node.&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get node
kubectl label node &lt;span class="nv"&gt;$NodeName&lt;/span&gt; &lt;span class="nv"&gt;egressgateway&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"true"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check the status:&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get EgressGateway default &lt;span class="nt"&gt;-o&lt;/span&gt; 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: &lt;span class="s2"&gt;"true"&lt;/span&gt;
status:
  nodeList:
  - name: egressgateway-worker1
    status: Ready
  - name: egressgateway-worker2
    status: Ready
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Descriptions:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;status.nodeList&lt;/code&gt; field indicates the nodes that match the &lt;code&gt;spec.nodeSelector&lt;/code&gt;, along with the status of their corresponding EgressTunnel objects.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;spec.ippools.ipv4DefaultEIP&lt;/code&gt; field randomly selects one IP address from &lt;code&gt;spec.ippools.ipv4&lt;/code&gt; as the default VIP for this group of EgressGateways. This default VIP is used when creating EgressPolicy objects for applications that do not specify a VIP address.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Create Applications and Egress Policies
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create an application that will be used to test Pod access to external resources and apply labels to it.&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl create deployment visitor &lt;span class="nt"&gt;--image&lt;/span&gt; nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create an EgressPolicy CR object for your application.&lt;/p&gt;

&lt;p&gt;An EgressPolicy instance is used to define which Pods' egress traffic should be forwarded through EgressGateway nodes, along with other configuration details.&lt;br&gt;
You can create an example as follows. When a matching Pod accesses any external address in the cluster (excluding Node IP, CNI Pod CIDR, ClusterIP), it will be forwarded through EgressGateway nodes.&lt;br&gt;
Note that EgressPolicy objects are tenant-level, so they must be created under the tenant of the selected application.&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; | kubectl apply -f -
apiVersion: egressgateway.spidernet.io/v1beta1
kind: EgressPolicy
metadata:
 name: test
 namespace: default
spec:
 egressGatewayName: default
 appliedTo:
  podSelector:
   matchLabels:
    app: "visitor"
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Descriptions:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;spec.egressGatewayName&lt;/code&gt; specifies the name of the EgressGateway group to use.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;spec.appliedTo.podSelector&lt;/code&gt; determines which Pods within the cluster this policy should apply to.&lt;/li&gt;
&lt;li&gt;There are two options for the source IP address of egress traffic in the cluster:

&lt;ul&gt;
&lt;li&gt;You can use the IP address of the gateway nodes. This is suitable for public clouds and traditional networks but has the downside of potential IP changes if a gateway node fails. You can enable this by setting &lt;code&gt;spec.egressIP.useNodeIP=true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;You can use a dedicated VIP. EgressGateway uses ARP principles for VIP implementation, making it suitable for traditional networks rather than public clouds. The advantage is that the egress source IP remains fixed. If no settings are specified in the EgressPolicy, the default VIP of the egressGatewayName will be used, or you can manually specify &lt;code&gt;spec.egressIP.ipv4&lt;/code&gt; , which must match the IP pool configured in the EgressGateway.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check the status of the EgressPolicy&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get EgressPolicy &lt;span class="nt"&gt;-A&lt;/span&gt;
NAMESPACE   NAME   GATEWAY   IPV4           IPV6   EGRESSTUNNEL
default     &lt;span class="nb"&gt;test   &lt;/span&gt;default   172.22.0.110          egressgateway-worker2

&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get EgressPolicy &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; yaml
apiVersion: egressgateway.spidernet.io/v1beta1
kind: EgressPolicy
metadata:
  name: &lt;span class="nb"&gt;test
  &lt;/span&gt;namespace: default
spec:
  appliedTo:
    podSelector:
      matchLabels:
        app: visitor
  egressIP:
    allocatorPolicy: default
    useNodeIP: &lt;span class="nb"&gt;false
&lt;/span&gt;status:
  eip:
    ipv4: 172.22.0.110
  node: egressgateway-worker2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Descriptions:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;status.eip&lt;/code&gt; displays the egress IP address used by the group of applications.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;status.node&lt;/code&gt; shows which EgressGateway node is responsible for real-time egress traffic forwarding. EgressGateway nodes support high availability. When multiple EgressGateway nodes exist, all EgressPolicy instances will be evenly distributed among them.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check the status of EgressEndpointSlices.&lt;/p&gt;

&lt;p&gt;Each EgressPolicy object has a corresponding EgressEndpointSlices that stores the IP  collection of Pods selected by the EgressPolicy. If your application is unable to access external resources, you can check if the IP addresses in this object are correct.&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get egressendpointslices &lt;span class="nt"&gt;-A&lt;/span&gt;
NAMESPACE   NAME         AGE
default     test-kvlp6   18s

&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get egressendpointslices test-kvlp6 &lt;span class="nt"&gt;-o&lt;/span&gt; yaml
apiVersion: egressgateway.spidernet.io/v1beta1
endpoints:
- ipv4:
  - 172.40.14.195
  node: egressgateway-worker
  ns: default
  pod: visitor-6764bb48cc-29vq9
kind: EgressEndpointSlice
metadata:
  name: test-kvlp6
  namespace: default
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Test Results
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Deploy the nettools application outside the cluster to simulate an external service. nettools will return the requester's source IP address in the HTTP response.&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host ghcr.io/spidernet-io/egressgateway-nettools:latest /usr/bin/nettools-server &lt;span class="nt"&gt;-protocol&lt;/span&gt; web &lt;span class="nt"&gt;-webPort&lt;/span&gt; 8080
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Verify the effect of egress traffic in the visitor Pod within the cluster. You should observe that when the visitor accesses the external service, nettools returns a source IP matching the EgressPolicy &lt;code&gt;.status.eip&lt;/code&gt;.&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get pod
NAME                       READY   STATUS    RESTARTS   AGE
visitor-6764bb48cc-29vq9   1/1     Running   0          15m

&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; visitor-6764bb48cc-29vq9 bash
&lt;span class="nv"&gt;$ &lt;/span&gt;curl 10.6.1.92:8080
Remote IP: 172.22.0.110
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Community
&lt;/h2&gt;

&lt;p&gt;If you have any egress network requirements, feel free to discuss them with us in our community. &lt;a href="https://github.com/spidernet-io/egressgateway" rel="noopener noreferrer"&gt;EgressGateway&lt;/a&gt; is an open-source project, and if you find value in it, we welcome you to star our project as a sign of support.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>ingress</category>
      <category>gateway</category>
      <category>cloudnative</category>
    </item>
  </channel>
</rss>
