iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0

https://ithelp.ithome.com.tw/upload/images/20240918/20169017LAiuPjkGrq.png

前言

在雲端世界中,跨越不同 VPC 的網路連線需求日益增加。Day2 有提到,位於不同 VPC 下的 GKE 較難使用 VPC Peering 的方式來連接不同專案下的 GKE。

因此使用 GCP 的 Cloud VPN 提供了一個安全、高效的解決方案,讓您輕鬆串接兩個不同 VPC 下的 GKE 群集。這篇文章將帶領您深入了解 Cloud VPN 的運作原理,並詳細說明如何利用它來建立跨 VPC 的安全連線,讓您的 GKE 群集能無縫協作,提升應用程式效能與可擴展性。

Cloud VPN 簡介

Cloud VPN 通過 IPsec VPN 連接,將您的對等網絡安全地擴展到虛擬私有雲 (VPC) 網絡。VPN 連接會對網絡之間傳輸的流量進行加密,其中一個 VPN 網關處理加密,另一個網關處理解密。此過程可以保護傳輸中的數據。您還可以通過連接兩個 Cloud VPN 實例將兩個 VPC 網絡連接在一起。您無法使用 Cloud VPN 將流量路由到公共互聯網;它專為專用網絡之間的安全通信而設計。

示範

昨天已經創建好了私有的GKE,因為 Contral Plane 不具備公網 IP,無法在自己的電腦上訪問他,必須依賴 Proxy 或是 VPN 之類的流量轉發工具,因此我們先在 ithome-202409-demo-vpc 下的ithome-202409-demo-us-central1-subnet 下建立 Compute Engine

https://ithelp.ithome.com.tw/upload/images/20240918/20169017egLivjqLxt.png

完成後先點擊右側的 SSH,記得防火牆要開 allow iap ssh,否則無法透過 GCP 的 UI SSH

IAP Firewall 的文件:https://blog.cloud-ace.tw/identity-security/iap-tcp-forwarding/

接下來將自己身份的 IAM 加上 GKE 的訪問權限,SSH 進到機器後使用以下命令登入自己的身份

$ gcloud auth login

然後轉到 GKE 的頁面點擊連結的按鈕,會顯示要連結 GKE 叢集所需要輸入的指令

$ gcloud container clusters get-credentials $GKE叢集名稱 --region $地區 --project $專案名稱

https://ithelp.ithome.com.tw/upload/images/20240918/201690170lsA6KvNM6.png

使用 kubectl get nodes 指令檢查是否可以連接到叢集

https://ithelp.ithome.com.tw/upload/images/20240918/20169017rApmghZOUG.png

如果 Compute Engine 一直無法連接到 GKE Contral Plane,很可能是網路不通,可以使用 GCP 的Network Intelligence 服務,Network Intelligence 是一款超實用的工具,可以解決 GCP 中常見網路效能問題。

Network Intelligence 教學:https://ikala.cloud/network-performance-troubleshooting-tools/

測試我們剛剛建立的那台 Compute Engine 是不是可以連接到 GKE Contral Plane(IP:172.16.4.162),測試後封包都有正常的收送,如圖

https://ithelp.ithome.com.tw/upload/images/20240918/20169017vi3FduA6P1.png

以上示範的機器和 GKE 都是存在同一個 VPC 下,那如果將 VM 及 GKE 使用不同的 VPC,應該如何讓兩個 VPC 聯通且可以控制彼此的 GKE Control Plane。

這裡就要先介紹 GKE 的架構了,Google 設計了一個基於 Private Service Connect (PSC) 的全新的 GKE control plane 連線框架,並宣布了一套包含 control plane 和 node pool 層級隔離的新功能套組,以實現更安全、更擴展、更便宜的 GKE 叢集。

Node Pool 是在我們建立的 Shared VPC 內,但是 GKE Control Plane 另一個GCP代管的專案底下的VPC,分別屬於不同的專案,彼此依靠 Private Service Connect (PSC),因此使用者無法控制 GCP代管的專案,如下圖

https://ithelp.ithome.com.tw/upload/images/20240918/20169017erVdpF3HDK.png

在建立 GKE 時會將 Node pool 所在的 VPC 中的路由廣播出去並寫進 GCP 代管的 Project 下的 VPC 路由表。

由於代管的Project下的 VPC 沒有 Proxy VPC 的路由表,會導致封包丟失,因此需要使用 Cloud VPN 的方式拉一條 site to site 的專線將兩個 VPC 連接起來,才能將另一個VPC的路由廣播到 GCP 代管的 Project ,如下圖

https://ithelp.ithome.com.tw/upload/images/20240918/201690175NqvVM2MdM.png

如果預算充足或是有大量集群,會建議將 CICD 及 Monitoring 以及各種環境的 Subnet, GKE 及其他服務各自獨立出來,如果使用 Shared VPC 就不需經過其他設定即可彼此連通,但是遇到跨 VPC 的情況就要設定 Cloud VPN 連接,使 CICD 的 GKE 可以連接各個環境的 GKE Control Plane。

以下示範,再建立一個 Proxy 所使用的 VPC

https://ithelp.ithome.com.tw/upload/images/20240918/20169017Eflb0sKEBc.png

接下來要建立高可用性 VPN,有另一種比較簡易版的 VPN 是傳統性 VPN,在正式環境中較少使用,這裡就不做示範了。

高可用性 VPN 簡介

高可用性 VPN 是一種高可用性 (HA) Cloud VPN 解決方案,可讓您通過 IPsec VPN 連接將您的本地網絡安全地連接到 VPC 網絡。創建高可用性 VPN 網關時,Google Cloud 會自動選擇兩個外部 IPv4 地址,每個接口對應一個地址。每個 IPv4 地址都是從唯一地址池中自動選取的,以支持高可用性。每個高可用性 VPN 網關接口都支持多個隧道。
在 API 文檔和 gcloud 命令中,高可用性 VPN 網關稱為 VPN 網關,而不是目標 VPN 網關。您無需為高可用性 VPN 網關創建任何轉發規則。

設置高可用性 VPN 時,請考慮以下準則:

  • 將一個高可用性 VPN 網關連接到另一個高可用性 VPN 網關時,這兩個網關必須使用相同的 IP 堆棧類型。例如,如果您創建了一個使用棧類型 IPV4_IPV6 的高可用性 VPN 網關,那麽另一個高可用性 VPN 網關也必須設置為 IPV4_IPV6。

  • 從 Cloud VPN 網關的角度配置兩個 VPN 隧道:

    • 如果有兩個對等 VPN 網關設備,則來自 Cloud VPN 網關上每個接口的每個隧道都必須連接到自己的對等網關。
    • 如果有一個包含兩個接口的對等 VPN 網關設備,則來自 Cloud VPN 網關上每個接口的每個隧道都必須連接到對等網關上相應隧道自己的接口。
    • 如果有一個包含單個接口的對等 VPN 網關設備,則來自 Cloud VPN 網關上每個接口的兩個隧道都必須連接到對等網關上的相同接口。
  • 對等 VPN 網關設備必須支持動態邊界網關協議 (BGP) 路由。

    下圖演示了高可用性 VPN 概念,其中顯示了一個拓撲,該拓撲包含連接到兩個對等 VPN 網關的高可用性 VPN 網關的兩個接口。

https://ithelp.ithome.com.tw/upload/images/20240918/20169017CwkrsF21Fr.png
以下使用 Terraform 建立

# main.tf

module "vpn_ha-1" {
  source            = "terraform-google-modules/vpn/google//modules/vpn_ha"
  version           = "~> 4.0"
  project_id        = var.vpn_ha-1_project_id
  region            = var.vpn_ha-1_region
  network           = "https://www.googleapis.com/compute/v1/projects/${var.vpn_ha-1_project_id}/global/networks/${var.vpn_ha-1_network}"
  name              = var.vpn_ha-1_name
  peer_gcp_gateway  = module.vpn_ha-2.self_link
  router_asn        = 64514

  tunnels = {
    remote-0 = {
      bgp_peer = {
        address = "169.254.1.1"
        asn     = 64513
      }
      bgp_peer_options                = null
      bgp_session_range               = "169.254.1.2/30"
      ike_version                     = 2
      vpn_gateway_interface           = 0
      peer_external_gateway_interface = null
      shared_secret                   = ""
    }

    remote-1 = {
      bgp_peer = {
        address = "169.254.2.1"
        asn     = 64513
      }
      bgp_peer_options                = null
      bgp_session_range               = "169.254.2.2/30"
      ike_version                     = 2
      vpn_gateway_interface           = 1
      peer_external_gateway_interface = null
      shared_secret                   = ""
    }

  }
}

module "vpn_ha-2" {
  source              = "terraform-google-modules/vpn/google//modules/vpn_ha"
  version             = "~> 4.0"
  project_id          = var.vpn_ha-2_project_id
  region              = var.vpn_ha-2_region
  network             = "https://www.googleapis.com/compute/v1/projects/${var.vpn_ha-2_project_id}/global/networks/${var.vpn_ha-2_network}"
  name                = var.vpn_ha-2_name
  router_asn          = 64513
  peer_gcp_gateway    = module.vpn_ha-1.self_link

  tunnels = {
    remote-0 = {
      bgp_peer = {
        address = "169.254.1.2"
        asn     = 64514
      }
      bgp_session_range               = "169.254.1.1/30"
      ike_version                     = 2
      vpn_gateway_interface           = 0
      shared_secret                   = module.vpn_ha-1.random_secret
    }

    remote-1 = {
      bgp_peer = {
        address = "169.254.2.2"
        asn     = 64514
      }
      bgp_session_range               = "169.254.2.1/30"
      ike_version                     = 2
      vpn_gateway_interface           = 1
      shared_secret                   = module.vpn_ha-1.random_secret
    }

  }
}
# variable.tf

variable "vpn_ha-1_project_id" {
  description = "ha-1 GCP project ID"
  type        = string
  default     = "ithome-202409-demo"
}

variable "vpn_ha-1_region" {
  description = "ha-1 region"
  type        = string
  default     = "us-central1"
}

variable "vpn_ha-1_network" {
  description = "ha-1 network"
  type        = string
  default     = "ithome-202409-demo-vpc"
}

variable "vpn_ha-1_name" {
  description = "ha-1 VPN Gateway name"
  type        = string
  default     = "ithome-202409-demo-vpc-to-proxy-vpn-gw"
}

variable "vpn_ha-2_project_id" {
  description = "ha-2 GCP project ID"
  type        = string
  default     = "ithome-202409-demo"
}

variable "vpn_ha-2_region" {
  description = "ha-2 region"
  type        = string
  default     = "us-central1"
}

variable "vpn_ha-2_network" {
  description = "ha-2 network"
  type        = string
  default     = "proxy"
}

variable "vpn_ha-2_name" {
  description = "ha-2 VPN Gateway name"
  type        = string
  default     = "proxy-to-ithome-202409-demo-vpc-vpn-gw"
}

進入 Cloud VPN 的頁面,點選 Cloud VPN 閘道,會發現在兩個要連接的 VPC 下各別建立了一個 Gateway,同時為了高可用,每個 Gateway 底下分別有兩個外部 IP

https://ithelp.ithome.com.tw/upload/images/20240918/20169017nKRQDbU9N2.png

點選 Cloud VPN 通道,可觀察到 Cloud VPN 閘道 (IP),為對方 VPC 的對等互連 VPN 閘道 (IP)

https://ithelp.ithome.com.tw/upload/images/20240918/20169017d5rcxGCzB5.png

GCP會自動檢查是否成功,成功後會有綠色勾勾。
接下來進到Network Intelligence的頁面檢查剛剛建立的VPN是否正常聯通兩個VPC,先在Porxy的Subnet建立一台VM(another-vpc-test)

https://ithelp.ithome.com.tw/upload/images/20240918/20169017NQqdkAEiQi.png

選擇來源為Porxy的Subnet建立的那台VM(another-vpc-test),目的地為ithome-202409-demo-vpc下的demo2-cluster GKE的Control Plane,點擊建立。

https://ithelp.ithome.com.tw/upload/images/20240918/20169017IzYziNnCnH.png

成功畫面

https://ithelp.ithome.com.tw/upload/images/20240918/20169017dTp5V45j94.png

進到 Cloud Router 頁面檢查,可以看到此 VPN 的路由器有建立出來
https://ithelp.ithome.com.tw/upload/images/20240924/2016901732S3ZNIEam.png

點擊進去,查看 GKE Controll Plane 的IP 是否有Advertise 的路徑 自動廣播出去
https://ithelp.ithome.com.tw/upload/images/20240924/20169017GZCZpQCm4b.png

如果沒有則需要手動添加
https://ithelp.ithome.com.tw/upload/images/20240924/20169017fOrRZKUllG.png

總結

這篇文章展示了如何使用 Terraform 在 Google Cloud Platform (GCP) 上建立高可用性 (HA) VPN。我們部署了兩個 Cloud VPN 閘道,每個閘道可以位於不同的區域,以確保網路冗餘。這些閘道連接到在不同 VPC 中運行的兩個對等閘道,從而建立了一個安全的通道,實現 VPC 間的通訊。

Terraform 的基礎架構即程式碼 (IaC) 方法簡化了部署流程,確保一致性和可重複性。透過這項設定,我們實現了一個具有彈性和容錯能力的 VPN 解決方案,使其成為需要可靠網路連線的企業的理想選擇。

未來,如果讀者有近一步的雲地混合需求,也可以使用這樣的配置,只需要將其中一個 VPC 網關改成地端網路的外部網關即可。

文件


上一篇
Day3 Terraform 馭雲術:打造我的 GKE 容器帝國
下一篇
Day5 域名解析的利器 GCP Cloud DNS
系列文
異世界生存戰記:30天煉成GKE大師30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言