Pages - Menu

2021年3月21日 星期日

[GCP]GKE訪問外網時的IP來源

前言

有時候我們會針對機器做白名單,通常IP給別人訪問,跟你去訪問別人的都是同一個。

但GCP『不是』,別人訪問,跟你去訪問別人是兩個不同的IP,

想想這樣也對,不然IP哪可能那麼多。

但我看之前別人設定的ip,常常搞不懂,為什麼對外ip是這個,最後才終於瞭解...


正文

為了要正確對應,讓其他機器開白名單,不得不弄清楚,到底怎麼一回事。
之前同事都說是走cloudNat,但我直接連去 vm or pod裡面,
用curl ifconfig.me 抓到的ip都不是我所知道的ip,
(ifconfig.me 是一個網址,單純顯示目前連去網站的ip位置)

CloudNAT 的基本概念,主要是可提供內部機器對外連線
ref. Cloud NAT 概覽

基本的設定方式,
ref. 使用 Cloud NAT

GCE沒有問題,基本上沒有外部ip而且又沒設定cloudNAT的話,就是無法連接外網。
然而有外部ip位置的話,Google Cloud 會自動對來源與該接口的主內部 IP 地址匹配的數據包執行一對一 NAT。
但GKE就有點問題了,就算沒有設定外部ip,還是能夠對外,
而且抓到的ip位置,你不知道是從何而來,也不是CloudNAT的IP

最後從問題排查這邊找到了答案,

確保您的 Google Kubernetes Engine (GKE) 集群是一個專用集群。非專用集群中的每個節點虛擬機都具有外部 IP 地址,因此每個節點都可以使用 Virtual Private Cloud (VPC) 網絡中下一個躍點為默認互聯網網關而不依賴 Cloud NAT 的路由。

簡單說,如果沒有設定專有集群(私有叢集),本身的node是具有對外的ip,所以還沒到CloudNAT之前,
就直接從node節點出去了。這部分可以到pod裡面 抓取對外ip,然後去比對,這個pod所在的node的對外ip就知道了。

ref. 建立私人叢集


結論:

GCE

看他的外部IP就是訪問外網的IP,如果VM沒有設定IP,除非你設定cloud nat,不然無法出去。

GKE

公開叢集,訪問外網的IP取決於你的pod在哪一個節點上(一個節點會建立一個GCE的VM)。

私有叢集,如果沒有設定Cloud Nat 一樣出不去




2021/04/19 更新

今天來算一下數學,

上面有提到,當設成私有叢集或是VM,需要對外連線時,
需設定cloud nat ip,
當對外連線數量不足時,會發生許多奇怪的問題,
例如,佈署 deployment ,會發生image pull error ,pod無法啟動,一直重開…等等。



(fig.1)

每個 VM 執行個體的最低通訊埠數量 :64
表示每台VM可以對外的連線數量。

假設(fig.1)
對外的ip有兩個,
一個對外ip可以提供 64512的 port 給裡面的來源子網路與IP使用,
而我們上面設定 每個 VM 執行個體的最低通訊埠數量 為 64 ,
故 64512 * 2/64 = 2016 可提供的VM數量
表示 來源子網路與 IP 範圍 的VPC網路 可以提供給2016 個VM (包含 GCE 跟 GKE的節點) 使用。

ref. Cloud NAT 地址和端口概覽

沒有留言:

張貼留言