IaC with Terraform 20

Automate Provisioning EKS cluster with Terraform — Part 1

ZONGRU Li
8 min readJun 22, 2023

前面課程有完成EKS的部分,過程曾經透過以下不同方式建置EKS Cluster:

  1. AWS Management Console(Web UI)
  2. 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在背後協助的建立的

然而就...

  1. No version control (history)
  2. no simple replication of infrastructure possible
  3. no simple clean-up
  4. team collaboration difficult

並且提及N年前CNCF的survey中,超過半數的K8s叢集運行在AWS上:

LINK

不過上面這個我找到是2018的結果,現在就不知道怎麼樣了

但是很合理的應當使用Terraform架設管理

因為在AWS上面手動兜出EKS也是很複雜的

從之前EKS課程筆記中知道EKS建置上需要的各種AWS服務元件

  1. 會需要Control Plane且是由AWS來管理,但還是要建!是在EKS服務內
  2. 還需要VPC
  3. 才能建置worker node(使用EC2 Instance或是Node Group)
  4. 這些建置都基於特定的region以及其AZ

2023/10/21補充說明:

我後來也找到有HashiCorp官網範例:

像上面這段vpc建立的code,會跟下面課程寫的87%像

上面內容跟下面筆記滿相似的,但是每個參數解釋甚少

不像課程內容比較鉅細靡遺講解每個參數的作用

可依照下面課程內容建置

VPC

首先專案從main切到新的branch →feature/eks

接著移除裡面的main.tf,準備重新建立VPC

原本是可以使用Cloudformation template來建立相關EKS所需的VPC資源

前面Terraform建立EC2用的VPC只是簡單的範例並且只有一個subnet

但是這邊就要另建VPC資源,透過AWSVPCTerraform module:

LINK

會建立出很多資源像是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與共六個的SubnetIP範圍

接著還要定義VPC所有的AZ陣列:

LINK

所以過程中需要找到取得az資訊的DataSource:

LINK

並且要取得名稱陣列資料:

LINK

但是上面的資訊內容源自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:

  1. Which resources to talk to?
  2. Which VPC should be used?
  3. Which subnet should be used?

最後讓所建立的EKS的各種元件都能跟我們定義的VPCSubnet綁定

我們可能有天會建立一大堆VPC與一堆Subnet

要讓AWS知道這一座EKS要使用哪一個VPCSubnet

所以要幫這VPC打上label(也就是上面的tags)來辨識用

所以還要訂給SubnetTag:

但是針對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來供應這個對外的LoadbalancerPublic Subnet部分

在上述都定義後記得這邊有引入新的VPC module,就需要重做init

#執行以下指令:
terraform init

在目錄上就會多出很多module的程式:

這時候再執行

#執行以下:
terraform plan

看起來vpc module給的input參數有些預設值(我沒填入的參數)出現錯誤

我看到VPC module4.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

後面敲完帳密就上去了!

參考課程reference

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet