Nhà cung cấp địa hình Selectel

Nhà cung cấp địa hình Selectel

Chúng tôi đã ra mắt nhà cung cấp Terraform chính thức để hợp tác với Selectel. Sản phẩm này cho phép người dùng thực hiện đầy đủ việc quản lý tài nguyên thông qua phương pháp Cơ sở hạ tầng dưới dạng mã.

Nhà cung cấp hiện hỗ trợ quản lý tài nguyên dịch vụ "Đám mây riêng ảo" (sau đây gọi tắt là VPC). Trong tương lai, chúng tôi dự định bổ sung tính năng quản lý tài nguyên cho các dịch vụ khác do Selectel cung cấp.

Như bạn đã biết, dịch vụ VPC được xây dựng trên OpenStack. Tuy nhiên, do OpenStack không cung cấp các công cụ gốc để phục vụ đám mây công cộng nên chúng tôi đã triển khai chức năng còn thiếu trong một bộ API bổ sung nhằm đơn giản hóa việc quản lý các đối tượng tổng hợp phức tạp và giúp công việc thuận tiện hơn. Một số chức năng có sẵn trong OpenStack không được sử dụng trực tiếp nhưng có sẵn thông qua API của chúng tôi.

Nhà cung cấp Selectel Terraform hiện có khả năng quản lý các tài nguyên VPC sau:

  • các dự án và hạn ngạch của họ;
  • người dùng, vai trò và mã thông báo của họ;
  • mạng con công cộng, bao gồm xuyên khu vực và VRRP;
  • giấy phép phần mềm.

Nhà cung cấp sử dụng thư viện Go công khai của chúng tôi để hoạt động với API VPC. Cả thư viện và nhà cung cấp đều là nguồn mở, quá trình phát triển của chúng được thực hiện trên Github:

Để quản lý các tài nguyên đám mây khác, chẳng hạn như máy ảo, ổ đĩa, cụm Kubernetes, bạn có thể sử dụng nhà cung cấp OpenStack Terraform. Tài liệu chính thức cho cả hai nhà cung cấp có sẵn tại các liên kết sau:

Bắt đầu

Để bắt đầu, bạn cần cài đặt Terraform (có thể tìm thấy hướng dẫn và liên kết đến các gói cài đặt tại trang web chính thức).

Để hoạt động, nhà cung cấp yêu cầu khóa API Selectel, được tạo trong bảng điều khiển tài khoản.

Các bản kê khai để làm việc với Selectel được tạo bằng Terraform hoặc sử dụng một tập hợp các ví dụ làm sẵn có sẵn trong kho lưu trữ Github của chúng tôi: ví dụ về địa hình.

Kho chứa các ví dụ được chia thành hai thư mục:

  • mô-đun, chứa các mô-đun nhỏ có thể tái sử dụng, lấy một tập hợp các tham số làm đầu vào và quản lý một tập hợp tài nguyên nhỏ;
  • ví dụ, chứa các ví dụ về một bộ hoàn chỉnh các mô-đun được kết nối với nhau.

Sau khi cài đặt Terraform, tạo khóa API Selectel và làm quen với các ví dụ, hãy chuyển sang các ví dụ thực tế.

Một ví dụ về tạo máy chủ bằng đĩa cục bộ

Hãy xem một ví dụ về tạo dự án, người dùng có vai trò và máy ảo có đĩa cục bộ: terraform-examples/examples/vpc/server_local_root_disk.

Trong tập tin vars.tf tất cả các tham số sẽ được sử dụng khi gọi mô-đun đều được mô tả. Một số trong số chúng có giá trị mặc định, ví dụ: máy chủ sẽ được tạo trong vùng ru-3a với cấu hình sau:

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"
}

Trong tập tin chính.tf Nhà cung cấp Selectel được khởi tạo:

provider "selectel" {
token    = "${var.sel_token}"
}

Tệp này cũng chứa giá trị mặc định cho khóa SSH sẽ được cài đặt trên máy chủ:

module "server_local_root_disk" {
...
server_ssh_key      = "${file("~/.ssh/id_rsa.pub")}"
}

Nếu cần, bạn có thể chỉ định một khóa công khai khác. Khóa không nhất thiết phải được chỉ định làm đường dẫn tệp; bạn cũng có thể thêm giá trị dưới dạng chuỗi.

Hơn nữa trong tập tin này các mô-đun được khởi chạy dự án_with_user и server_local_root_disk, quản lý các tài nguyên cần thiết.

Hãy xem xét các mô-đun này chi tiết hơn.

Tạo dự án và người dùng có vai trò

Mô-đun đầu tiên tạo một dự án và người dùng có vai trò trong dự án đó: terraform-examples/modules/vpc/project_with_user.

Người dùng đã tạo sẽ có thể đăng nhập vào OpenStack và quản lý tài nguyên của nó. Mô-đun này đơn giản và chỉ quản lý ba thực thể:

  • chọn_vpc_project_v2,
  • chọn_vpc_user_v2,
  • selectel_vpc_role_v2.

Tạo một máy chủ ảo với đĩa cục bộ

Mô-đun thứ hai đề cập đến việc quản lý các đối tượng OpenStack, cần thiết để tạo một máy chủ bằng đĩa cục bộ.

Bạn nên chú ý đến một số đối số được chỉ định trong mô-đun này cho tài nguyên openstack_compute_instance_v2:

resource "openstack_compute_instance_v2" "instance_1" {
  ...

  lifecycle {
    ignore_changes = ["image_id"]
  }

  vendor_options {
    ignore_resize_confirmation = true
  }
}

Tranh luận bỏ qua_changes cho phép bạn bỏ qua những thay đổi thuộc tính id cho hình ảnh được sử dụng để tạo máy ảo. Trong dịch vụ VPC, hầu hết các hình ảnh công khai được cập nhật tự động mỗi tuần một lần và đồng thời id cũng thay đổi. Điều này là do đặc thù của thành phần OpenStack - Glance, trong đó hình ảnh được coi là thực thể bất biến.

Nếu bạn đang tạo hoặc sửa đổi một máy chủ hoặc đĩa hiện có có đối số id_hình ảnh được sử dụng id hình ảnh công khai, sau khi hình ảnh đó được cập nhật, việc chạy lại tệp kê khai Terraform sẽ tạo lại máy chủ hoặc ổ đĩa. Sử dụng một đối số bỏ qua_changes cho phép bạn tránh được tình huống như vậy.

Lưu ý: đối số bỏ qua_changes đã xuất hiện ở Terraform cách đây khá lâu: kéo #2525.

Tranh luận bỏ qua_resize_confirmation cần thiết để thay đổi kích thước thành công đĩa cục bộ, lõi hoặc bộ nhớ máy chủ. Những thay đổi như vậy được thực hiện thông qua thành phần OpenStack Nova bằng cách sử dụng yêu cầu thay đổi kích thước. Nova mặc định sau khi yêu cầu thay đổi kích thước đặt máy chủ vào trạng thái xác minh_resize và chờ xác nhận bổ sung từ người dùng. Tuy nhiên, hành vi này có thể được thay đổi để Nova không phải chờ đợi các hành động bổ sung từ người dùng.

Đối số được chỉ định cho phép Terraform không chờ trạng thái xác minh_resize cho máy chủ và chuẩn bị cho máy chủ ở trạng thái hoạt động sau khi thay đổi các thông số của nó. Đối số có sẵn từ phiên bản 1.10.0 của nhà cung cấp OpenStack Terraform: kéo #422.

Tạo tài nguyên

Trước khi chạy tệp kê khai, xin lưu ý rằng trong ví dụ của chúng tôi, hai nhà cung cấp khác nhau được khởi chạy và nhà cung cấp OpenStack phụ thuộc vào tài nguyên của nhà cung cấp Selectel, vì nếu không tạo người dùng trong dự án thì không thể quản lý các đối tượng thuộc về nó . Thật không may, vì lý do tương tự, chúng tôi không thể chạy lệnh áp dụng địa hình bên trong ví dụ của chúng tôi. Đầu tiên chúng ta cần làm ứng dụng cho mô-đun dự án_with_user và sau đó cho mọi thứ khác.

Lưu ý: Vấn đề này vẫn chưa được giải quyết trong Terraform, bạn có thể theo dõi cuộc thảo luận trên Github tại vấn đề # 2430 и vấn đề # 4149.

Để tạo tài nguyên, hãy vào thư mục terraform-examples/examples/vpc/server_local_root_disk, nội dung của nó sẽ như thế này:

$ ls
README.md	   main.tf		vars.tf

Chúng tôi khởi tạo các mô-đun bằng lệnh:

$ terraform init

Kết quả đầu ra cho thấy Terraform tải xuống các phiên bản mới nhất của nhà cung cấp mà nó sử dụng và kiểm tra tất cả các mô-đun được mô tả trong ví dụ.

Đầu tiên hãy áp dụng mô-đun dự án_with_user. Điều này yêu cầu chuyển các giá trị theo cách thủ công cho các biến chưa được đặt:

  • sel_tài khoản với số tài khoản Selectel của bạn;
  • sel_token bằng khóa của bạn cho API Selectel;
  • mật khẩu người dùng bằng mật khẩu cho người dùng OpenStack.

Các giá trị cho hai biến đầu tiên phải được lấy từ bảng điều khiển.

Đối với biến cuối cùng, bạn có thể nghĩ ra bất kỳ mật khẩu nào.

Để sử dụng mô-đun bạn cần thay thế các giá trị SEL_ACCOUNT, SEL_TOKEN и MẬT KHẨU NGƯỜI DÙNG chạy lệnh:

$ 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

Sau khi chạy lệnh, Terraform sẽ hiển thị những tài nguyên mà nó muốn tạo và yêu cầu xác nhận:

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

Khi dự án, người dùng và vai trò đã được tạo, bạn có thể bắt đầu tạo các tài nguyên còn lại:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply

Khi tạo tài nguyên, hãy chú ý đến đầu ra Terraform với địa chỉ IP bên ngoài nơi máy chủ đã tạo sẽ có thể truy cập được:

module.server_local_root_disk.openstack_networking_floatingip_associate_v2.association_1: Creating...
  floating_ip: "" => "x.x.x.x"

Bạn có thể làm việc với máy ảo đã tạo thông qua SSH bằng IP được chỉ định.

Tài nguyên chỉnh sửa

Ngoài việc tạo tài nguyên thông qua Terraform, chúng cũng có thể được sửa đổi.

Ví dụ: hãy tăng số lượng lõi và bộ nhớ cho máy chủ của chúng tôi bằng cách thay đổi giá trị cho các tham số máy chủ_vcpus и máy chủ_ram_mb trong tập tin ví dụ/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

Sau này, chúng tôi kiểm tra những thay đổi nào sẽ dẫn đến việc sử dụng lệnh sau:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform plan

Kết quả là Terraform đã thực hiện thay đổi tài nguyên openstack_compute_instance_v2 и openstack_compute_flavor_v2.

Xin lưu ý rằng điều này sẽ đòi hỏi phải khởi động lại máy ảo đã tạo.

Để áp dụng cấu hình máy ảo mới, hãy sử dụng lệnh áp dụng địa hình, mà chúng tôi đã ra mắt trước đó.

Tất cả các đối tượng được tạo sẽ được hiển thị trong Bảng điều khiển VPC:

Nhà cung cấp địa hình Selectel

Trong của chúng tôi kho ví dụ Bạn cũng có thể xem bảng kê khai để tạo máy ảo bằng ổ đĩa mạng.

Ví dụ về tạo cụm Kubernetes

Trước khi chuyển sang ví dụ tiếp theo, chúng ta sẽ dọn sạch các tài nguyên mà chúng ta đã tạo trước đó. Để làm điều này trong thư mục gốc của dự án terraform-examples/examples/vpc/server_local_root_disk Hãy chạy lệnh xóa các đối tượng OpenStack:

$ 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

Sau đó chạy lệnh để xóa các đối tượng API Selectel VPC:

$ 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

Trong cả hai trường hợp, bạn sẽ cần xác nhận việc xóa tất cả các đối tượng:

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

Ví dụ sau đây có trong thư mục terraform-examples/examples/vpc/kubernetes_cluster.

Ví dụ này tạo một dự án, một người dùng có vai trò trong dự án và tạo một cụm Kubernetes. Trong tập tin vars.tf bạn có thể thấy các giá trị mặc định, chẳng hạn như số lượng nút, đặc điểm của chúng, phiên bản Kubernetes, v.v.

Để tạo tài nguyên tương tự như ví dụ đầu tiên, trước hết chúng ta sẽ bắt đầu khởi tạo mô-đun và tạo tài nguyên mô-đun dự án_with_uservà sau đó tạo mọi thứ khác:

$ 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

Chúng tôi sẽ chuyển giao việc tạo và quản lý các cụm Kubernetes thông qua thành phần OpenStack Magnum. Bạn có thể tìm hiểu thêm về cách làm việc với cụm tại một trong những bài viết trước, cũng như trong kiến thức cơ bản.

Khi chuẩn bị cụm, các đĩa và máy ảo sẽ được tạo và tất cả các thành phần cần thiết sẽ được cài đặt. Quá trình chuẩn bị mất khoảng 4 phút, trong thời gian đó Terraform sẽ hiển thị các thông báo như:

module.kubernetes_cluster.openstack_containerinfra_cluster_v1.cluster_1: Still creating... (3m0s elapsed)

Sau khi quá trình cài đặt hoàn tất, Terraform sẽ cho biết cụm đã sẵn sàng và hiển thị ID của nó:

module.kubernetes_cluster.openstack_containerinfra_cluster_v1.cluster_1: Creation complete after 4m20s (ID: 3c8...)

Apply complete! Resources: 6 added, 0 changed, 0 destroyed.

Để quản lý cụm Kubernetes đã tạo thông qua tiện ích kubectl bạn cần lấy tệp truy cập cụm. Để thực hiện việc này, hãy truy cập dự án được tạo thông qua Terraform trong danh sách các dự án trong tài khoản của bạn:

Nhà cung cấp địa hình Selectel

Tiếp theo, hãy theo liên kết như xxxxxx.selvpc.ruxuất hiện bên dưới tên dự án:

Nhà cung cấp địa hình Selectel

Để biết thông tin đăng nhập, hãy sử dụng tên người dùng và mật khẩu mà bạn đã tạo thông qua Terraform. Nếu bạn không lừa dối vars.tf hoặc chính.tf trong ví dụ của chúng tôi, người dùng sẽ có tên tf_user. Bạn phải sử dụng giá trị của biến làm mật khẩu TF_VAR_user_password, được chỉ định khi khởi động áp dụng địa hình sớm hơn.

Bên trong dự án bạn cần vào tab Kubernetes:

Nhà cung cấp địa hình Selectel

Đây là nơi đặt cụm được tạo thông qua Terraform. Tải tập tin về kubectl bạn có thể trên tab “Truy cập”:

Nhà cung cấp địa hình Selectel

Hướng dẫn cài đặt nằm trên cùng một tab. kubectl và sử dụng nội dung đã tải xuống config.yaml.

Sau khi khởi động kubectl và thiết lập biến môi trường KUBECONFIG bạn có thể sử dụng 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

Số lượng nút cụm có thể dễ dàng thay đổi thông qua Terraform.
Trong tập tin chính.tf giá trị sau được chỉ định:

cluster_node_count = "${var.cluster_node_count}"

Giá trị này được thay thế từ vars.tf:

variable "cluster_node_count" {
default = 2
}

Bạn có thể thay đổi giá trị mặc định trong vars.tfhoặc chỉ định giá trị được yêu cầu trực tiếp trong chính.tf:

-  cluster_node_count = "${var.cluster_node_count}"
+  cluster_node_count = 3

Để áp dụng các thay đổi, như trong trường hợp ví dụ đầu tiên, hãy sử dụng lệnh áp dụng địa hình:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply

Khi số lượng nút thay đổi, cụm sẽ vẫn khả dụng. Sau khi thêm nút qua Terraform, bạn có thể sử dụng nút đó mà không cần cấu hình bổ sung:

$ 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

Kết luận

Trong bài này chúng ta đã làm quen với những cách chính để làm việc với "Đám mây riêng ảo" thông qua Terraform. Chúng tôi sẽ rất vui nếu bạn sử dụng nhà cung cấp Selectel Terraform chính thức và cung cấp phản hồi.

Bất kỳ lỗi nào được tìm thấy trong nhà cung cấp Selectel Terraform đều có thể được báo cáo qua Các vấn đề về Github.

Nguồn: www.habr.com

Thêm một lời nhận xét