This page explains how to configure clusters created in Google Kubernetes Engine (GKE)
Standard mode to perform IP masquerade
with the ip-masq-agent. For more information about IP masquerading in
GKE Autopilot mode,
see Use Egress NAT Policy to configure IP masquerade in Autopilot clusters.
Before you begin
Before you start, make sure that you have performed the following tasks:
- Enable the Google Kubernetes Engine API. Enable Google Kubernetes Engine API
- If you want to use the Google Cloud CLI for this task,
install and then
initialize the
gcloud CLI. If you previously installed the gcloud CLI, get the latest
version by running the
gcloud components updatecommand. Earlier gcloud CLI versions might not support running the commands in this document.
- Ensure that you have an existing Standard cluster. If you need one, create a Standard cluster.
Checking ip-masq-agent status
This section shows you how to:
- Determine whether your cluster has an
ip-masq-agentDaemonSet. - Check the
ip-masq-agentConfigMap resource.
Check the ip-masq-agent DaemonSet
To check if your cluster is running the ip-masq-agent DaemonSet, use the
Google Cloud CLI or the Google Cloud console.
gcloud
Get the credentials for your cluster:
gcloud container clusters get-credentials CLUSTER_NAMEReplace
CLUSTER_NAMEwith the name of your cluster.Search for the
ip-masq-agentin thekube-systemnamespace:kubectl get daemonsets/ip-masq-agent -n kube-systemIf the
ip-masq-agentDaemonSet exists, then the output is similar to the following:NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE ip-masq-agent 3 3 3 3 3 <none> 13dIf the
ip-masq-agentDaemonSet does not exist, then the output is similar to the following:Error from server (NotFound): daemonsets.apps "ip-masq-agent" not foundCheck if the
ip-masq-agentDaemonSet is running the latest version:kubectl get daemonsets/ip-masq-agent -n kube-system -o jsonpath='{.spec.template.spec.containers[].image}'This command must return the same container image as specified in Deploying the ip-masq-agent DaemonSet.
Console
Go to the Workloads page in the Google Cloud console.
For Filter, do the following:
- Click to clear the Is system object: False filter.
- Filter the following properties:
- Name:
ip-masq-agent. - Cluster: the name of your cluster.
- Name:
If
ip-masq-agentDaemonSet exists, then you can see the DaemonSet record in the table. Ifip-masq-agentDaemonSet does not exist, then no rows are displayed.
To create the ip-masq-agent ConfigMap and deploy the ip-masq-agent DaemonSet,
refer to Configuring and deploying the ip-masq-agent.
Checking the ip-masq-agent ConfigMap
To check if your cluster is running the ip-masq-agent ConfigMap, use the
Google Cloud CLI or the Google Cloud console.
gcloud
Get the credentials for your cluster:
gcloud container clusters get-credentials CLUSTER_NAMEReplace
CLUSTER_NAMEwith the name of your cluster.Describe the
ip-masq-agentConfigMap in thekube-systemnamespace:kubectl describe configmaps/ip-masq-agent -n kube-systemIf the
ip-masq-agentConfigMap exists, then the output is similar to the following: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>If the
ip-masq-agentConfigMap does not exist, then the output is similar to the following:Error from server (NotFound): configmaps "ip-masq-agent" not found
Console
Go to the Configuration page in the Google Cloud console.
For Filter, do the following:
- Click to clear the Is system object: False filter.
- Filter the following properties:
- Name:
ip-masq-agent. - Cluster: the name of your cluster.
- Name:
If
ip-masq-agentConfigMap exists, then you can see the ConfigMap record in the table. Ifip-masq-agentConfigMap does not exist, then no rows are displayed.
If the cluster already has the ip-masq-agent ConfigMap, you can configure and
deploy it.
Configuring and deploying the ip-masq-agent
This section shows you how to create or edit the ip-masq-agent
ConfigMap and how to deploy or delete the ip-masq-agent DaemonSet. To
determine which tasks you need to perform, you must first determine whether your
cluster already has the ip-masq-agent ConfigMap and ip-masq-agent
DaemonSet.
Creating the ip-masq-agent ConfigMap
The following steps show how to create the ip-masq-agent ConfigMap. If
your cluster already has the ip-masq-agent ConfigMap, edit an existing
ip-masq-agent ConfigMap instead.
Create a configuration file using the following template and save it locally. You can use any name for the local copy of this configuration file.
nonMasqueradeCIDRs: - CIDR_1 - CIDR_2 masqLinkLocal: false resyncInterval: SYNC_INTERVALUNIT_OF_TIMEReplace the following:
CIDR_1andCIDR_2: the IP address ranges in CIDR format. When packets are sent to these destinations, your cluster does not masquerade IP address sources and preserves source Pod IP addresses. If you need more than two CIDRs, add more entries to thenonMasqueradeCIDRslist following the same format. At minimum, thenonMasqueradeCIDRsproperty should include the node and Pod IP address ranges of your cluster.SYNC_INTERVAL: the amount of time after which eachip-masq-agentPod checks the contents of theip-masq-agentConfigMap and writes any changes to its local/etc/config/ip-masq-agentfile. Defaults to60.UNIT_OF_TIME: the unit of time for the resyncInterval. Valid values includes(for seconds) orms(for milliseconds). Defaults tos.
Set
masqLinkLocalto false (the default) unless you need to enable masquerading for packets sent to link local IPv4 addresses. For more information, see Masquerading to link-local destinations.Create the ConfigMap resource:
kubectl create configmap ip-masq-agent \ --namespace=kube-system \ --from-file=config=LOCAL_CONFIG_FILE_PATHReplace
LOCAL_CONFIG_FILE_PATHwith the path to the config file you created in the previous step.Describe the
ip-masq-agentConfigMap in thekube-systemnamespace:kubectl describe configmaps/ip-masq-agent -n kube-systemThe output is similar to the following:
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>This output includes the
configparameter with your configuration changes. You can now deploy theip-masq-agentDeamonSet.
Editing an existing ip-masq-agent ConfigMap
You can modify the contents of an existing ip-masq-agent ConfigMap by
completing the following steps:
Open the ConfigMap in a text editor:
kubectl edit configmap ip-masq-agent --namespace=kube-systemEdit the content of the ConfigMap file:
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-systemReplace the following:
CIDR_1andCIDR_2: the IP address ranges in CIDR format. When packets are sent to these destinations, your cluster does not masquerade IP address sources and preserves source Pod IP addresses. If you need more than two CIDRs, add more entries to thenonMasqueradeCIDRslist following the same format. At minimum, thenonMasqueradeCIDRsproperty should include the node and Pod IP address ranges of your cluster.SYNC_INTERVAL: the amount of time after which eachip-masq-agentPod checks the contents of theip-masq-agentConfigMap and writes any changes to its local/etc/config/ip-masq-agentfile. Defaults to60.UNIT_OF_TIME: the unit of time for the resyncInterval. Valid values includes(for seconds) orms(for milliseconds). Defaults tos.
Set
masqLinkLocalto false (the default) unless you need to enable masquerading for packets sent to link local IPv4 addresses. For more information, see Masquerading to link-local destinations.Describe the
ip-masq-agentConfigMap in thekube-systemnamespace:kubectl describe configmaps/ip-masq-agent -n kube-systemThe output is similar to the following:
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>This output includes the
configparameter which matches the configuration value from the file you created.
Deploying the ip-masq-agent DaemonSet
After you create or edit your ip-masq-agent ConfigMap, deploy the
ip-masq-agent DaemonSet.
Save the following manifest as a YAML file:
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.12.3-gke.4@sha256:b5db41ddaf863b660da330322714f668101482b528829c50c53229d901d11af5 args: - --v=2 - --logtostderr=false - --log_file=/dev/stdout - --log_file_max_size=0 # 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"
This manifest creates a volume named
config-volumewhich is mounted as specified by the container's volumeMount.If you need to edit this manifest, consider the following conditions:
The volume name can be anything but must match the container's
volumeMountname.The ConfigMap name must match the name of the
configMapreferenced in theconfig-volumeVolume in the Pod.The name of the chain (
--masq-chain) must beIP-MASQ. Otherwise, GKE does not override the default masquerading rules.DaemonSet Pods read from the
ip-masq-agentfile. Theip-masq-agentfile content is the value of theconfigkey in the ConfigMap.If you use non-masquerade reserved IP ranges by default, uncomment the
- --nomasq-all-reserved-rangesline in theargsection.
Deploy the DaemonSet:
kubectl apply -f LOCAL_FILE_PATHReplace
LOCAL_FILE_PATHwith the path to the file you created in the previous step.
You can manually update the ip-masq-agent DaemonSet you created. To learn more, see
Updating a DaemonSet.
Deleting the ip-masq-agent
This section shows you how to delete the ip-masq-agent DaemonSet and the
ip-masq-agent ConfigMap. Deleting the ip-masq-agent doesn't revert the existing
IP masquerading settings on the nodes.
Deleting the ip-masq-agent DaemonSet
If you manually created the ip-masq-agent DaemonSet, you can delete it by
running the following command:
kubectl delete daemonsets ip-masq-agent -n kube-system
Deleting the ip-masq-agent ConfigMap
To completely delete the ip-masq-agent ConfigMap, run the following command:
kubectl delete configmap ip-masq-agent -n kube-system
Troubleshooting
The following sections provide troubleshooting advice.
General troubleshooting
The following steps help you diagnose issues with IP address masquerading:
- Confirm the status of the
ip-masq-agent. If the ConfigMap is not defined, traffic to all default destinations is not masqueraded and preserves the Pod IP address. Traffic to other destinations preserves the node IP address. - Confirm the version of the
ip-masq-agentimage specified in the DaemonSet. If the version of theip-masq-agentDaemonSet is not the latest, follow the deployment steps to update the DaemonSet. - Check whether the IP-MASQ chain is correctly populated in the NAT IP tables by running the
sudo iptables -t nat -L IP-MASQcommand in the impacted node. If thenonMasqueradeCIDRsdefined in the ConfigMap is not showing up on the NAT IP Tables, verify that there are no typos in the config file that was used to create the ConfigMap. - Confirm that the destination allows both the node and Pod IP address ranges.
- If traffic is not accessible from the node or Pod, run a connectivity test.
Issue: Pod IP address changes to node IP address
While using an IP masquerade agent, you might notice the Pod's source IP address unexpectedly use the node's IP address when your Pods communicate with external destinations.
The issue is caused by a missing or incomplete custom Source Network Address
Translation (SNAT) list. When you use an IP masquerade agent, the default SNAT
of the cluster is used when the ConfigMap is missing or it doesn't contain a
nonMasqueradeCIDRs list. When a packet leaves a Pod, the default SNAT changes
the source IP address from the Pod's IP address to the node's internal IP
address. To learn more about SNAT, see
IP masquerade agent.
To resolve the issue, configure a custom SNAT list by defining a
nonMasqueradeCIDRs list in the ip-masq-agent ConfigMap:
Open the
ip-masq-agentConfigMap:kubectl edit configmap ip-masq-agent --namespace=kube-systemReview the
nonMasqueradeCIDRslist within the ConfigMap. ThenonMasqueradeCIDRslist should be present and complete. For example:... nonMasqueradeCIDRs: - 35.100.0.0/16 ...If the list is missing or incomplete, add or modify the
nonMasqueradeCIDRslist to include the destination IP ranges for which you want to preserve source Pod IP addresses. This list should also include the addresses that you want to use Cloud NAT.If you don't want any external traffic to use SNAT, set the
nonMasqueradeCIDRsfield to0.0.0.0/0. For example:... nonMasqueradeCIDRs: - 0.0.0.0/0 ...When your traffic doesn't use SNAT, all packets sent from Pods retain the Pod's IP address as their source IP address, regardless of destination.
Check the source IP address of outbound packets from your Pods. To check this address, take a packet capture. If that's not feasible, you can check the IP address of the node, which should be the source IP address of outbound packets subject to SNAT, with the following command:
kubectl get nodes -o wide
What's next
- Learn how to use Egress NAT Policy to configure IP masquerade in Autopilot clusters.
- Learn how to create a VPC-native cluster.
- Read the GKE network overview.
- Learn about configuring authorized networks.