這篇其實要講的重點是 EBS 的建立,然後把EBS的 Volume ID 帶出來給其他 service 使用,例如後續使用 k8s 建立 pods 要掛上 Volume 的時候要怎麼使用,這邊是一個簡單的EBS的應用流程說明。
大家都是知道 EC2 就像是一個 AWS 上面的 virtual machine, 然後也知道 EBS 就是一個network storage 這觀念沒錯,但是當 k8s 建立在 AWS 上面時要怎麼做,為什麼會有這個問題?就是因為EKS上面的 computing resource is EC2, not physical machine. And storage is EBS, not physical SSD or disk, 那我們要如何把這些資源結合再一起,就是這篇主要講的內容
首先呢,EC2 基本上預設只會要4G的空間,那是用來啟動 pods 跟暫時存放一些OS執行檔的的空間,例如 Image 。
但是如果是要跑 machine learning project的話,Image 通常都大於4G,那這樣就需要擴增 storage size,不過 EC2 本身沒有 store capacity ,所以不管怎麼樣都是需要掛載 EBS,只是EBS是以什麼形式出現再EC2裡面,例如,就接放在root block device:
resource "aws_instance" "web" {
ami = data.aws_ami.ubuntu.id
instance_type = "t3.micro"
root_block_device {
volume_size = 10
volume_id = XXXXXXXXXXXXXX
}
}
但是好像多數人都比較常用 ephemeral_block_device
及 ebs_block_device
的方式把 EBS 掛載到 EC2 上面,這兩個比較特別的是,如果沒有指定 Volume ID 的話,就會新增一個,但是如果有指定的話,就會直接掛載上面。
接下來要示範的是如何透過 Terraform 來建立一個 EBS
variable "my_ebs_size" {
type = int
default = 100
}
resource "aws_ebs_volume" "my_ebs" {
availability_zone = module.vpc.azs[0]
size = var.my_ebs_size
type = "gp3"
}
簡單就可以看的出來使用 variable 來設定 volume Size ,因為 Size可能會改變或動態調調整,所以沒有直接寫 aws_ebs_volume
裡面。
把EBS建立起來之後,就要把 volume ID
帶出來給EC2掛上
建立EBS後,但是要怎麼取得 Volume ID? 因為後面需要 Volume ID to deploy component on k8s ,但是 terraform 並沒有所謂的 return function 可以回應你剛剛build 出來的 Volume ID。
所以這邊就需要使用 Terraform output 來把剛剛建立的 resource print 出來產生一個json file,而產生出 JSON file,然後在 cdk8s 那邊就 read json file 把剛剛建立的 Volume ID 帶入k8s裡面就大功告成了
File : output.tf
output "MY_EBS_VOLUME_ID" {
value = aws_ebs_volume.my_ebs.id
sensitive = true
}
command 可以這樣下,可以把 output 產出到 json file
terraform output -json > aws_resource.json
簡單來說明,如何把 AWS Service ID 帶出來到 cdk8s 放置進去 k8s component裡面使用
.Gitlab-ct.yml
before_script:
- terraform init
script:
terraform output -json > aws_resource.json
npm build # here is for build k8s component
另外補充,以上說明都還只是建立 AWS service的部分,還沒到後面的k8s 上面掛載 PV 跟 PVC 的部分。
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance