透過GCP Cloud NAT固定GKE Pod存取外網的ip

2024/02/20

Cloud NAT

GCP的Cloud NAT服務提供NAT服務(網路位址轉譯)

可以讓VM或k8s Pod在不公開ip的情況下訪問internet

並且都是透過同public ip訪問

這樣可達到

1. 避免VM or Pod暴露ip

2. 使用限制僅固定ip能存取的一些第三方服務

 

GKE Cluster設定

首先建立GKE cluster的時候

必須選擇private cluster類型

這點很重要如果沒設定成private cluster的話

訪問internet的時候將不是透過NAT的固定ip

gke-private-cluster.png

 

建立固定IP

在GCP console的VPC > IP Address頁面

先建立一個固定IP準備後續給NAT服務使用

 

Cloud NAT設定

 

基本設定

首先需要建立一個Cloud router

基本上設定一個名稱然後其他設定用預設值就可以了

然後設定好Network、Region、Router即可

image.png

 

NAT Mapping

Source endpoint type設定為VM Instance

Cloud NAT IP Address設定為手動

並選擇前面建立的固定IP

nat-gateway.png

 

 

驗證傳出Pod的IP

 

建立一個alpine的deployment並安裝curl

apiVersion: apps/v1
kind: Deployment
metadata:
  name: alpine-curl 
  labels:
    app: alpine-curl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: alpine-curl
  minReadySeconds: 5
  template:
    metadata:
      labels:
        app: alpine-curl
    spec:
      containers: 
        - name: alpine-curl
          image: alpine:latest
          imagePullPolicy: Always
          command:
            - /bin/sh
            - -c
            - |
              apk update
              apk add curl
              tail -f /dev/null
          resources:
            limits:
              cpu: 1
              memory: 2Gi
            requests:
              cpu: 500m
              memory: 1Gi

 

在Container內發出curl請求

透過httpbin.org/ip來驗證Pod傳出的IP是不是跟NAT使用的IP相同

image.png