WEBKT

Cilium EgressGateway实战:为Kubernetes命名空间配置静态出口IP

134 0 0 0

Cilium EgressGateway实战:为Kubernetes命名空间配置静态出口IP

在Kubernetes环境中,Pod的IP地址通常是动态分配的,这给与外部防火墙的集成带来了挑战。因为防火墙通常需要基于IP地址进行策略配置。Cilium的EgressGateway功能允许我们为特定命名空间的出口流量分配静态IP地址,从而简化与外部防火墙的集成和管理。本文将详细介绍如何使用Cilium EgressGateway来实现这一目标。

1. EgressGateway 简介

Cilium EgressGateway 允许你定义一个或多个节点作为出口网关。从指定命名空间发出的流量将被路由到这些网关节点,并且源IP地址会被替换为网关节点的IP地址。这使得外部服务能够识别来自特定命名空间的流量,并对其应用相应的安全策略。

EgressGateway 的优势:

  • 静态出口IP: 为命名空间提供可预测的出口IP地址。
  • 简化防火墙集成: 允许基于IP地址的防火墙策略。
  • 细粒度控制: 可以为不同的命名空间配置不同的出口网关。
  • 增强安全性: 通过集中控制出口流量,提高安全性。

2. 前提条件

  • 一个正在运行的 Kubernetes 集群。
  • 已安装 Cilium (版本 >= 1.9)。
  • cilium 命令行工具。

3. 配置 EgressGateway

以下步骤演示如何为 default 命名空间配置 EgressGateway,并为其出口流量分配静态IP地址。

3.1. 确定 Egress Gateway 节点

首先,需要选择一个或多个节点作为 Egress Gateway。这些节点需要具有可以被外部防火墙访问的IP地址。你可以使用以下命令来查看节点的IP地址:

kubectl get nodes -o wide

选择一个或多个节点,并记录它们的内部IP地址和外部IP地址(如果存在)。

示例:

假设我们选择的节点名称为 worker-node-1,其内部IP地址为 192.168.1.100,外部IP地址为 203.0.113.10

3.2. 创建 CiliumEgressGatewayPolicy

创建一个 CiliumEgressGatewayPolicy CRD (Custom Resource Definition) 对象,用于定义出口网关策略。以下是一个示例:

apiVersion: cilium.io/v2alpha1
kind: CiliumEgressGatewayPolicy
metadata:
  name: egress-gateway-default
spec:
  destinationCIDRs:
  - 0.0.0.0/0 # 允许所有目标地址
  egressGateway: 192.168.1.100 # Egress Gateway 节点的内部IP地址
  namespaceSelector:
    matchLabels:
      name: default # 应用于 default 命名空间

字段解释:

  • metadata.name: 策略的名称。
  • spec.destinationCIDRs: 允许访问的目标IP地址范围。0.0.0.0/0 表示允许所有目标地址。你可以根据需要限制目标地址范围。
  • spec.egressGateway: Egress Gateway 节点的内部IP地址。重要: 这里必须使用内部IP地址,因为 Cilium 会在节点内部进行路由。
  • spec.namespaceSelector: 指定应用此策略的命名空间。matchLabels.name: default 表示应用于 default 命名空间。

将以上内容保存为 egress-gateway-default.yaml 文件,并应用该策略:

kubectl apply -f egress-gateway-default.yaml

3.3. 验证 Egress Gateway 配置

创建一个 Pod 并验证其出口流量是否使用了 Egress Gateway 的IP地址。

首先,创建一个简单的 Pod:

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  namespace: default
spec:
  containers:
  - name: busybox
    image: busybox
    command: ['sleep', '3600']

将以上内容保存为 test-pod.yaml 文件,并创建该 Pod:

kubectl apply -f test-pod.yaml

然后,进入 Pod 并使用 curl 命令访问外部网站,并查看源IP地址:

kubectl exec -it test-pod -n default -- sh
/ # curl -s ipinfo.io/ip
203.0.113.10
/ # exit

如果输出的IP地址与 Egress Gateway 节点的外部IP地址一致,则说明 Egress Gateway 配置成功。

注意: 如果你没有配置节点的外部IP地址,则输出的IP地址将是节点的内部IP地址。

4. 与外部防火墙集成

配置 EgressGateway 后,你需要更新外部防火墙的规则,允许来自 Egress Gateway 节点的流量访问目标服务。具体步骤取决于你使用的防火墙类型和配置。通常,你需要添加一条规则,允许来自 Egress Gateway 节点的外部IP地址(例如 203.0.113.10)访问目标服务。

示例:

假设你的目标服务位于 10.0.0.0/24 网段,你可以添加以下防火墙规则:

允许来自 203.0.113.10 的流量访问 10.0.0.0/24

5. 高级配置

  • 多个 Egress Gateway: 你可以配置多个 Egress Gateway 节点,以提高可用性和性能。Cilium 会自动将流量分发到不同的网关节点。
  • 基于目标地址的策略: 你可以根据目标地址配置不同的 Egress Gateway。例如,你可以将访问特定服务的流量路由到特定的网关节点。
  • 使用 DNS 名称: destinationCIDRs 字段也支持使用 DNS 名称。你可以使用 DNS 名称来匹配目标服务,而无需使用IP地址。

6. 总结

通过 Cilium 的 EgressGateway 功能,我们可以轻松地为 Kubernetes 命名空间配置静态出口IP地址,从而简化与外部防火墙的集成和管理。本文介绍了 EgressGateway 的基本概念、配置步骤以及与外部防火墙集成的考虑因素。希望本文能够帮助你更好地理解和使用 Cilium EgressGateway。

7. 参考资料

提示: 在生产环境中配置 EgressGateway 时,请务必仔细规划IP地址和防火墙规则,并进行充分的测试,以确保安全性和可靠性。

网络极客 CiliumEgressGatewayKubernetes

评论点评