์ฐ๋ฆฌ๋ Selectel๊ณผ ํ๋ ฅํ ๊ณต์ Terraform ์ ๊ณต์
์ฒด๋ฅผ ์ถ์ํ์ต๋๋ค. ์ด ์ ํ์ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์๋ ์ฝ๋ํ ์ธํ๋ผ ๋ฐฉ๋ฒ๋ก ์ ํตํด ๋ฆฌ์์ค ๊ด๋ฆฌ๋ฅผ ์๋ฒฝํ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
๊ณต๊ธ์๋ ํ์ฌ ์๋น์ค ์์ ๊ด๋ฆฌ๋ฅผ ์ง์ํฉ๋๋ค.
์ด๋ฏธ ์๊ณ ์๋ฏ์ด VPC ์๋น์ค๋ OpenStack์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ OpenStack์ ํผ๋ธ๋ฆญ ํด๋ผ์ฐ๋ ์๋น์ค๋ฅผ ์ํ ๊ธฐ๋ณธ ๋๊ตฌ๋ฅผ ์ ๊ณตํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ณต์กํ ๋ณตํฉ ๊ฐ์ฒด์ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ๊ณ ์์
์ ๋ณด๋ค ํธ๋ฆฌํ๊ฒ ๋ง๋๋ ์ถ๊ฐ API ์ธํธ์ ๋๋ฝ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ์ต๋๋ค. OpenStack์์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ผ๋ถ ๊ธฐ๋ฅ์ ์ง์ ์ฌ์ฉํ ์ ์์ง๋ง ๋ค์์ ํตํด ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด์ Selectel Terraform ์ ๊ณต์์๋ ๋ค์ VPC ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๋ ๊ธฐ๋ฅ์ด ํฌํจ๋ฉ๋๋ค.
- ํ๋ก์ ํธ ๋ฐ ํ ๋น๋
- ์ฌ์ฉ์, ํด๋น ์ญํ ๋ฐ ํ ํฐ
- ์ง์ญ ๊ฐ ๋ฐ VRRP๋ฅผ ํฌํจํ ํผ๋ธ๋ฆญ ์๋ธ๋ท
- ์ํํธ์จ์ด ๋ผ์ด์ผ์ค.
๊ณต๊ธ์๋ ๊ณต๊ฐ Go ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ VPC API๋ก ์์ ํฉ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ณต๊ธ์ ์์ฒด๋ ๋ชจ๋ ์คํ ์์ค์ด๋ฉฐ Github์์ ๊ฐ๋ฐ์ด ์ํ๋ฉ๋๋ค.
- ๋์๊ด ์ ์ฅ์
Go-selvpcํด๋ผ์ด์ธํธ , - ๊ณต๊ธ์ ์ ์ฅ์
Terraform ์ ๊ณต์ Selectel .
๊ฐ์ ๋จธ์ , ๋์คํฌ, Kubernetes ํด๋ฌ์คํฐ์ ๊ฐ์ ๋ค๋ฅธ ํด๋ผ์ฐ๋ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๋ ค๋ฉด OpenStack Terraform ๊ณต๊ธ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ ์ ๊ณต์ ์ฒด์ ๊ณต์ ๋ฌธ์๋ ๋ค์ ๋งํฌ์์ ํ์ธํ ์ ์์ต๋๋ค.
- ์ ํ ๋ฆฌ์์ค ๋ฌธ์:
Terraform ์ ๊ณต์ Selectel , - OpenStack ๋ฆฌ์์ค ๋ฌธ์:
Terraform ์ ๊ณต์ OpenStack .
์์ํ๊ธฐ
์์ํ๋ ค๋ฉด Terraform์ ์ค์นํด์ผ ํฉ๋๋ค. ์ค์น ํจํค์ง์ ๋ํ ์ง์นจ๊ณผ ๋งํฌ๋ ๋ค์์์ ์ฐพ์ ์ ์์ต๋๋ค.
์๋ํ๋ ค๋ฉด ๊ณต๊ธ์๊ฐ ๋ค์์์ ์์ฑ๋ Selectel API ํค๊ฐ ํ์ํฉ๋๋ค.
Selectel ์์
์ ์ํ ๋งค๋ํ์คํธ๋ Terraform์ ์ฌ์ฉํ๊ฑฐ๋ Github ์ ์ฅ์์์ ์ฌ์ฉํ ์ ์๋ ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ง ์์ ์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋ฉ๋๋ค.
์์ ๊ฐ ์๋ ์ ์ฅ์๋ ๋ ๊ฐ์ ๋๋ ํฐ๋ฆฌ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค.
- ๋ชจ๋, ๋งค๊ฐ๋ณ์ ์งํฉ์ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉํ๊ณ ์์ ๋ฆฌ์์ค ์งํฉ์ ๊ด๋ฆฌํ๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์์ ๋ชจ๋์ด ํฌํจ๋์ด ์์ต๋๋ค.
- ์, ์ํธ ์ฐ๊ฒฐ๋ ์ ์ฒด ๋ชจ๋ ์ธํธ์ ์๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
Terraform์ ์ค์นํ๊ณ Selectel API ํค๋ฅผ ์์ฑํ๊ณ ์์ ๋ฅผ ์์งํ ํ ์ค์ ์์ ๋ก ๋์ด๊ฐ๊ฒ ์ต๋๋ค.
๋ก์ปฌ ๋์คํฌ๋ก ์๋ฒ๋ฅผ ์์ฑํ๋ ์
ํ๋ก์ ํธ, ์ญํ ์ด ์๋ ์ฌ์ฉ์, ๋ก์ปฌ ๋์คํฌ๊ฐ ์๋ ๊ฐ์ ๋จธ์ ์ ์์ฑํ๋ ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ํ์ผ์์ vars.tf ๋ชจ๋์ ํธ์ถํ ๋ ์ฌ์ฉ๋๋ ๋ชจ๋ ๋งค๊ฐ๋ณ์๊ฐ ์ค๋ช ๋ฉ๋๋ค. ๊ทธ ์ค ์ผ๋ถ์๋ ๊ธฐ๋ณธ๊ฐ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์๋ฒ๋ ํด๋น ์์ญ์ ์์ฑ๋ฉ๋๋ค. ๋ฃจ-3a ๋ค์ ๊ตฌ์ฑ์ผ๋ก:
variable "server_vcpus" {
default = 4
}
variable "server_ram_mb" {
default = 8192
}
variable "server_root_disk_gb" {
default = 8
}
variable "server_image_name" {
default = "Ubuntu 18.04 LTS 64-bit"
}
ํ์ผ์์ main.tf Selectel ๊ณต๊ธ์๊ฐ ์ด๊ธฐํ๋ฉ๋๋ค.
provider "selectel" {
token = "${var.sel_token}"
}
์ด ํ์ผ์๋ ์๋ฒ์ ์ค์น๋ SSH ํค์ ๊ธฐ๋ณธ๊ฐ๋ ํฌํจ๋์ด ์์ต๋๋ค.
module "server_local_root_disk" {
...
server_ssh_key = "${file("~/.ssh/id_rsa.pub")}"
}
ํ์ํ ๊ฒฝ์ฐ ๋ค๋ฅธ ๊ณต๊ฐ ํค๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ํค๋ฅผ ํ์ผ ๊ฒฝ๋ก๋ก ์ง์ ํ ํ์๋ ์์ผ๋ฉฐ ๊ฐ์ ๋ฌธ์์ด๋ก ์ถ๊ฐํ ์๋ ์์ต๋๋ค.
๋ํ ์ด ํ์ผ์์ ๋ชจ๋์ด ์์๋ฉ๋๋ค. ํ๋ก์ ํธ_with_์ฌ์ฉ์ ะธ ์๋ฒ_๋ก์ปฌ_๋ฃจํธ_๋์คํฌ, ํ์ํ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
์ด ๋ชจ๋์ ๋ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ํ๋ก์ ํธ ๋ฐ ์ญํ ์ด ์๋ ์ฌ์ฉ์ ์์ฑ
์ฒซ ๋ฒ์งธ ๋ชจ๋์ ํ๋ก์ ํธ์ ํด๋น ํ๋ก์ ํธ์ ์ญํ ์ ๊ฐ์ง ์ฌ์ฉ์๋ฅผ ์์ฑํฉ๋๋ค.
์์ฑ๋ ์ฌ์ฉ์๋ OpenStack์ ๋ก๊ทธ์ธํ์ฌ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ์ด ๋ชจ๋์ ๊ฐ๋จํ๋ฉฐ ๋ค์ ์ธ ๊ฐ์ง ์ํฐํฐ๋ง ๊ด๋ฆฌํฉ๋๋ค.
- selectel_vpc_project_v2,
- selectel_vpc_user_v2,
- selectel_vpc_role_v2.
๋ก์ปฌ ๋์คํฌ๋ก ๊ฐ์ ์๋ฒ ๋ง๋ค๊ธฐ
๋ ๋ฒ์งธ ๋ชจ๋์์๋ ๋ก์ปฌ ๋์คํฌ๊ฐ ์๋ ์๋ฒ๋ฅผ ์์ฑํ๋ ๋ฐ ํ์ํ OpenStack ๊ฐ์ฒด ๊ด๋ฆฌ๋ฅผ ๋ค๋ฃน๋๋ค.
๋ฆฌ์์ค์ ๋ํด ์ด ๋ชจ๋์ ์ง์ ๋ ์ผ๋ถ ์ธ์์ ์ฃผ์ํด์ผ ํฉ๋๋ค. openstack_compute_instance_v2:
resource "openstack_compute_instance_v2" "instance_1" {
...
lifecycle {
ignore_changes = ["image_id"]
}
vendor_options {
ignore_resize_confirmation = true
}
}
๋ ผ์ ๋ฌด์_๋ณ๊ฒฝ ์์ฑ ๋ณ๊ฒฝ์ ๋ฌด์ํ ์ ์์ต๋๋ค. id ๊ฐ์ ๋จธ์ ์ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ด๋ฏธ์ง์ ๋๋ค. VPC ์๋น์ค์์๋ ๋๋ถ๋ถ์ ๊ณต๊ฐ ์ด๋ฏธ์ง๊ฐ ์ผ์ฃผ์ผ์ ํ ๋ฒ ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋๋ฉฐ ๋์์ id ๋ํ ๋ณ๊ฒฝ๋ฉ๋๋ค. ์ด๋ ์ด๋ฏธ์ง๊ฐ ๋ถ๋ณ ์ํฐํฐ๋ก ๊ฐ์ฃผ๋๋ OpenStack ๊ตฌ์ฑ ์์์ธ Glance์ ํน์ฑ ๋๋ฌธ์ ๋๋ค.
์ธ์๋ก ์๋ ๊ธฐ์กด ์๋ฒ๋ ๋์คํฌ๋ฅผ ์์ฑํ๊ฑฐ๋ ์์ ํ๋ ๊ฒฝ์ฐ ์ด๋ฏธ์ง_ID ์ฌ์ฉ ๋ id ๊ณต๊ฐ ์ด๋ฏธ์ง์ธ ๊ฒฝ์ฐ ํด๋น ์ด๋ฏธ์ง๊ฐ ์ ๋ฐ์ดํธ๋ ํ Terraform ๋งค๋ํ์คํธ๋ฅผ ๋ค์ ์คํํ๋ฉด ์๋ฒ ๋๋ ๋์คํฌ๊ฐ ๋ค์ ์์ฑ๋ฉ๋๋ค. ์ธ์ ์ฌ์ฉ ๋ฌด์_๋ณ๊ฒฝ ๊ทธ๋ฌํ ์ํฉ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
์ฐธ๊ณ : ์ธ์ ๋ฌด์_๋ณ๊ฒฝ ๊ฝค ์ค๋ ์ ์ Terraform์ ๋ฑ์ฅํ์ต๋๋ค.
๋ ผ์ ๋ฌด์_ํฌ๊ธฐ ์กฐ์ _ํ์ธ ๋ก์ปฌ ๋์คํฌ, ์ฝ์ด ๋๋ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์กฐ์ ํ๋ ๋ฐ ํ์ํฉ๋๋ค. ์ด๋ฌํ ๋ณ๊ฒฝ์ ์์ฒญ์ ์ฌ์ฉํ์ฌ OpenStack Nova ๊ตฌ์ฑ ์์๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๋๋ค. ํฌ๊ธฐ ์กฐ์ . ์์ฒญ ํ ๊ธฐ๋ณธ Nova ํฌ๊ธฐ ์กฐ์ ์๋ฒ๋ฅผ ์ํ๋ก ์ ํ verify_resize ์ฌ์ฉ์์ ์ถ๊ฐ ํ์ธ์ ๊ธฐ๋ค๋ฆฝ๋๋ค. ๊ทธ๋ฌ๋ Nova๊ฐ ์ฌ์ฉ์์ ์ถ๊ฐ ์์ ์ ๊ธฐ๋ค๋ฆฌ์ง ์๋๋ก ์ด ๋์์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
์ง์ ๋ ์ธ์๋ฅผ ์ฌ์ฉํ๋ฉด Terraform์ด ์ํ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ ์ ์์ต๋๋ค. verify_resize ๋งค๊ฐ๋ณ์๋ฅผ ๋ณ๊ฒฝํ ํ ์๋ฒ๊ฐ ํ์ฑ ์ํ๊ฐ ๋๋๋ก ์ค๋นํฉ๋๋ค. ์ธ์๋ OpenStack Terraform ๊ณต๊ธ์ ๋ฒ์ 1.10.0์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ฆฌ์์ค ์์ฑ
๋งค๋ํ์คํธ๋ฅผ ์คํํ๊ธฐ ์ ์ ์ด ์์์๋ ๋ ๊ฐ์ ์๋ก ๋ค๋ฅธ ๊ณต๊ธ์๊ฐ ์์๋๊ณ OpenStack ๊ณต๊ธ์๋ Selectel ๊ณต๊ธ์์ ๋ฆฌ์์ค์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ํ๋ก์ ํธ์์ ์ฌ์ฉ์๋ฅผ ์์ฑํ์ง ์์ผ๋ฉด ์ฌ์ฉ์์ ์ํ ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. . ๋ถํํ๋ ๊ฐ์ ์ด์ ๋ก ๋ช ๋ น์ ์คํํ ์๋ ์์ต๋๋ค. ํ ๋ผํผ ์ ์ฉ ์ฐ๋ฆฌ์ ์ ์์. ์ฐ๋ฆฌ๋ ๋จผ์ ํด์ผ ํ ์ผ ๋๋ค ๋ชจ๋์ฉ ํ๋ก์ ํธ_with_์ฌ์ฉ์ ๊ทธ ์ดํ์๋ ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์๋ ์ ์ฉ๋ฉ๋๋ค.
์ฐธ๊ณ : ์ด ๋ฌธ์ ๋ ์์ง Terraform์์ ํด๊ฒฐ๋์ง ์์์ต๋๋ค. Github์์ ํ ๋ก ์ ๋ฐ๋ผ๊ฐ ์ ์์ต๋๋ค.
๋ฆฌ์์ค๋ฅผ ์์ฑํ๋ ค๋ฉด ๋๋ ํฐ๋ฆฌ๋ก ์ด๋ํ์ธ์.
$ ls
README.md main.tf vars.tf
๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ๋ชจ๋์ ์ด๊ธฐํํฉ๋๋ค.
$ terraform init
์ถ๋ ฅ์๋ Terraform์ด ์ฌ์ฉํ๋ ๊ณต๊ธ์์ ์ต์ ๋ฒ์ ์ ๋ค์ด๋ก๋ํ๊ณ ์์์ ์ค๋ช ๋ ๋ชจ๋ ๋ชจ๋์ ํ์ธํ๋ ๊ฒ์ผ๋ก ํ์๋ฉ๋๋ค.
๋จผ์ ๋ชจ๋์ ์ ์ฉํด๋ณด์ ํ๋ก์ ํธ_with_์ฌ์ฉ์. ์ด๋ฅผ ์ํด์๋ ์ค์ ๋์ง ์์ ๋ณ์์ ๋ํ ๊ฐ์ ์๋์ผ๋ก ์ ๋ฌํด์ผ ํฉ๋๋ค.
- sel_account ๊ทํ์ Selectel ๊ณ์ ๋ฒํธ๋ก
- sel_token Selectel API์ ํค๋ฅผ ์ฌ์ฉํ์ธ์.
- ์ฌ์ฉ์ ์ํธ OpenStack ์ฌ์ฉ์์ ๋น๋ฐ๋ฒํธ๋ก
์ฒ์ ๋ ๋ณ์์ ๊ฐ์ ๋ค์์์ ๊ฐ์ ธ์์ผ ํฉ๋๋ค.
๋ง์ง๋ง ๋ณ์์๋ ์ด๋ค ๋น๋ฐ๋ฒํธ๋ผ๋ ์ ๋ ฅํ ์ ์์ต๋๋ค.
๋ชจ๋์ ์ฌ์ฉํ๋ ค๋ฉด ๊ฐ์ ๋ฐ๊ฟ์ผ ํฉ๋๋ค. SEL_ACCOUNT, SEL_TOKEN ะธ ์ฌ์ฉ์ ์ํธ ๋ช ๋ น์ ์คํํฉ๋๋ค:
$ env
TF_VAR_sel_account=SEL_ACCOUNT
TF_VAR_sel_token=SEL_TOKEN
TF_VAR_user_password=USER_PASSWORD
terraform apply -target=module.project_with_user
๋ช ๋ น์ ์คํํ ํ Terraform์ ์์ฑํ๋ ค๋ ๋ฆฌ์์ค๋ฅผ ํ์ํ๊ณ ํ์ธ์ ์์ฒญํฉ๋๋ค.
Plan: 3 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
ํ๋ก์ ํธ, ์ฌ์ฉ์ ๋ฐ ์ญํ ์ด ์์ฑ๋๋ฉด ๋๋จธ์ง ๋ฆฌ์์ค ์์ฑ์ ์์ํ ์ ์์ต๋๋ค.
$ env
TF_VAR_sel_account=SEL_ACCOUNT
TF_VAR_sel_token=SEL_TOKEN
TF_VAR_user_password=USER_PASSWORD
terraform apply
๋ฆฌ์์ค๋ฅผ ์์ฑํ ๋ ์์ฑ๋ ์๋ฒ์ ์ก์ธ์คํ ์ ์๋ ์ธ๋ถ IP ์ฃผ์๊ฐ ํฌํจ๋ Terraform ์ถ๋ ฅ์ ์ฃผ์ํ์ธ์.
module.server_local_root_disk.openstack_networking_floatingip_associate_v2.association_1: Creating...
floating_ip: "" => "x.x.x.x"
์ง์ ๋ IP๋ฅผ ์ฌ์ฉํ์ฌ SSH๋ฅผ ํตํด ์์ฑ๋ ๊ฐ์ ๋จธ์ ์ผ๋ก ์์ ํ ์ ์์ต๋๋ค.
๋ฆฌ์์ค ํธ์ง
Terraform์ ํตํด ๋ฆฌ์์ค๋ฅผ ์์ฑํ๋ ๊ฒ ์ธ์๋ ์์ ํ ์๋ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ๋งค๊ฐ๋ณ์ ๊ฐ์ ๋ณ๊ฒฝํ์ฌ ์๋ฒ์ ์ฝ์ด ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋๋ ค๋ณด๊ฒ ์ต๋๋ค. server_vcpus ะธ server_ram_mb ํ์ผ์ ์์ /vpc/server_local_root_disk/main.tf:
- server_vcpus = "${var.server_vcpus}"
- server_ram_mb = "${var.server_ram_mb}"
+ server_vcpus = 8
+ server_ram_mb = 10240
๊ทธ๋ฐ ๋ค์ ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ์ด๋ค ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ๋์ง ํ์ธํฉ๋๋ค.
$ env
TF_VAR_sel_account=SEL_ACCOUNT
TF_VAR_sel_token=SEL_TOKEN
TF_VAR_user_password=USER_PASSWORD
terraform plan
๊ฒฐ๊ณผ์ ์ผ๋ก Terraform์ ๋ฆฌ์์ค๋ฅผ ๋ณ๊ฒฝํ์ต๋๋ค. openstack_compute_instance_v2 ะธ openstack_compute_flavor_v2.
์์ฑ๋ ๊ฐ์ ๋จธ์ ์ ์ฌ๋ถํ ํด์ผ ํ๋ค๋ ์ ์ ์ ์ํ์ธ์.
์ ๊ฐ์ ๋จธ์ ๊ตฌ์ฑ์ ์ ์ฉํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ญ์์ค. ํ ๋ผํผ ์ ์ฉ, ์ฐ๋ฆฌ๋ ์ด๋ฏธ ์ด์ ์ ์ถ์ํ์ต๋๋ค.
์์ฑ๋ ๋ชจ๋ ๊ฐ์ฒด๋ ๋ค์ ์์น์ ํ์๋ฉ๋๋ค.
์ฐ๋ฆฌ์
Kubernetes ํด๋ฌ์คํฐ ์์ฑ ์์
๋ค์ ์์๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ์์ ๋ง๋ ๋ฆฌ์์ค๋ฅผ ์ ๋ฆฌํ๊ฒ ์ต๋๋ค. ํ๋ก์ ํธ ๋ฃจํธ์์ ์ด ์์
์ ์ํํ๋ ค๋ฉด
$ env
TF_VAR_sel_account=SEL_ACCOUNT
TF_VAR_sel_token=SEL_TOKEN
TF_VAR_user_password=USER_PASSWORD
terraform destroy -target=module.server_local_root_disk
๊ทธ๋ฐ ๋ค์ ๋ช ๋ น์ ์คํํ์ฌ Selectel VPC API ๊ฐ์ฒด๋ฅผ ์ง์๋๋ค.
$ env
TF_VAR_sel_account=SEL_ACCOUNT
TF_VAR_sel_token=SEL_TOKEN
TF_VAR_user_password=USER_PASSWORD
terraform destroy -target=module.project_with_user
๋ ๊ฒฝ์ฐ ๋ชจ๋ ๋ชจ๋ ๊ฐ์ฒด ์ญ์ ๋ฅผ ํ์ธํด์ผ ํฉ๋๋ค.
Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.
Enter a value: yes
๋ค์ ์๋ ๋๋ ํฐ๋ฆฌ์ ์์ต๋๋ค.
์ด ์์์๋ ํ๋ก์ ํธ, ์ฆ ํ๋ก์ ํธ์์ ์ญํ ์ ๊ฐ์ง ์ฌ์ฉ์๋ฅผ ์์ฑํ๊ณ ํ๋์ Kubernetes ํด๋ฌ์คํฐ๋ฅผ ์์ฑํฉ๋๋ค. ํ์ผ์ ์์ vars.tf ๋ ธ๋ ์, ํน์ฑ, Kubernetes ๋ฒ์ ๋ฑ๊ณผ ๊ฐ์ ๊ธฐ๋ณธ๊ฐ์ ๋ณผ ์ ์์ต๋๋ค.
์ฒซ ๋ฒ์งธ ์์ ์ ์ฌํ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๊ธฐ ์ํด ๋จผ์ ๋ชจ๋ ์ด๊ธฐํ ๋ฐ ๋ชจ๋ ๋ฆฌ์์ค ์์ฑ์ ์์ํฉ๋๋ค. ํ๋ก์ ํธ_with_์ฌ์ฉ์๊ทธ๋ฐ ๋ค์ ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ๋ง๋ญ๋๋ค.
$ terraform init
$ env
TF_VAR_sel_account=SEL_ACCOUNT
TF_VAR_sel_token=SEL_TOKEN
TF_VAR_user_password=USER_PASSWORD
terraform apply -target=module.project_with_user
$ env
TF_VAR_sel_account=SEL_ACCOUNT
TF_VAR_sel_token=SEL_TOKEN
TF_VAR_user_password=USER_PASSWORD
terraform apply
OpenStack Magnum ๊ตฌ์ฑ ์์๋ฅผ ํตํด Kubernetes ํด๋ฌ์คํฐ ์์ฑ ๋ฐ ๊ด๋ฆฌ๋ฅผ ์ด์ ํฉ๋๋ค. ๋ค์ ์ค ํ๋์์ ํด๋ฌ์คํฐ๋ก ์์
ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์ธํ ์์๋ณผ ์ ์์ต๋๋ค.
ํด๋ฌ์คํฐ๋ฅผ ์ค๋นํ ๋ ๋์คํฌ์ ๊ฐ์ ๋จธ์ ์ด ์์ฑ๋๊ณ ํ์ํ ๋ชจ๋ ๊ตฌ์ฑ ์์๊ฐ ์ค์น๋ฉ๋๋ค. ์ค๋น์๋ ์ฝ 4๋ถ์ด ์์๋๋ฉฐ, ์ด ์๊ฐ ๋์ Terraform์ ๋ค์๊ณผ ๊ฐ์ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค.
module.kubernetes_cluster.openstack_containerinfra_cluster_v1.cluster_1: Still creating... (3m0s elapsed)
์ค์น๊ฐ ์๋ฃ๋๋ฉด Terraform์ ํด๋ฌ์คํฐ๊ฐ ์ค๋น๋์์์ ๋ํ๋ด๊ณ ํด๋น ID๋ฅผ ํ์ํฉ๋๋ค.
module.kubernetes_cluster.openstack_containerinfra_cluster_v1.cluster_1: Creation complete after 4m20s (ID: 3c8...)
Apply complete! Resources: 6 added, 0 changed, 0 destroyed.
์์ฑ๋ Kubernetes ํด๋ฌ์คํฐ๋ฅผ ์ ํธ๋ฆฌํฐ๋ฅผ ํตํด ๊ด๋ฆฌํ๋ ค๋ฉด ์ฟ ๋ฒ ํ ํด๋ฌ์คํฐ ์ก์ธ์ค ํ์ผ์ ๊ฐ์ ธ์์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ๊ณ์ ์ ํ๋ก์ ํธ ๋ชฉ๋ก์์ Terraform์ ํตํด ์์ฑ๋ ํ๋ก์ ํธ๋ก ์ด๋ํ์ธ์.
๋ค์์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๋งํฌ๋ฅผ ๋ฐ๋ฅด์ญ์์ค.
๋ก๊ทธ์ธ ์ ๋ณด๋ Terraform์ ํตํด ์์ฑํ ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์ฌ์ฉํ์ธ์. ์์ด์ง ์์๋ค๋ฉด vars.tf ๋๋ main.tf ์ด ์์์ ์ฌ์ฉ์๋ ๋ค์๊ณผ ๊ฐ์ ์ด๋ฆ์ ๊ฐ๊ฒ ๋ฉ๋๋ค. tf_user. ๋ณ์์ ๊ฐ์ ๋น๋ฐ๋ฒํธ๋ก ์ฌ์ฉํด์ผ ํฉ๋๋ค. TF_VAR_user_password, ์์ ์ ์ง์ ๋จ ํ
๋ผํผ ์ ์ฉ ์ผ์ฐ.
ํ๋ก์ ํธ ๋ด์์ ํญ์ผ๋ก ์ด๋ํด์ผ ํฉ๋๋ค. Kubernetes:
Terraform์ ํตํด ์์ฑ๋ ํด๋ฌ์คํฐ๊ฐ ์๋ ์์น์
๋๋ค. ๋ค์์ ๋ํ ํ์ผ ๋ค์ด๋ก๋ ์ฟ ๋ฒ ํ "์ก์ธ์ค" ํญ์์ ๋ค์์ ์ํํ ์ ์์ต๋๋ค.
์ค์น ์ง์นจ์ ๊ฐ์ ํญ์ ์์ต๋๋ค. ์ฟ ๋ฒ ํ ๋ค์ด๋ก๋ํ ํ์ผ์ ์ฌ์ฉ config.yaml.
์ถ์ ํ ์ฟ ๋ฒ ํ ๊ทธ๋ฆฌ๊ณ ํ๊ฒฝ๋ณ์ ์ค์ KUBECONFIG Kubernetes๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-9578f5c87-g6bjf 1/1 Running 0 8m
kube-system coredns-9578f5c87-rvkgd 1/1 Running 0 6m
kube-system heapster-866fcbc879-b6998 1/1 Running 0 8m
kube-system kube-dns-autoscaler-689688988f-8cxhf 1/1 Running 0 8m
kube-system kubernetes-dashboard-7bdb5d4cd7-jcjq9 1/1 Running 0 8m
kube-system monitoring-grafana-84c97bb64d-tc64b 1/1 Running 0 8m
kube-system monitoring-influxdb-7c8ccc75c6-dzk5f 1/1 Running 0 8m
kube-system node-exporter-tf-cluster-rz6nggvs4va7-minion-0 1/1 Running 0 8m
kube-system node-exporter-tf-cluster-rz6nggvs4va7-minion-1 1/1 Running 0 8m
kube-system openstack-cloud-controller-manager-8vrmp 1/1 Running 3 8m
prometeus-monitoring grafana-76bcb7ffb8-4tm7t 1/1 Running 0 8m
prometeus-monitoring prometheus-75cdd77c5c-w29gb 1/1 Running 0 8m
ํด๋ฌ์คํฐ ๋
ธ๋ ์๋ Terraform์ ํตํด ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
ํ์ผ์์ main.tf ๋ค์ ๊ฐ์ด ์ง์ ๋ฉ๋๋ค.
cluster_node_count = "${var.cluster_node_count}"
์ด ๊ฐ์ ๋ค์์์ ๋์ฒด๋ฉ๋๋ค. vars.tf:
variable "cluster_node_count" {
default = 2
}
๋ค์ ์ค ํ๋์์ ๊ธฐ๋ณธ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. vars.tf, ๋๋ ์ง์ ํ์ํ ๊ฐ์ ์ง์ main.tf:
- cluster_node_count = "${var.cluster_node_count}"
+ cluster_node_count = 3
์ฒซ ๋ฒ์งธ ์์ ๊ฐ์ด ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ญ์์ค. ํ ๋ผํผ ์ ์ฉ:
$ env
TF_VAR_sel_account=SEL_ACCOUNT
TF_VAR_sel_token=SEL_TOKEN
TF_VAR_user_password=USER_PASSWORD
terraform apply
๋ ธ๋ ์๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ํด๋ฌ์คํฐ๋ ๊ณ์ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค. Terraform์ ํตํด ๋ ธ๋๋ฅผ ์ถ๊ฐํ ํ์๋ ์ถ๊ฐ ๊ตฌ์ฑ ์์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
tf-cluster-rz6nggvs4va7-master-0 Ready,SchedulingDisabled master 8m v1.12.4
tf-cluster-rz6nggvs4va7-minion-0 Ready <none> 8m v1.12.4
tf-cluster-rz6nggvs4va7-minion-1 Ready <none> 8m v1.12.4
tf-cluster-rz6nggvs4va7-minion-2 Ready <none> 3m v1.12.4
๊ฒฐ๋ก
์ด ๊ธฐ์ฌ์์ ์ฐ๋ฆฌ๋ ์์
ํ๋ ์ฃผ์ ๋ฐฉ๋ฒ์ ๋ํด ์๊ฒ๋์์ต๋๋ค.
Selectel Terraform ์ ๊ณต์์์ ๋ฐ๊ฒฌ๋ ๋ฒ๊ทธ๋ ๋ค์์ ํตํด ๋ณด๊ณ ํ ์ ์์ต๋๋ค.
์ถ์ฒ : habr.com