เราได้เปิดตัวผู้ให้บริการ Terraform อย่างเป็นทางการเพื่อทำงานร่วมกับ Selectel ผลิตภัณฑ์นี้ช่วยให้ผู้ใช้สามารถใช้การจัดการทรัพยากรได้อย่างเต็มที่ผ่านวิธีการโครงสร้างพื้นฐานตามโค้ด
ปัจจุบันผู้ให้บริการรองรับการจัดการทรัพยากรบริการ
ดังที่คุณทราบแล้วว่าบริการ VPC สร้างขึ้นบน OpenStack อย่างไรก็ตาม เนื่องจาก OpenStack ไม่มีเครื่องมือเนทิฟสำหรับการให้บริการคลาวด์สาธารณะ เราจึงนำฟังก์ชันที่ขาดหายไปมาใช้ในชุด API เพิ่มเติม ซึ่งจะทำให้การจัดการออบเจ็กต์คอมโพสิตที่ซับซ้อนง่ายขึ้น และทำให้งานสะดวกยิ่งขึ้น ฟังก์ชั่นบางอย่างที่มีอยู่ใน OpenStack นั้นถูกปิดจากการใช้งานโดยตรง แต่สามารถใช้งานได้ผ่าน
ขณะนี้ผู้ให้บริการ Selectel Terraform มีความสามารถในการจัดการทรัพยากร VPC ต่อไปนี้:
- โครงการและโควต้า
- ผู้ใช้ บทบาท และโทเค็นของพวกเขา
- ซับเน็ตสาธารณะ รวมถึงข้ามภูมิภาคและ VRRP
- ใบอนุญาตซอฟต์แวร์
ผู้ให้บริการใช้ไลบรารี Go สาธารณะของเราเพื่อทำงานกับ VPC API ทั้งไลบรารีและผู้ให้บริการนั้นเป็นโอเพ่นซอร์ส การพัฒนาดำเนินการบน Github:
- พื้นที่เก็บข้อมูลห้องสมุด
Go-selvpcclient , - พื้นที่เก็บข้อมูลของผู้ให้บริการ
Selectel ผู้ให้บริการ Terraform .
หากต้องการจัดการทรัพยากรระบบคลาวด์อื่นๆ เช่น เครื่องเสมือน ดิสก์ คลัสเตอร์ Kubernetes คุณสามารถใช้ผู้ให้บริการ OpenStack Terraform ได้ เอกสารอย่างเป็นทางการสำหรับผู้ให้บริการทั้งสองมีอยู่ที่ลิงก์ต่อไปนี้:
- เอกสารประกอบทรัพยากร Selectel:
Selectel ผู้ให้บริการ Terraform , - เอกสารประกอบทรัพยากร OpenStack:
OpenStack ผู้ให้บริการ Terraform .
เริ่มต้นใช้งาน
ในการเริ่มต้น คุณต้องติดตั้ง Terraform (ดูคำแนะนำและลิงก์ไปยังแพ็คเกจการติดตั้งได้ที่
ในการดำเนินการ ผู้ให้บริการจำเป็นต้องมีคีย์ Selectel API ซึ่งสร้างขึ้นใน
รายการสำหรับการทำงานกับ Selectel ถูกสร้างขึ้นโดยใช้ Terraform หรือใช้ชุดตัวอย่างสำเร็จรูปที่มีอยู่ในที่เก็บ Github ของเรา:
พื้นที่เก็บข้อมูลพร้อมตัวอย่างแบ่งออกเป็นสองไดเร็กทอรี:
- โมดูลประกอบด้วยโมดูลขนาดเล็กที่สามารถนำกลับมาใช้ใหม่ได้ซึ่งรับชุดพารามิเตอร์เป็นอินพุตและจัดการชุดทรัพยากรขนาดเล็ก
- ตัวอย่างซึ่งมีตัวอย่างของชุดโมดูลที่เชื่อมต่อถึงกันครบชุด
หลังจากติดตั้ง Terraform แล้ว สร้างคีย์ Selectel API และทำความคุ้นเคยกับตัวอย่างต่างๆ มาดูตัวอย่างที่ใช้งานได้จริงกันดีกว่า
ตัวอย่างการสร้างเซิร์ฟเวอร์ด้วยดิสก์ภายในเครื่อง
ลองดูตัวอย่างการสร้างโปรเจ็กต์ ผู้ใช้ที่มีบทบาท และเครื่องเสมือนที่มีดิสก์ในเครื่อง:
ในไฟล์ vars.tf มีการอธิบายพารามิเตอร์ทั้งหมดที่จะใช้เมื่อเรียกโมดูล บางส่วนมีค่าเริ่มต้น เช่น เซิร์ฟเวอร์จะถูกสร้างขึ้นในโซน ru-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_user и เซิร์ฟเวอร์_local_root_diskซึ่งจัดการทรัพยากรที่จำเป็น
มาดูรายละเอียดโมดูลเหล่านี้กันดีกว่า
การสร้างโครงการและผู้ใช้ที่มีบทบาท
โมดูลแรกสร้างโครงการและผู้ใช้ที่มีบทบาทในโครงการนั้น:
ผู้ใช้ที่สร้างขึ้นจะสามารถเข้าสู่ระบบ 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 รูปภาพสาธารณะ จากนั้นหลังจากอัปเดตรูปภาพนั้นแล้ว การเรียกใช้รายการ Terraform อีกครั้งจะสร้างเซิร์ฟเวอร์หรือดิสก์ขึ้นใหม่ การใช้ข้อโต้แย้ง ละเลย_การเปลี่ยนแปลง ช่วยให้คุณหลีกเลี่ยงสถานการณ์ดังกล่าวได้
หมายเหตุ: อาร์กิวเมนต์ ละเลย_การเปลี่ยนแปลง ปรากฏใน Terraform เมื่อนานมาแล้ว:
อาร์กิวเมนต์ ละเว้น_resize_confirmation จำเป็นในการปรับขนาดดิสก์ภายในเครื่อง คอร์ หรือหน่วยความจำเซิร์ฟเวอร์ได้สำเร็จ การเปลี่ยนแปลงดังกล่าวเกิดขึ้นผ่านส่วนประกอบ OpenStack Nova โดยใช้คำขอ ปรับขนาด. ค่าเริ่มต้น Nova หลังจากการร้องขอ ปรับขนาด ทำให้เซิร์ฟเวอร์เข้าสู่สถานะ ตรวจสอบ_ปรับขนาด และรอการยืนยันเพิ่มเติมจากผู้ใช้ อย่างไรก็ตาม พฤติกรรมนี้สามารถเปลี่ยนแปลงได้เพื่อให้ Nova ไม่ต้องรอการดำเนินการเพิ่มเติมจากผู้ใช้
อาร์กิวเมนต์ที่ระบุอนุญาตให้ Terraform ไม่ต้องรอสถานะ ตรวจสอบ_ปรับขนาด สำหรับเซิร์ฟเวอร์และเตรียมพร้อมสำหรับเซิร์ฟเวอร์ให้อยู่ในสถานะใช้งานหลังจากเปลี่ยนพารามิเตอร์ อาร์กิวเมนต์นี้มีอยู่ในเวอร์ชัน 1.10.0 ของผู้ให้บริการ OpenStack Terraform:
การสร้างทรัพยากร
ก่อนที่จะเรียกใช้รายการ โปรดทราบว่าในตัวอย่างของเรา มีการเปิดตัวผู้ให้บริการที่แตกต่างกันสองราย และผู้ให้บริการ OpenStack ขึ้นอยู่กับทรัพยากรของผู้ให้บริการ Selectel เนื่องจากหากไม่มีการสร้างผู้ใช้ในโครงการ จึงเป็นไปไม่ได้ที่จะจัดการวัตถุที่เป็นของมัน . น่าเสียดาย ด้วยเหตุผลเดียวกัน เราจึงไม่สามารถรันคำสั่งได้ ใช้ภูมิประเทศ ภายในตัวอย่างของเรา เราต้องทำก่อน ใช้ สำหรับโมดูล โครงการ_with_user และหลังจากนั้นสำหรับทุกสิ่งทุกอย่าง
หมายเหตุ: ปัญหานี้ยังไม่ได้รับการแก้ไขใน Terraform คุณสามารถติดตามการสนทนาบน Github ได้ที่
หากต้องการสร้างทรัพยากร ให้ไปที่ไดเรกทอรี
$ ls
README.md main.tf vars.tf
เราเริ่มต้นโมดูลโดยใช้คำสั่ง:
$ terraform init
ผลลัพธ์แสดงให้เห็นว่า Terraform ดาวน์โหลดเวอร์ชันล่าสุดของผู้ให้บริการที่ใช้และตรวจสอบโมดูลทั้งหมดที่อธิบายไว้ในตัวอย่าง
ก่อนอื่น เรามาประยุกต์ใช้โมดูลกันก่อน โครงการ_with_user. สิ่งนี้ต้องส่งค่าด้วยตนเองสำหรับตัวแปรที่ยังไม่ได้ตั้งค่า:
- sel_account ด้วยหมายเลขบัญชี Selectel ของคุณ
- sel_token ด้วยรหัสของคุณสำหรับ Selectel API
- ผู้ใช้_รหัสผ่าน พร้อมรหัสผ่านสำหรับผู้ใช้ OpenStack
ต้องนำค่าสำหรับตัวแปรสองตัวแรกมา
สำหรับตัวแปรสุดท้าย คุณสามารถสร้างรหัสผ่านใดก็ได้
หากต้องการใช้โมดูล คุณจะต้องแทนที่ค่าต่างๆ SEL_ACCOUNT, SEL_TOKEN и USER_รหัสผ่าน รันคำสั่ง:
$ 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
เมื่อสร้างทรัพยากร ให้ใส่ใจกับเอาต์พุต Terraform พร้อมที่อยู่ IP ภายนอกที่จะสามารถเข้าถึงเซิร์ฟเวอร์ที่สร้างขึ้นได้:
module.server_local_root_disk.openstack_networking_floatingip_associate_v2.association_1: Creating...
floating_ip: "" => "x.x.x.x"
คุณสามารถทำงานกับเครื่องเสมือนที่สร้างขึ้นผ่าน SSH โดยใช้ IP ที่ระบุ
การแก้ไขทรัพยากร
นอกจากการสร้างทรัพยากรผ่าน Terraform แล้ว ยังสามารถแก้ไขได้อีกด้วย
ตัวอย่างเช่น เรามาเพิ่มจำนวนคอร์และหน่วยความจำสำหรับเซิร์ฟเวอร์ของเราโดยการเปลี่ยนค่าของพารามิเตอร์ server_vcpus и เซิร์ฟเวอร์_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_userแล้วสร้างอย่างอื่นทั้งหมด:
$ 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
เราจะถ่ายโอนการสร้างและการจัดการคลัสเตอร์ Kubernetes ผ่านส่วนประกอบ OpenStack Magnum คุณสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานกับคลัสเตอร์ได้จากหนึ่งในคลัสเตอร์ของเรา
เมื่อเตรียมคลัสเตอร์ ดิสก์และเครื่องเสมือนจะถูกสร้างขึ้นและส่วนประกอบที่จำเป็นทั้งหมดจะถูกติดตั้ง การเตรียมการใช้เวลาประมาณ 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 ที่สร้างขึ้นผ่านยูทิลิตี้ Kubectl คุณต้องได้รับไฟล์การเข้าถึงคลัสเตอร์ หากต้องการทำสิ่งนี้ ให้ไปที่โปรเจ็กต์ที่สร้างผ่าน Terraform ในรายการโปรเจ็กต์ในบัญชีของคุณ:
ต่อไปตามลิงค์เช่น
สำหรับข้อมูลการเข้าสู่ระบบ ให้ใช้ชื่อผู้ใช้และรหัสผ่านที่คุณสร้างผ่าน Terraform หากคุณไม่โกง vars.tf หรือ main.tf สำหรับตัวอย่างของเรา ผู้ใช้จะมีชื่อ tf_user. คุณต้องใช้ค่าของตัวแปรเป็นรหัสผ่าน TF_VAR_user_passwordซึ่งระบุไว้เมื่อเริ่มต้น ใช้ภูมิประเทศ ก่อนหน้านี้
ภายในโครงการคุณต้องไปที่แท็บ Kubernetes:
นี่คือที่ตั้งของคลัสเตอร์ที่สร้างผ่าน Terraform ดาวน์โหลดไฟล์สำหรับ Kubectl คุณสามารถทำได้บนแท็บ "การเข้าถึง":
คำแนะนำในการติดตั้งจะอยู่ในแท็บเดียวกัน Kubectl และการใช้งานที่ดาวน์โหลดมา config.yaml.
หลังจากเปิดตัว Kubectl และการตั้งค่าตัวแปรสภาพแวดล้อม คูเบคอนฟิก คุณสามารถใช้ 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 ได้ทาง
ที่มา: will.com