IaC with Terraform 20
前面課程有完成EKS的部分,過程曾經透過以下不同方式建置EKS Cluster:
- AWS Management Console(Web UI)
- eksctl
過程中也了解到建置EKS Cluster對應到AWS上的資源建立
可以拆成八大部分(詳EKS筆記2):
1.先建立EKS IAM Role
2.針對Worker Nodes建立VPC
3.建置EKS叢集(Master Nodes)
4.透過kubectl工具連線至EKS叢集
5.另外再建立EC2 IAM Role用來建立Node Group
6.建立Node Group並且可以接觸到EKS叢集
7.為叢集設定Auto-scaling
8.透過kubectl工具,實際部署應用程式到EKS上
也就是有許多的AWS資源要建立與設定,許多是AWS在背後協助的建立的
然而就...
- No version control (history)
- no simple replication of infrastructure possible
- no simple clean-up
- team collaboration difficult
並且提及N年前CNCF的survey中,超過半數的K8s叢集運行在AWS上:
不過上面這個我找到是2018的結果,現在就不知道怎麼樣了
但是很合理的應當使用Terraform架設與管理
因為在AWS上面手動兜出EKS也是很複雜的
從之前EKS課程筆記中知道EKS建置上需要的各種AWS服務元件
- 會需要Control Plane且是由AWS來管理,但還是要建!是在EKS服務內
- 還需要VPC
- 才能建置worker node(使用EC2 Instance或是Node Group)
- 這些建置都基於特定的region以及其AZ
2023/10/21補充說明:
我後來也找到有HashiCorp官網範例:
上面內容跟下面筆記滿相似的,但是每個參數解釋甚少
不像課程內容比較鉅細靡遺講解每個參數的作用
可依照下面課程內容建置
VPC
首先專案從main切到新的branch →feature/eks
接著移除裡面的main.tf,準備重新建立VPC
原本是可以使用Cloudformation template來建立相關EKS所需的VPC資源
前面Terraform建立EC2用的VPC只是簡單的範例並且只有一個subnet
但是這邊就要另建VPC資源,透過AWS的VPC的Terraform module:
會建立出很多資源像是vpc,subnet,route table等等:
移除既有的main.tf
新增vpc.tf貼上上述程式並調整一下名稱:
有撰寫上述內容檔案後,執行init指令即可觸發下載module
講師舊版有要求有14個必要參數要給
我挑的版本看起來都有預設值不用給也沒差,這邊就照講師有輸入的撰寫
這邊要特別提到EKS建立的BP(Best Practice):
1 private and 1 public subnet in each AZ
先定義填入以下input資訊:
其中變數檔案terraform.tfvars內容:
如上先指定好要建立的CIDR與共六個的Subnet的IP範圍
接著還要定義VPC所有的AZ陣列:
所以過程中需要找到取得az資訊的DataSource:
並且要取得名稱陣列資料:
但是上面的資訊內容源自aws provider才能拿到,所以前面要先宣告:
最後寫成:
接著還要設定其它attribute:
再來增加個Tag來增加說明:
這個tag原本作用就只是讓人更容易理解這座EKS是做什麼用的
另外這個tag還有另一個用途在於程式自動化地讓元件透過label參照到其他的元件
(例如EKS當建立Control Plane其中一個程序是Cloud Controller Manager)
這個Cloud Controller Manager也就是由AWS建立的,它會自動連線到VPC,連線到Subnet,連線到Worker Node…等等,去透過我們的AWS帳號去跟這些元件溝通並建立元件等
所以我們要提供給Cloud Controller Manager:
- Which resources to talk to?
- Which VPC should be used?
- Which subnet should be used?
最後讓所建立的EKS的各種元件都能跟我們定義的VPC與Subnet綁定
我們可能有天會建立一大堆VPC與一堆Subnet
要讓AWS知道這一座EKS要使用哪一個VPC或Subnet
所以要幫這VPC打上label(也就是上面的tags)來辨識用
所以還要訂給Subnet的Tag:
但是針對public/private subnet上,還要額外增加tag內容:
當我們在K8S裡面建立Loadbalace Service元件時
K8S會同時provisioning(供應)Cloud native Loadbalancer來對應上述Service元件
但是這個Cloud native Loadbalancer只會(也應該)建立在Public Subnet
這主要是提供外部能連進到K8S裡面的服務
這個外部的Loadbalancer需要一個external IP address
並且要讓K8S知道哪一個才是對外用的Subnet,所以才用tag加以區別
而K8S則要透過AWS來供應這個對外的Loadbalancer給Public Subnet部分
在上述都定義後記得這邊有引入新的VPC module,就需要重做init
#執行以下指令:
terraform init
在目錄上就會多出很多module的程式:
這時候再執行
#執行以下:
terraform plan
看起來vpc module給的input參數有些預設值(我沒填入的參數)出現錯誤
我看到VPC module到4.0.0就沒有那個參數:
前面原本選的3.19.0就還有那個參數,所以果斷先換到4.0.0後重新init再plan
仔細可以看看建立滿多元件的:
但是建立EKS前還有很多Resource要定義,這邊就先只用plan看看
當前專案內容:
vpc.tf:
terraform.tfvars:
另外記錄一下我的tf版本:
aws provider版本:
然後我暫時推上github:
#執行推送新branch指令:
git push --set-upstream origin feature/eks
後面敲完帳密就上去了!