创建 Egress 网关策略¶
Egress 网关策略用于定义哪些 Pod 的出口流量要经过 EgressGateway 节点转发,以及定义其它的配置细节。 当匹配的 Pod 访问任意集群外部的地址(任意非 Node IP、CNI Pod CIDR、ClusterIP 的地址)时,都会被 EgressGateway Node 转发。 当前 Egress 网关策略分为两类:命名空间级别策略、集群级别策略。
- 命名空间级别 :创建的策略生效范围为命名空间级别
- 集群级别 : 创建的策略生效范围为集群级别
创建命名空间 Egress 网关策略¶
-
点击 网关策略 -> 创建 命名空间策略 ,并填入如下参数:
基本信息 :
策略名称
:输入待创建的策略名称。描述
:定义待创建策略描述。命名空间
:创建的策略生效的命名空间,此示例中选择的为 default 。网关选择
:指定使用哪一个已经创建好的Egress 网关实例。
出口地址 :
-
出口 IP 地址
:可使用独立的 VIP作为出口 IP。因为 EgressGateway 基于 ARP 生效 VIP,适用于传统网络, 源 IP 永久是固定的。在不做设置时,则默认使用缺省 VIP, IP 值必须在 EgressGateway 中的 IP 池范围内。可通过如下两种方式选择 IP:指定出口 IP 地址
:从选择网关对应的出口 IP 范围中,指定某一个 IP 地址作为 出口 IP 。指定分配策略
:可使用选择网关的 默认出口 IP 或者通过轮询方式 选择 IP 池中地址作为出口 IP 。
-
节点 IP 地址
:使用节点 IP 地址作为出口 IP。适用于公有云和传统网络等环境,缺点是随着网关节点的故障,出口源 IP 可能会发生变化。对应字段信息为 spec.egressIP.useNodeIP=true
源地址容器组 :
选择容器组
:支持通过 标签选择器 或者 源地址 方式选择源地址容器组,指定本策略生效的容器范围, 当匹配的 Pod 访问任意集群外部的地址(任意不是 Node IP、CNI Pod CIDR、ClusterIP 的地址)时,都会被 EgressGateway Node 转发。 *标签选择器
:通过标签指定源地址容器组。 *源地址
:通过添加 源地址 CIDR 地址段方式,添加白名单,锁定的 容器组将生效本策略。高级设置 :
目标地址
:可指定访问目标地址白名单,指定后此策略将对定义的目标地址生效,支持 单个 IP 地址,IP 段,CIDR 等方式输入。默认不定义,对所有目标地址生效。 -
输入完成后点击 确定 完成创建。
创建集群 Egress 网关策略¶
-
点击 网关策略 -> 创建集群策略 ,基本信息、出口地址、容器组选择等参数请参考创建命名空间 Egress 网关策略。
高级设置 :
命名空间选择器
:通过 Label 方式选择命名空间,策略生效范围为所选择命名空间。目标地址
:同创建命名空间 Egress 网关策略 规则一致。
-
输入完成后点击 确定 完成创建。
通过 YAML 创建 Egress 网关策略¶
-
创建网关策略 YAML
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
在以上创建命令中:
- spec.egressGatewayName 指定了使用哪一组 EgressGateway 的名字。
- spec.appliedTo.podSelector 指定了本策略生效在集群内的哪些 Pod。
- 集群的 egress 流量的源 IP 地址有两种选择:
- 可使用网关节点的 IP。它可适用于公有云和传统网络等环境,缺点是,随着网关节点的故障, 出口源 IP 可能会发生变化。可设置 spec.egressIP.useNodeIP=true 来生效。
- 可使用独立的 VIP,因为 EgressGateway 是基于 ARP 原理生效 VIP,所以它适用于传统网络, 而不适用于公有云等环境,它的优点是,出口源 IP 永久是固定的。在 EgressPolicy 中不做任何设置, 则默认使用
egressGatewayName
的缺省 VIP,或者可单独手动指定 spec.egressIP.ipv4 ,其 IP 值务必是符合 EgressGateway 中的 IP 池。
-
查看 EgressPolicy 的状态
$ kubectl get EgressPolicy -A NAMESPACE NAME GATEWAY IPV4 IPV6 EGRESSTUNNEL default test default 172.22.0.110 egressgateway-worker2 $ kubectl get EgressPolicy test -o yaml apiVersion: egressgateway.spidernet.io/v1beta1 kind: EgressPolicy metadata: name: test namespace: default spec: appliedTo: podSelector: matchLabels: app: visitor egressIP: allocatorPolicy: default useNodeIP: false status: eip: ipv4: 172.22.0.110 node: egressgateway-worker2
如上输出中:
- status.eip 展示了该组应用出集群时使用的出口 IP 地址。
- status.node 展示了哪一个 EgressGateway 的节点在实时的负责出口流量的转发。
Note
EgressGateway 节点支持高可用,当存在多个 EgressGateway 节点时,所有的 EgressPolicy 会均摊到不同的 EgressGateway 节点上实施。
-
查看 EgressEndpointSlices 的状态
每个 EgressPolicy 对象,都有一个对应的 EgressEndpointSlices 对象,其中存储了 EgressPolicy select 的 Pod 的 IP 地址集合。 当应用无法出口访问时,可排查该对象中的 IP 地址是否正常。
$ kubectl get egressendpointslices -A NAMESPACE NAME AGE default test-kvlp6 18s $ kubectl get egressendpointslices test-kvlp6 -o 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
Egress 网关测试¶
-
可在集群外部署应用 nettools,用于模拟一个集群外部的服务,nettools 会在 http 回复中返回请求者的源 IP 地址。
-
在集群内部的 visitor Pod 中,验证出口流量的效果,我们可以看到 visitor 访问外部服务,nettools 返回的源 IP 符合了 EgressPolicy
.status.eip
的效果。