Евгений Штольц - Облачная экосистема
- Название:Облачная экосистема
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:2021
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Евгений Штольц - Облачная экосистема краткое содержание
Облачная экосистема - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
cluster_instance_ids = "${join(",", google_compute_instance.cluster.*.id)}"
}
connection {
host = "${google_compute_address.static-ip-address.address}"
type = "ssh"
user = "essh"
timeout = "2m"
private_key = "${file("~/node-cluster/node-cluster")}"
# agent = "false"
}
provisioner "file" {
source = "client.js"
destination = "~/client.js"
}
provisioner "remote-exec" {
inline = [
"cd ~ && echo 1 > test.txt"
]
}
essh@kubernetes-master:~/node-cluster$ sudo ./terraform apply
google_compute_address.static-ip-address: Creating…
google_compute_address.static-ip-address: Creation complete after 5s [id=node-cluster-243923/europe-north1/static-ip-address]
google_compute_instance.cluster: Creating…
google_compute_instance.cluster: Still creating… [10s elapsed]
google_compute_instance.cluster: Creation complete after 12s [id=cluster]
null_resource.cluster: Creating…
null_resource.cluster: Provisioning with 'file'…
null_resource.cluster: Provisioning with 'remote-exec'…
null_resource.cluster (remote-exec): Connecting to remote host via SSH…
null_resource.cluster (remote-exec): Host: 35.228.82.222
null_resource.cluster (remote-exec): User: essh
null_resource.cluster (remote-exec): Password: false
null_resource.cluster (remote-exec): Private key: true
null_resource.cluster (remote-exec): Certificate: false
null_resource.cluster (remote-exec): SSH Agent: false
null_resource.cluster (remote-exec): Checking Host Key: false
null_resource.cluster (remote-exec): Connected!
null_resource.cluster: Creation complete after 7s [id=816586071607403364]
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
esschtolts@cluster:~$ ls /home/essh/
client.js test.txt
[sudo] password for essh:
google_compute_address.static-ip-address: Refreshing state… [id=node-cluster-243923/europe-north1/static-ip-address]
google_compute_instance.cluster: Refreshing state… [id=cluster]
null_resource.cluster: Refreshing state… [id=816586071607403364]
Enter a value: yes
null_resource.cluster: Destroying… [id=816586071607403364]
null_resource.cluster: Destruction complete after 0s
google_compute_instance.cluster: Destroying… [id=cluster]
google_compute_instance.cluster: Still destroying… [id=cluster, 10s elapsed]
google_compute_instance.cluster: Still destroying… [id=cluster, 20s elapsed]
google_compute_instance.cluster: Destruction complete after 27s
google_compute_address.static-ip-address: Destroying… [id=node-cluster-243923/europe-north1/static-ip-address]
google_compute_address.static-ip-address: Destruction complete after 8s
Для деплоя всего проекта можно добавить его в репозиторий, а загружать его в виртуальную машину будем через копирование установочного скрипта на эту виртуальную машину с последующим его запуском:
Переходим к Kubernetes
В минимальном варианте создание кластера из трёх нод выглядит примерно так:
essh@kubernetes-master:~/node-cluster/Kubernetes$ cat main.tf
provider "google" {
credentials = "${file("../kubernetes_key.json")}"
project = "node-cluster-243923"
region = "europe-north1"
}
resource "google_container_cluster" "node-ks" {
name = "node-ks"
location = "europe-north1-a"
initial_node_count = 3
}
essh@kubernetes-master:~/node-cluster/Kubernetes$ sudo ../terraform init
essh@kubernetes-master:~/node-cluster/Kubernetes$ sudo ../terraform apply
Кластер создался за 2:15, а после того, как я добавил europe-north1-a две дополнительные зоны europe-north1 -b, europe-north1-c и установили количество создаваемых инстансев в зоне в один, кластер создался за 3:13 секунде, потому что для более высокой доступности ноды были созданы в разных дата-центрах: europe-north1-a, europe-north1-b, europe-north1-c:
provider "google" {
credentials = "${file("../kubernetes_key.json")}"
project = "node-cluster-243923"
region = "europe-north1"
}
resource "google_container_cluster" "node-ks" {
name = "node-ks"
location = "europe-north1-a"
node_locations = ["europe-north1-b", "europe-north1-c"]
initial_node_count = 1
}
Теперь разделим наш кластер на два: управляющий кластер с Kubernetes и кластер для наших POD. Все кластера будет распределены по трём дата – центрам. Кластер для наших POD может авто масштабироваться под нагрузкой до 2 на каждой зоне (с трёх до шести в общем):
essh@kubernetes-master:~/node-cluster/Kubernetes$ cat main.tf
provider "google" {
credentials = "${file("../kubernetes_key.json")}"
project = "node-cluster-243923"
region = "europe-north1"
}
resource "google_container_cluster" "node-ks" {
name = "node-ks"
location = "europe-north1-a"
node_locations = ["europe-north1-b", "europe-north1-c"]
initial_node_count = 1
}
resource "google_container_node_pool" "node-ks-pool" {
name = "node-ks-pool"
cluster = "${google_container_cluster.node-ks.name}"
location = "europe-north1-a"
node_count = "1"
node_config {
machine_type = "n1-standard-1"
}
autoscaling {
min_node_count = 1
max_node_count = 2
}
}
Посмотрим, что получалось и поищем IP- адрес точки входа в кластер:
essh@kubernetes-master:~/node-cluster/Kubernetes$ gcloud container clusters list
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS
node-ks europe-north1-a 1.12.8-gke.6 35.228.20.35 n1-standard-1 1.12.8-gke.6 6 RECONCILING
essh@kubernetes-master:~/node-cluster/Kubernetes$ gcloud container clusters describe node-ks | grep '^endpoint'
endpoint: 35.228.20.35
essh@kubernetes-master:~/node-cluster/Kubernetes$ ping 35.228.20.35 -c 2
PING 35.228.20.35 (35.228.20.35) 56(84) bytes of data.
64 bytes from 35.228.20.35: icmp_seq=1 ttl=59 time=8.33 ms
64 bytes from 35.228.20.35: icmp_seq=2 ttl=59 time=7.09 ms
-– 35.228.20.35 ping statistics –
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 7.094/7.714/8.334/0.620 ms
Добавив переменные, которые я выделил в отдельный файл только для наглядности, которые параметризуют наш конфиг под разное использование, мы сможем его использовать, например, для создания тестового и рабочего кластеров. Добавлять переменные можно как var.name_value, а вставлять в текст аналогично JS: ${var.name_value}, а также path.root.
essh@kubernetes-master:~/node-cluster/Kubernetes$ cat variables.tf
variable "region" {
default = "europe-north1"
}
variable "project_name" {
type = string
default = ""
}
variable "gce_key" {
default = "./kubernetes_key.json"
}
variable "node_count_zone" {
default = 1
}
Передать их можно через ключ -var, например: sudo ./terraform apply -var="project_name=node-cluster-243923".
essh@kubernetes-master:~/node-cluster/Kubernetes$ cp ../kubernetes_key.json .
essh@kubernetes-master:~/node-cluster/Kubernetes$ sudo ../terraform apply -var="project_name=node-cluster-243923"
Наш проект в папке является не только проектом, но и модулем, готовым к использованию:
essh@kubernetes-master:~/node-cluster/Kubernetes$ cd ..
essh@kubernetes-master:~/node-cluster$ cat main.tf
module "Kubernetes" {
source = "./Kubernetes"
project_name = "node-cluster-243923"
}
essh@kubernetes-master:~/node-cluster$ sudo ./terraform apply
Или же загрузить в публичный репозиторий:
essh@kubernetes-master:~/node-cluster/Kubernetes$ git init
Initialized empty GIT repository in /home/essh/node-cluster/Kubernetes/.git/
essh@kubernetes-master:~/node-cluster/Kubernetes$ echo "terraform.tfstate" >> .gitignore
essh@kubernetes-master:~/node-cluster/Kubernetes$ echo "terraform.tfstate.backup" >> .gitignore
essh@kubernetes-master:~/node-cluster/Kubernetes$ echo ".terraform/" >> .gitignore
essh@kubernetes-master:~/node-cluster/Kubernetes$ rm -f kubernetes_key.json
essh@kubernetes-master:~/node-cluster/Kubernetes$ git remote add origin https://github.com/ESSch/terraform-google-kubernetes.git
essh@kubernetes-master:~/node-cluster/Kubernetes$ git add .
essh@kubernetes-master:~/node-cluster/Kubernetes$ git commit -m 'create a k8s Terraform module'
[master (root-commit) 4f73c64] create a Kubernetes Terraform module
3 files changed, 48 insertions(+)
create mode 100644 .gitignore
create mode 100644 main.tf
create mode 100644 variables.tf
essh@kubernetes-master:~/node-cluster/Kubernetes$ git push -u origin master
essh@kubernetes-master:~/node-cluster/Kubernetes$ git tag -a v0.0.2 -m 'publish'
essh@kubernetes-master:~/node-cluster/Kubernetes$ git push origin v0.0.2
После публикации в реестре модулей https://registry.terraform.io/, выполнив требования, такие как наличие описания, мы можем его использовать:
essh@kubernetes-master:~/node-cluster$ cat main.tf
module "kubernetes" {
# source = "./Kubernetes"
source = "ESSch/kubernetes/google"
version = "0.0.2"
project_name = "node-cluster-243923"
}
essh@kubernetes-master:~/node-cluster$ sudo ./terraform init
essh@kubernetes-master:~/node-cluster$ sudo ./terraform apply
При очередном создании кластера у меня возникла ошибка ZONE_RESOURCE_POOL_EXHAUSTED "does not have enough resources available to fulfill the request. Try a different zone, or try again later", говорящая о том, что в данном регионе нет нужных серверов. Для меня это не проблема и мне не нужно править код модуля, ведь я параметризовал модуль регионом, и если я просто передам модулю в качестве параметра регионregion = "europe-west2", terraform после команды обновления и инициализации ./terrafrom init и команды применения ./terraform apply перенесёт мой кластер в указный регион. Ещё немного улучшим наш модуль тем, что вынесем провайдер (provider) из дочернего модуля Kubernetes в главный модуль (основной скрипт также является модулем). Вынеся в главный модуль, мы сможем использовать ещё один модуль, в противном случае провайдер в одном модуле будет конфликтовать с провайдером в другом. Наследование из главного модуля в дочерние и их прозрачность относится только к провайдерам. Остальные же данные для передачи из дочернего в родительский придётся использовать внешние переменные, а из родительского в дочерний – параметризовать родительский, но это позже, когда мы будем создавать ещё один модель. Также, вынесение провайдера в родительский модуль, будет полезно при создании следующего модуля, который мы создадим, так как он будет создавать элементы Kubernetes, которые не зависят от провайдера, и мы сможем тем самым отвязать провайдера Google от нашего модуля и его можно будет использовать с другими провайдерами, поддерживающим Kubernetes. Теперь нам не нужна передавать в переменной название проекта – он задан в провайдере. Для удобства разработки я буду пока использовать локальное подключение модуля. Я создал папку и файл нового модуля:
Читать дальшеИнтервал:
Закладка: