Contents

AWS - Terraform & Ansible 在 AWS 上自動部署 K8S 叢集

手動部署 K8s 叢集是件重複又繁瑣的事情,除了要先準備好基礎機器環境之外,還要每一台機器安裝依賴套件後,並一個一個加入叢集內,透過 Terraform + Ansible Iac 最佳組合自動化完成一整個系列從無到有創建。

1. DEMO 執行範例

https://i.imgur.com/Rows9UK.png
初始化

https://i.imgur.com/Q5HMaRn.png
Terraform 自動創建 EC2

https://i.imgur.com/dzoepIC.png
Ansible 自動部署 K8s

https://i.imgur.com/spP2gnu.png
K8s 狀態


2. Quick Start

透過 Docker 快速創建 Terraform & Ansible 環境及 Iac Code。

  1. 啟動建立好的環境。
1
docker run --rm -it jeffwen0105/iac-ec2-k8s bash
  1. 使用 vi 編輯 credentials ,將 AWS 具備創建 VPC 及 EC2 的 credentials 貼上。
1
2
3
[default]
aws_access_key_id=<YOUR aws_access_key_id>
aws_secret_access_key=<YOUR aws_secret_access_key>
  1. 執行自動部屬腳本。

該環境會使用既有的金鑰遠端連線執行 Ansible 操作,如果擔心金鑰重複的安全性,可以先執行 bash regenerateKey.sh 來重新產生一組公私鑰。

1
bash run.sh
釋放資源

上述會自動創建 VPC、 IGW 、NAT、 EC2 及 SG 等各種資源,透過腳本可以輕易地將所有創建資源收回,並免額度浪費。

1
bash destroy.sh

https://i.imgur.com/N9R6GaM.png


3. GitHub 下載原始碼

JeffWen0105/iac-ec2-k8s: Automatic deployment of K8s Cluster on GCE using Terraform & Ansible

3.1. 運作流程

  1. 由 Terraform 在 us-east-1 (維吉尼亞北部) 區域創建下列資源 :
    • VPC
    • 兩個子網段 ( 公有 10.10.110.0/24 及私有 10.10.220.0/24 )。
    • 創建 IGW 及 NAT 並分別綁定公有及私有網段。
    • 創建 Security Group 安全群組定義流量進出規則。
    • 創建 EC2 Instances。
  2. 待上述資源創建完畢後,由 Ansible 執行套件安裝及部署 K8s 作業。

3.2. 目錄結構

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
[root@howhow iac-ec2-k8s]# tree -F .
.
├── ansible.cfg
├── credentials
├── destroy.sh*
├── inventory*
├── inventory.tf
├── main.tf
├── playbook.yml
├── regenerateKey.sh*
├── run.sh*
├── templates/
│   └── hosts.tpl
└── variables.tf

1 directory, 11 files
  1. run.sh => 程式進入點。
  2. *.tf => Terraform 執行的 IaC 程式碼。
  3. *.yml => Ansible 執行的 IaC 程式碼。

3.3. 使用方式

  1. 安裝 Terraform、 Ansible、 Git 等所依賴套件。
  2. 確保已經產生一組公私鑰,並且存放在該使用者的 ~/.ssh/ 目錄下 (檔名為預設 id_rsa* )。
  3. 修改 Credentials。
  4. 執行 bash.sh 進入點程式。

3.4. 修改自動創建數量

預設會創建三台機器,如需增減可以修改 variables.tf 檔案,除 Master 必須存在外,可以自行延伸機器會修改名稱,修改後會自動依據機器數量所創建。

https://i.imgur.com/6JKwxVw.png

如要增加兩台 Worker,可修改如下 :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
variable "hostname" {
  type=set(string)
  default = [
    "master",
    "node1",
    "node2",
    "node3",
    "node4",
    "node5"
  ]
}

4. 小結

IaC 基礎設施即程式碼是非常方便又快速的好物,除了可以降低人為操作上的失誤,也能彈性的大量部署所需的環境及收回資源。



如果你還沒有註冊 Like Coin,你可以在文章最下方看到 Like 的按鈕,點下去後即可申請帳號,透過申請帳號後可以幫我的文章按下 Like,而 Like 最多可以點五次,而你不用付出任何一塊錢,就能給我寫這篇文章的最大的回饋!