透過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

建立固定IP
在GCP console的VPC > IP Address頁面
先建立一個固定IP準備後續給NAT服務使用
Cloud NAT設定
基本設定
首先需要建立一個Cloud router
基本上設定一個名稱然後其他設定用預設值就可以了
然後設定好Network、Region、Router即可

NAT Mapping
Source endpoint type設定為VM Instance
Cloud NAT IP Address設定為手動
並選擇前面建立的固定IP

驗證傳出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相同
