配置 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。

检查 ip-masq-agent 状态

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

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

检查 ip-masq-agent DaemonSet

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

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
    

控制台

  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 Console。

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: k8s.gcr.io/networking/ip-masq-agent:v2.7.0
            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
            securityContext:
              privileged: true
            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

本部分介绍如何删除 ip-masq-agent DaemonSet 和 ip-masq-agent ConfigMap。

删除 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-masq-agent 的状态。如果未定义 ConfigMap,则所有默认目标的流量都不会伪装,而是保留 Pod IP 地址。到其他目标的流量会保留节点 IP 地址。
  • 确认 Pod 尝试到达的目标包含在 ConfigMap 的 nonMasqueradeCIDRs 中。如果目标不在 nonMasqueradeCIDRs 中,则流量会保留节点 IP 地址。
  • 确认目标允许节点和 Pod IP 地址范围。
  • 如果无法从节点或 Pod 访问流量,请运行连接测试

后续步骤