本页面介绍如何将在 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
控制台
转到 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.9.3-gke.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
行。
部署 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
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 访问流量,请运行连接测试。