Survey:Antrea community活动,等你参加!
一起来投票选出你感兴趣的活动形式/内容吧!
什么是Egress?
Egress资源是用来管理集群内Pods出口流量的CRD API。它支持为Pod访问外部网络的流量指定出口IP(SNAT IP)和出口节点。当Egress应用于某个Pod时,它的出口流量将通过隧道传输到配置有对应Egress IP的节点(如果Egress IP所在的节点不同于Pod运行的节点的话),并经过SNAT将数据包源地址转换为Egress IP。
如果您有以下业务场景,您可能会对这个功能感兴趣:
本指南将演示如何配置Egress来达到上述目的。
打开Egress特性开关
Egress在v1.0.0版本中作为alpha特性引入,和其他alpha特性一样,需要在antrea-controller和antrea-agent组件的配置文件中打开Egress特性开关才能使用该特性。如下是antrea-config
ConfigMap的示例:
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资源示例:
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指定Egress应用的Pods。可以使用podSelector在集群范围内选择Pods。也可以使用namespaceSelector来选定特定namespace内的所有Pods。当然也可以同时指定namespaceSelector和podSelector,在特定的namespace中选定特定的Pods。空的appliedTo不选定任何Pod。这个字段是必选的。
EgressIP指定选定的Pods访问外部网络时出口流量的出口IP(SNAT IP)。此IP必须从集群所有Nodes可达。可以在创建Egress资源时指定该IP。从v1.2.0版本开始,也可以通过指定ExternalIPPool来自动分配一个EgressIP。
从v1.2.0版本开始,Antrea提供了Egress故障转移功能,如果指定了externalIPPool, 且满足nodeSelector条件的Node不止一个,如果egressIP所在的Node发生故障或被删除, egressIP将被自动转移到其他满足条件的Node上。
注意如果一个Pod匹配了多于一个Egress并且他们的egressIP不同,这个Pod的出口流量会从这些egress IP中随机选择。
externalIPPool
字段指定从哪个ExternalIPPool为该Egress分配EgressIP。它(根据ExternalIPPool资源的nodeSelector)也决定了哪些节点可以承载对应的egressIP。如果externalIPPool为空,则表示用户将手动给任一Node配置该Egress的egressIP。
ExternalIPPool资源
ExternalIPPool定义一个或多个可用于外部网络的IP池。IP池中的IP可以分配给Egress资源,即egressIP。如下是ExternalIPPool资源的示例:
- 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
指定一个IP范围,代表该范围内的IP可用。每个IP范围由一个cidr
或者start
和 end
定义,该集合是开集。
nodeSelector
以标签选择器的方式指定哪些Node可以配置这个IP池中的IP。它可以用来把出口流量限制在特定的Nodes范围内,nodeSelector的语法和其他Kubernetes资源标签的语法一致。同时支持matchLabels 和 matchExpressions,如果nodeSelector为空,则表示所有Nodes都可选。
使用示例
在下面的例子中,我们将为不同Namespace中的Pod配置不同的egressIP来访问外部网络。
首先,创建一个带有外部可路由的IP的ExternalIPPool资源。
- 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。
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。
# 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连接的中断影响降到最小。
在下面这个例子中,我们将为不同Namespace中的Pod指定不同的Node IP(或任何配置到Node任一网卡的IP)来接入外部网络。
由于我们使用的是Node自己的IP作为egressIP,它们已经配置到Node上了,在创建Egress资源时可以直接指定对应的IP,externalIPPool留空即可。
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上被检测到。
# 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出口流量重定向到新的节点。