本页面介绍如何将在 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
获取集群的凭据:
gcloud container clusters get-credentials CLUSTER_NAME
将
CLUSTER_NAME
替换为您的集群名称。在
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
检查
ip-masq-agent
DaemonSet 是否运行的是最新版本:kubectl get daemonsets/ip-masq-agent -n kube-system -o jsonpath='{.spec.template.spec.containers[].image}'
此命令必须返回与部署 ip-masq-agent DaemonSet 中指定的容器映像相同的容器映像。
控制台
转到 Google Cloud 控制台中的工作负载页面。
对于
过滤条件,请执行以下操作:- 点击 以清除 Is system object: False 过滤条件。
- 过滤以下属性:
- 名称:
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
获取集群的凭据:
gcloud container clusters get-credentials CLUSTER_NAME
将
CLUSTER_NAME
替换为您的集群名称。在
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
控制台
转到 Google Cloud 控制台中的配置页面。
对于
过滤条件,请执行以下操作:- 点击 以清除 Is system object: False 过滤条件。
- 过滤以下属性:
- 名称:
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。
使用以下模板创建配置文件并将其保存在本地。您可以对此配置文件的本地副本使用任何名称。
nonMasqueradeCIDRs: - CIDR_1 - CIDR_2 masqLinkLocal: false resyncInterval: SYNC_INTERVALUNIT_OF_TIME
替换以下内容:
CIDR_1
和CIDR_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(默认值)。如需了解详情,请参阅伪装为链路本地目标。创建 ConfigMap 资源:
kubectl create configmap ip-masq-agent \ --namespace=kube-system \ --from-file=config=LOCAL_CONFIG_FILE_PATH
将
LOCAL_CONFIG_FILE_PATH
替换为您在上一步中创建的配置文件的路径。在
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 的内容:
在文本编辑器中打开 ConfigMap:
kubectl edit configmap ip-masq-agent --namespace=kube-system
修改 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_1
和CIDR_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(默认值)。如需了解详情,请参阅伪装为链路本地目标。在
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。
将以下清单保存为 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
行。
部署 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 地址伪装问题:
- 确认
ip-masq-agent
的状态。如果未定义 ConfigMap,则所有默认目标的流量都不会伪装,而是保留 Pod IP 地址。到其他目标的流量会保留节点 IP 地址。 - 确认 DaemonSet 中指定的
ip-masq-agent
映像的版本。 如果ip-masq-agent
DaemonSet 的版本不是最新版本,请按照部署步骤更新 DaemonSet。 - 在受影响的节点中运行
sudo iptables -t nat -L IP-MASQ
命令,检查 IP-MASQ 链是否已正确填充到 NAT IP 表中。如果 ConfigMap 中定义的nonMasqueradeCIDRs
未显示在 NAT IP 表中,请验证用于创建 ConfigMap 的配置文件中是否有拼写错误。 - 确认目标允许节点和 Pod IP 地址范围。
- 如果无法从节点或 Pod 访问流量,请运行连接测试。
问题: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 列表:
打开
ip-masq-agent
ConfigMap:kubectl edit configmap ip-masq-agent --namespace=kube-system
查看 ConfigMap 中的
nonMasqueradeCIDRs
列表。nonMasqueradeCIDRs
列表应存在且完整。例如:... nonMasqueradeCIDRs: - 35.100.0.0/16 ...
如果列表缺失或不完整,请添加或修改
nonMasqueradeCIDRs
列表,以添加要保留源 Pod IP 地址的目标 IP 地址范围。此列表还应包含您要使用 Cloud NAT 的地址。如果您不希望任何外部流量使用 SNAT,请将
nonMasqueradeCIDRs
字段设置为0.0.0.0/0
。例如:... nonMasqueradeCIDRs: - 0.0.0.0/0 ...
如果流量不使用 SNAT,则无论目标为何,从 Pod 发送的所有数据包都会将 Pod 的 IP 地址保留为其来源 IP 地址。
检查 Pod 发出的出站数据包的来源 IP 地址。如需检查此地址,请进行数据包捕获。如果无法执行此操作,您可以使用以下命令检查节点的 IP 地址(应为要接受 SNAT 的出站数据包的来源 IP 地址):
kubectl get nodes -o wide