前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Antrea Egress用户指南

Antrea Egress用户指南

作者头像
CNCF
发布2021-08-26 11:49:01
9210
发布2021-08-26 11:49:01
举报
文章被收录于专栏:CNCFCNCF

Survey:Antrea community活动,等你参加!

一起来投票选出你感兴趣的活动形式/内容吧!

什么是Egress?

Egress资源是用来管理集群内Pods出口流量的CRD API。它支持为Pod访问外部网络的流量指定出口IP(SNAT IP)和出口节点。当Egress应用于某个Pod时,它的出口流量将通过隧道传输到配置有对应Egress IP的节点(如果Egress IP所在的节点不同于Pod运行的节点的话),并经过SNAT将数据包源地址转换为Egress IP。

如果您有以下业务场景,您可能会对这个功能感兴趣:

  • 当您需要某些Pod在访问外部网络时使用固定一致的源IP地址,以便在审计日志时通过源IP溯源, 或需要将IP配置到外部防火墙的源IP白名单等。
  • 当您需要Pod发起的外部连接必须通过某些节点出口,以便进行安全控制,或适应网络拓扑本身的限制。

本指南将演示如何配置Egress来达到上述目的。

打开Egress特性开关

Egress在v1.0.0版本中作为alpha特性引入,和其他alpha特性一样,需要在antrea-controller和antrea-agent组件的配置文件中打开Egress特性开关才能使用该特性。如下是antrea-configConfigMap的示例:

代码语言:javascript
复制
kind: ConfigMap
apiVersion: v1
metadata:
  name: antrea-config-dcfb6k2hkm
  namespace: kube-system
data:
  antrea-agent.conf: |
    featureGates:
      Egress: true
  antrea-controller.conf: |
    featureGates:
      Egress: true

Egress资源

Egress资源示例:

代码语言:javascript
复制
apiVersion: crd.antrea.io/v1alpha2
kind: Egress
metadata:
  name: egress-prod-web
spec:
  appliedTo:
    namespaceSelector:
      matchLabels:
        env: prod
    podSelector:
      matchLabels:
        role: web
  egressIP: 10.10.0.8 # can be populated by Antrea after assigning an IP from the pool below
  externalIPPool: prod-external-ip-pool
status:
  egressNode: node01

AppliedTo字段

AppliedTo指定Egress应用的Pods。可以使用podSelector在集群范围内选择Pods。也可以使用namespaceSelector来选定特定namespace内的所有Pods。当然也可以同时指定namespaceSelector和podSelector,在特定的namespace中选定特定的Pods。空的appliedTo不选定任何Pod。这个字段是必选的。

EgressIP字段

EgressIP指定选定的Pods访问外部网络时出口流量的出口IP(SNAT IP)。此IP必须从集群所有Nodes可达。可以在创建Egress资源时指定该IP。从v1.2.0版本开始,也可以通过指定ExternalIPPool来自动分配一个EgressIP。

  • 如果没有指定egressIP,必须指定 externalIPPool , antrea-controller将从externalIPPool的IP池中为这个Egress分配一个IP,即egressIP, 随后antrea-agent将为这个egressIP选择一个符合nodeSelector的Node,将egressIP配置到该Node上。
  • 如果同时指定egressIP和externalIPPool,egressIP必须在externalIPPool的IP范围内。同样,antrea-agent将把EgressIP自动配置到一个合适的Node。
  • 如果只指定egressIP,则需要用户手动将这个IP配置到任意一个Node上,Antrea不会管理IP的配置。

从v1.2.0版本开始,Antrea提供了Egress故障转移功能,如果指定了externalIPPool, 且满足nodeSelector条件的Node不止一个,如果egressIP所在的Node发生故障或被删除, egressIP将被自动转移到其他满足条件的Node上。

注意如果一个Pod匹配了多于一个Egress并且他们的egressIP不同,这个Pod的出口流量会从这些egress IP中随机选择。

ExternalIPPool字段

externalIPPool字段指定从哪个ExternalIPPool为该Egress分配EgressIP。它(根据ExternalIPPool资源的nodeSelector)也决定了哪些节点可以承载对应的egressIP。如果externalIPPool为空,则表示用户将手动给任一Node配置该Egress的egressIP。

ExternalIPPool资源

ExternalIPPool定义一个或多个可用于外部网络的IP池。IP池中的IP可以分配给Egress资源,即egressIP。如下是ExternalIPPool资源的示例:

代码语言:javascript
复制
- apiVersion: crd.antrea.io/v1alpha2
  kind: ExternalIPPool
  metadata:
    name: prod-external-ip-pool
  spec:
    ipRanges:
    - start: 10.10.0.2
      end: 10.10.0.10
    - cidr: 10.10.1.0/28
    nodeSelector:
      matchLabels:
        network-role: egress-gateway

IPRanges字段

ipRanges指定一个IP范围,代表该范围内的IP可用。每个IP范围由一个cidr或者startend定义,该集合是开集。

NodeSelector字段

nodeSelector以标签选择器的方式指定哪些Node可以配置这个IP池中的IP。它可以用来把出口流量限制在特定的Nodes范围内,nodeSelector的语法和其他Kubernetes资源标签的语法一致。同时支持matchLabels 和 matchExpressions,如果nodeSelector为空,则表示所有Nodes都可选。

使用示例

配置高可用的Egress来实现故障转移

在下面的例子中,我们将为不同Namespace中的Pod配置不同的egressIP来访问外部网络。

首先,创建一个带有外部可路由的IP的ExternalIPPool资源。

代码语言:javascript
复制
- apiVersion: crd.antrea.io/v1alpha2
  kind: ExternalIPPool
  metadata:
    name: external-ip-pool
  spec:
    ipRanges:
    - start: 10.10.0.11  # 10.10.0.11-10.10.0.20 can be used as Egress IPs
      end: 10.10.0.20
    nodeSelector: {}     # All Nodes can be Egress Nodes

创建两个Egress,分别应用到不同Namespace的web apps。

代码语言:javascript
复制
apiVersion: crd.antrea.io/v1alpha2
kind: Egress
metadata:
  name: egress-prod-web
spec:
  appliedTo:
    namespaceSelector:
      matchLabels:
        kubernetes.io/metadata.name: prod
    podSelector:
      matchLabels:
        app: web
  externalIPPool: external-ip-pool
---
apiVersion: crd.antrea.io/v1alpha2
kind: Egress
metadata:
  name: egress-staging-web
spec:
  appliedTo:
    namespaceSelector:
      matchLabels:
        kubernetes.io/metadata.name: staging
    podSelector:
      matchLabels:
        app: web
  externalIPPool: external-ip-pool

使用kubectl查看Egress资源,可以看到每个Egress都被分配了一个IP池内的EgressIP,并指定了一个Node。

代码语言:javascript
复制
# kubectl get egress
NAME                 EGRESSIP       AGE   NODE
egress-prod-web      10.10.0.11     1m    node-4
egress-staging-web   10.10.0.12     1m    node-6

现在,Namespace prod中带有app=web标签的Pods的出口流量都将被重定向到节点node-4,源地址转化为10.10.0.11;Namespace staging中带有app=web标签的Pods的出口流量都将被重定向到节点node-6,源地址转化为10.10.0.12。

最后,如果node-4意外宕机,10.10.0.11将很快被重新分配到其他满足条件的节点, Namespace prod中带有app=web标签的Pods的出口流量都将被重定向到新的节点, 不用人工干预即可将egress连接的中断影响降到最小。

配置静态Egress

在下面这个例子中,我们将为不同Namespace中的Pod指定不同的Node IP(或任何配置到Node任一网卡的IP)来接入外部网络。

由于我们使用的是Node自己的IP作为egressIP,它们已经配置到Node上了,在创建Egress资源时可以直接指定对应的IP,externalIPPool留空即可。

代码语言:javascript
复制
apiVersion: crd.antrea.io/v1alpha2
kind: Egress
metadata:
  name: egress-prod
spec:
  appliedTo:
    namespaceSelector:
      matchLabels:
        kubernetes.io/metadata.name: prod
  egressIP: 10.10.0.104   # node-4's IP
---
apiVersion: crd.antrea.io/v1alpha2
kind: Egress
metadata:
  name: egress-staging
spec:
  appliedTo:
    namespaceSelector:
      matchLabels:
        kubernetes.io/metadata.name: staging
  egressIP: 10.10.0.105   # node-5's IP

使用kubectl查看Egress资源,可以看到IP 10.10.0.104在节点node-4上被检测到而IP 10.10.0.105在节点node-5上被检测到。

代码语言:javascript
复制
# kubectl get egress
NAME                 EGRESSIP       AGE   NODE
egress-prod          10.10.0.104    1m    node-4
egress-staging       10.10.0.105    1m    node-5

现在,Namespace prod中带有app=web标签的Pods的出口流量都将被重定向到节点node-4,源地址转化为10.10.0.104;Namespace staging中带有app=web标签的Pods的出口流量都将被重定向到节点node-5,源地址转化为10.10.0.105。

在这种静态配置下,如果node-4意外宕机,需要重新配置IP 10.10.0.104到其它节点上, 或者更新Egress egress-prod的egressIP为其他节点的IP,就可以恢复相关Pod的出口连接。Antrea会检测到配置变更并将Namespace prod内的Pod出口流量重定向到新的节点。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-08-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CNCF 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • AppliedTo字段
  • EgressIP字段
  • ExternalIPPool字段
  • IPRanges字段
  • NodeSelector字段
  • 配置高可用的Egress来实现故障转移
  • 配置静态Egress
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档