在标准集群中配置 IP 伪装代理


本页面介绍如何将在 Google Kubernetes Engine (GKE) 标准模式下创建的集群配置为使用 ip-masq-agent 执行 IP 伪装。如需详细了解 GKE Autopilot 模式中的 IP 伪装,请参阅使用出站流量 NAT 政策在 Autopilot 集群中配置 IP 伪装

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。

检查 ip-masq-agent 状态

本部分介绍了如何执行以下操作:

  • 确定您的集群是否具有 ip-masq-agent DaemonSet。
  • 检查 ip-masq-agent ConfigMap 资源。

检查 ip-masq-agent DaemonSet

如需检查您的集群是否正在运行 ip-masq-agent DaemonSet,请使用 Google Cloud CLI 或 Google Cloud 控制台。

gcloud

  1. 获取集群的凭据:

    gcloud container clusters get-credentials CLUSTER_NAME
    

    CLUSTER_NAME 替换为您的集群名称。

  2. kube-system 命名空间中搜索 ip-masq-agent

    kubectl get daemonsets/ip-masq-agent -n kube-system
    

    如果存在 ip-masq-agent DaemonSet,则输出类似于以下内容:

    NAME            DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
    ip-masq-agent   3         3         3       3            3           <none>          13d
    

    如果不存在 ip-masq-agent DaemonSet,则输出类似于以下内容:

    Error from server (NotFound): daemonsets.apps "ip-masq-agent" not found
    
  3. 检查 ip-masq-agent DaemonSet 是否运行的是最新版本:

    kubectl get daemonsets/ip-masq-agent -n kube-system -o jsonpath='{.spec.template.spec.containers[].image}'
    

    此命令必须返回与部署 ip-masq-agent DaemonSet 中指定的容器映像相同的容器映像。

控制台

  1. 转到 Google Cloud 控制台中的工作负载页面。

    转到“工作负载”

  2. 对于 过滤条件,请执行以下操作:

    1. 点击 以清除 Is system object: False 过滤条件。
    2. 过滤以下属性:
      • 名称ip-masq-agent
      • 集群:您的集群的名称。

    如果存在 ip-masq-agent DaemonSet,则您可以在表中查看 DaemonSet 记录。如果不存在 ip-masq-agent DaemonSet,则不会显示任何行。

如需创建 ip-masq-agent ConfigMap 并部署 ip-masq-agent DaemonSet,请参阅配置和部署 ip-masq-agent

检查 ip-masq-agent ConfigMap

如需检查您的集群是否正在运行 ip-masq-agent ConfigMap,请使用 Google Cloud CLI 或 Google Cloud 控制台。

gcloud

  1. 获取集群的凭据:

    gcloud container clusters get-credentials CLUSTER_NAME
    

    CLUSTER_NAME 替换为您的集群名称。

  2. kube-system 命名空间中描述 ip-masq-agent ConfigMap:

    kubectl describe configmaps/ip-masq-agent -n kube-system
    

    如果存在 ip-masq-agent ConfigMap,则输出类似于以下内容:

    Name:         ip-masq-agent
    Namespace:    kube-system
    Labels:       <none>
    Annotations:  <none>
    
    Data
    ====
    config:
    ----
    nonMasqueradeCIDRs:
      - 198.15.5.92/24
      - 10.0.0.0/8
    masqLinkLocal: false
    resyncInterval: 60s
    
    BinaryData
    ====
    
    Events:  <none>
    

    如果不存在 ip-masq-agent ConfigMap,则输出类似于以下内容:

    Error from server (NotFound): configmaps "ip-masq-agent" not found
    

控制台

  1. 转到 Google Cloud 控制台中的配置页面。

    转到“配置”

  2. 对于 过滤条件,请执行以下操作:

    1. 点击 以清除 Is system object: False 过滤条件。
    2. 过滤以下属性:
      • 名称ip-masq-agent
      • 集群:您的集群的名称。

    如果存在 ip-masq-agent ConfigMap,您可以在表中查看 ConfigMap 记录。如果不存在 ip-masq-agent ConfigMap,则不会显示任何行。

如果集群已有 ip-masq-agent ConfigMap,您可以对其进行配置和部署。

配置和部署 ip-masq-agent

本部分介绍如何创建或修改 ip-masq-agent ConfigMap 以及如何部署或删除 ip-masq-agent DaemonSet。如需确定您需要执行的任务,您必须先确定您的集群是否具有 ip-masq-agent ConfigMap 和 ip-masq-agent DaemonSet

创建 ip-masq-agent ConfigMap

以下步骤展示了如何创建 ip-masq-agent ConfigMap。如果您的集群已有 ip-masq-agent ConfigMap,则请修改现有 ip-masq-agent ConfigMap

  1. 使用以下模板创建配置文件并将其保存在本地。您可以对此配置文件的本地副本使用任何名称。

    nonMasqueradeCIDRs:
      - CIDR_1
      - CIDR_2
    masqLinkLocal: false
    resyncInterval: SYNC_INTERVALUNIT_OF_TIME
    

    替换以下内容:

    • CIDR_1CIDR_2:采用 CIDR 格式的 IP 地址范围。当数据包发送到这些目标时,您的集群将不会伪装 IP 地址来源,而是会保留来源 Pod IP 地址。如果您需要超过两个 CIDR,请按照相同格式向 nonMasqueradeCIDRs 列表添加更多条目。nonMasqueradeCIDRs 属性至少应包含集群的节点 IP 范围和 Pod IP 地址范围。

    • SYNC_INTERVAL:每个 ip-masq-agent Pod 检查 ip-masq-agent ConfigMap 内容并将任何更改写入其本地 /etc/config/ip-masq-agent 文件的间隔时间。默认值为 60

    • UNIT_OF_TIME:resyncInterval 的时间单位。有效值包括 s(以秒为单位)和 ms(以毫秒为单位)。默认值为 s

    除非需要为发送到链路本地 IPv4 地址的数据包启用伪装功能,否则请将 masqLinkLocal 设置为 false(默认值)。如需了解详情,请参阅伪装为链路本地目标

  2. 创建 ConfigMap 资源:

    kubectl create configmap ip-masq-agent \
       --namespace=kube-system \
       --from-file=config=LOCAL_CONFIG_FILE_PATH
    

    LOCAL_CONFIG_FILE_PATH 替换为您在上一步中创建的配置文件的路径。

  3. kube-system 命名空间中描述 ip-masq-agent ConfigMap:

    kubectl describe configmaps/ip-masq-agent -n kube-system
    

    输出内容类似如下:

    Name:         ip-masq-agent
    Namespace:    kube-system
    Labels:       <none>
    Annotations:  <none>
    
    Data
    ====
    config:
    ----
    nonMasqueradeCIDRs:
      - 198.15.5.92/24
      - 10.0.0.0/8
    masqLinkLocal: false
    resyncInterval: 60s
    
    BinaryData
    ====
    Events:  <none>
    
    

    此输出包含应用您所做的配置更改的 config 参数。您现在可以部署 ip-masq-agent DeamonSet

修改现有的 ip-masq-agent ConfigMap

您可以通过完成以下步骤修改现有 ip-masq-agent ConfigMap 的内容:

  1. 在文本编辑器中打开 ConfigMap:

    kubectl edit configmap ip-masq-agent --namespace=kube-system
    
  2. 修改 ConfigMap 文件的内容:

    apiVersion: v1
    data:
      config: |
        nonMasqueradeCIDRs:
          - CIDR_1
          - CIDR_2
        masqLinkLocal: false
        resyncInterval: SYNC_INTERVALUNIT_OF_TIME
    kind: ConfigMap
    metadata:
      name: ip-masq-agent
      namespace: kube-system
    

    替换以下内容:

    • CIDR_1CIDR_2:采用 CIDR 格式的 IP 地址范围。当数据包发送到这些目标时,您的集群将不会伪装 IP 地址来源,而是会保留来源 Pod IP 地址。如果您需要超过两个 CIDR,请按照相同格式向 nonMasqueradeCIDRs 列表添加更多条目。nonMasqueradeCIDRs 属性至少应包含集群的节点 IP 范围和 Pod IP 地址范围。

    • SYNC_INTERVAL:每个 ip-masq-agent Pod 检查 ip-masq-agent ConfigMap 内容并将任何更改写入其本地 /etc/config/ip-masq-agent 文件的间隔时间。默认值为 60

    • UNIT_OF_TIME:resyncInterval 的时间单位。有效值包括 s(以秒为单位)和 ms(以毫秒为单位)。默认值为 s

    除非需要为发送到链路本地 IPv4 地址的数据包启用伪装功能,否则请将 masqLinkLocal 设置为 false(默认值)。如需了解详情,请参阅伪装为链路本地目标

  3. kube-system 命名空间中描述 ip-masq-agent ConfigMap:

    kubectl describe configmaps/ip-masq-agent -n kube-system
    

    输出内容类似如下:

    Name:         ip-masq-agent
    Namespace:    kube-system
    Labels:       <none>
    Annotations:  <none>
    
    Data
    ====
    config:
    ----
    nonMasqueradeCIDRs:
      - 198.15.5.92/24
      - 10.0.0.0/8
    masqLinkLocal: false
    resyncInterval: 60s
    
    BinaryData
    ====
    
    Events:  <none>
    

    此输出包含 config 参数,该参数与您创建的文件中的配置值一致。

部署 ip-masq-agent DaemonSet

创建或修改 ip-masq-agent ConfigMap 后,部署 ip-masq-agent DaemonSet。

  1. 将以下清单保存为 YAML 文件:

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: ip-masq-agent
      namespace: kube-system
    spec:
      selector:
        matchLabels:
          k8s-app: ip-masq-agent
      template:
        metadata:
          labels:
            k8s-app: ip-masq-agent
        spec:
          hostNetwork: true
          containers:
          - name: ip-masq-agent
            image: gke.gcr.io/ip-masq-agent:v2.11.0-gke.23@sha256:f50757332ee45c0fb9f5856552a3ed16548c1de3c33c4e520a02d22e30af96ae
            args:
            # The masq-chain must be IP-MASQ
            - --masq-chain=IP-MASQ
            # To non-masquerade reserved IP ranges by default,
            # uncomment the following line.
            # - --nomasq-all-reserved-ranges
            # Must be set to false when using Dataplane V2.
            - --random-fully=false
            securityContext:
              privileged: false
              capabilities:
                drop: ["ALL"]
                add: ["NET_ADMIN", "NET_RAW"]
              allowPrivilegeEscalation: false
              seccompProfile:
                type: RuntimeDefault
            volumeMounts:
            - name: config-volume
              mountPath: /etc/config
          volumes:
          - name: config-volume
            configMap:
              name: ip-masq-agent
              optional: true
              items:
              - key: config
                path: ip-masq-agent
          tolerations:
          - effect: NoSchedule
            operator: Exists
          - effect: NoExecute
            operator: Exists
          - key: "CriticalAddonsOnly"
            operator: "Exists"

    此清单将创建名为 config-volume 的卷,该卷以容器的 volumeMount 指定的方式进行装载。

    如果您需要修改此清单,请考虑以下条件:

    • 卷名称可以是任何内容,但必须与容器的 volumeMount 名称一致。

    • ConfigMap 名称必须与 Pod 中的 config-volume 卷所引用的 configMap 的名称一致。

    • 链 (--masq-chain) 的名称必须是 IP-MASQ。否则,GKE 不会替换默认伪装规则。

    • DaemonSet Pod 会从 ip-masq-agent 文件中读取内容。ip-masq-agent 文件内容是 ConfigMap 中 config 键的值。

    • 如果默认使用非伪装预留 IP 地址范围,请取消注释 arg 部分中的 - --nomasq-all-reserved-ranges 行。

  2. 部署 DaemonSet:

    kubectl apply -f LOCAL_FILE_PATH
    

    LOCAL_FILE_PATH 替换为您在上一步中创建的文件的路径。

您可以手动更新您创建的 ip-masq-agent DaemonSet。如需了解详情,请参阅更新 DaemonSet

删除 ip-masq-agent

本部分介绍如何删除 ip-masq-agent DaemonSet 和 ip-masq-agent ConfigMap。删除 ip-masq-agent 不会还原节点上的现有 IP 伪装设置。

删除 ip-masq-agent DaemonSet

如果您手动创建了 ip-masq-agent DaemonSet,则可以通过运行以下命令将其删除:

kubectl delete daemonsets ip-masq-agent -n kube-system

删除 ip-masq-agent ConfigMap

如需完全删除 ip-masq-agent ConfigMap,请运行以下命令:

kubectl delete configmap ip-masq-agent -n kube-system

问题排查

以下部分提供了问题排查建议。

常规问题排查

以下步骤可帮助您诊断 IP 地址伪装问题:

问题:Pod IP 地址更改为节点 IP 地址

使用 IP 伪装代理时,您可能会注意到,当 Pod 与外部目的地通信时,Pod 的来源 IP 地址意外使用了节点的 IP 地址。

此问题是由自定义来源网络地址转换 (SNAT) 列表缺失或不完整所致。使用 IP 伪装代理时,如果 ConfigMap 缺失或不包含 nonMasqueradeCIDRs 列表,则会使用集群的默认 SNAT。当数据包离开 Pod 时,默认 SNAT 会将来源 IP 地址从 Pod 的 IP 地址更改为节点的内部 IP 地址。如需详细了解 SNAT,请参阅 IP 伪装代理

如需解决此问题,请在 ip-masq-agent ConfigMap 中定义 nonMasqueradeCIDRs 列表,以配置自定义 SNAT 列表:

  1. 打开 ip-masq-agent ConfigMap:

    kubectl edit configmap ip-masq-agent --namespace=kube-system
    
  2. 查看 ConfigMap 中的 nonMasqueradeCIDRs 列表。nonMasqueradeCIDRs 列表应存在且完整。例如:

    ...
    nonMasqueradeCIDRs:
      - 35.100.0.0/16
    ...
    
  3. 如果列表缺失或不完整,请添加或修改 nonMasqueradeCIDRs 列表,以添加要保留源 Pod IP 地址的目标 IP 地址范围。此列表还应包含您要使用 Cloud NAT 的地址。

    如果您不希望任何外部流量使用 SNAT,请将 nonMasqueradeCIDRs 字段设置为 0.0.0.0/0。例如:

    ...
    nonMasqueradeCIDRs:
      - 0.0.0.0/0
    ...
    

    如果流量不使用 SNAT,则无论目标为何,从 Pod 发送的所有数据包都会将 Pod 的 IP 地址保留为其来源 IP 地址。

  4. 检查 Pod 发出的出站数据包的来源 IP 地址。如需检查此地址,请进行数据包捕获。如果无法执行此操作,您可以使用以下命令检查节点的 IP 地址(应为要接受 SNAT 的出站数据包的来源 IP 地址):

    kubectl get nodes -o wide
    

后续步骤