Мурғ ё тухм: тақсим кардани IaC

Мурғ ё тухм: тақсим кардани IaC
Аввалин чӣ омад - мурғ ё тухм? Оғози хеле аҷиб барои мақола дар бораи Infrastructure-as-Code, ҳамин тавр не?

Тухм чист?

Аксар вақт, Infrastructure-as-Code (IaC) як роҳи декларативии муаррифии инфрасохтор мебошад. Дар он мо ҳолатеро, ки мо мехоҳем ба даст орем, аз қисми сахтафзор сар карда то бо конфигуратсияи нармафзор тавсиф мекунем. Аз ин рӯ, IaC барои:

  1. Таъмини захираҳо. Инҳо VMs, S3, VPC ва ғайра мебошанд. Воситаҳои асосӣ барои кор: Терафром и CloudFormation.
  2. Танзимоти нармафзор. Воситаҳои асосӣ: Фаҳмост, Ошпаз ва ғайра.

Ҳама гуна код дар анбори git мавҷуд аст. Ва дер ё зуд сардори бригада тасмим мегирад, ки онҳоро ба тартиб даровардан лозим аст. Ва ӯ рефаксия хоҳад кард. Ва он баъзе сохторҳоро эҷод мекунад. Ва ӯ хоҳад дид, ки ин хуб аст.

Инчунин хуб аст, ки он аллакай вуҷуд дорад Гуглаб и GitHub-провайдери Terraform (ва ин конфигуратсияи нармафзор аст). Бо ёрии онҳо шумо метавонед тамоми лоиҳаро идора кунед: аъзоёни даста, CI/CD, git-flow ва ғайра.

Тухм аз куҷо пайдо шуд?

Ҳамин тавр, мо тадриҷан ба саволи асосӣ наздик мешавем.

Пеш аз ҳама, шумо бояд аз анборе оғоз кунед, ки сохтори дигар анборҳо, аз ҷумла худатонро тавсиф мекунад. Ва албатта, ҳамчун як қисми GitOps, шумо бояд CI-ро илова кунед, то тағиротҳо ба таври худкор иҷро шаванд.

Агар Git ҳанӯз сохта нашуда бошад?

  1. Чӣ тавр онро дар Git нигоҳ доштан мумкин аст?
  2. Чӣ тавр насб кардани CI?
  3. Агар мо низ Gitlab-ро бо истифода аз IaC ва ҳатто дар Kubernetes ҷойгир кунем?
  4. Ва GitLab Runner низ дар Кубернетес?
  5. Дар бораи Kubernetes дар провайдери абр чӣ гуфтан мумкин аст?

Аввалин чӣ омад: GitLab, ки дар он ман рамзи худро бор мекунам ё коде, ки ба ман чӣ гуна GitLab лозим аст?

Гӯшти мурғ бо тухм

«Оякодон3 бо динозавр" [СРС]

Биёед кӯшиш кунем, ки як табақро ҳамчун провайдери абрӣ истифода барем Kubernetes Selectel идорашаванда.

ХИБ; DR

Оё мумкин аст, ки якбора ба як даста ҳамроҳ шавад?

$ export MY_SELECTEL_TOKEN=<token>
$ curl https://gitlab.com/chicken-or-egg/mks/make/-/snippets/2002106/raw | bash

Компонентњо:

  • Ҳисоб аз my.selectel.ru;
  • Нишонаи ҳисоб;
  • малакаҳои Kubernetes;
  • Малакаҳои руль;
  • малакаҳои терраформӣ;
  • Диаграммаи чархи GitLab;
  • Диаграммаи чархи GitLab Runner.

Дорухат:

  1. MY_SELECTEL_TOKEN-ро аз панел гиред my.selectel.ru.
  2. Бо интиқол додани аломати ҳисоб ба он кластери Kubernetes эҷод кунед.
  3. KUBECONFIG-ро аз кластери сохташуда гиред.
  4. GitLab-ро дар Kubernetes насб кунед.
  5. GitLab-token-ро аз GitLab барои корбар эҷод кунед реша.
  6. Бо истифода аз GitLab-token дар GitLab сохтори лоиҳа эҷод кунед.
  7. Рамзи мавҷударо ба GitLab тела диҳед.
  8. ???
  9. Фоида!

қадам 1. Токенро дар бахш дастрас кардан мумкин аст Калидҳои API.

Мурғ ё тухм: тақсим кардани IaCқадам 2. Мо Terraform-и худро барои "пухтани" кластери аз 2 гиреҳ омода мекунем. Агар шумо боварӣ дошта бошед, ки шумо барои ҳама чиз захираҳои кофӣ доред, пас шумо метавонед квотаҳои автоматиро фаъол созед:

provider "selectel" {
 token = var.my_selectel_token
}

variable "my_selectel_token" {}
variable "username" {}
variable "region" {}


resource "selectel_vpc_project_v2" "my-k8s" {
 name = "my-k8s-cluster"
 theme = {
   color = "269926"
 }
 quotas {
   resource_name = "compute_cores"
   resource_quotas {
     region = var.region
     zone = "${var.region}a"
     value = 16
   }
 }
 quotas {
   resource_name = "network_floatingips"
   resource_quotas {
     region = var.region
     value = 1
   }
 }
 quotas {
   resource_name = "load_balancers"
   resource_quotas {
     region = var.region
     value = 1
   }
 }
 quotas {
   resource_name = "compute_ram"
   resource_quotas {
     region = var.region
     zone = "${var.region}a"
     value = 32768
   }
 }
 quotas {
   resource_name = "volume_gigabytes_fast"
   resource_quotas {
     region = var.region
     zone = "${var.region}a"
     # (20 * 2) + 50 + (8 * 3 + 10)
     value = 130
   }
 }
}

resource "selectel_mks_cluster_v1" "k8s-cluster" {
 name         = "k8s-cluster"
 project_id   = selectel_vpc_project_v2.my-k8s.id
 region       = var.region
 kube_version = "1.17.9"
}

resource "selectel_mks_nodegroup_v1" "nodegroup_1" {
 cluster_id        = selectel_mks_cluster_v1.k8s-cluster.id
 project_id        = selectel_mks_cluster_v1.k8s-cluster.project_id
 region            = selectel_mks_cluster_v1.k8s-cluster.region
 availability_zone = "${var.region}a"
 nodes_count       = 2
 cpus              = 8
 ram_mb            = 16384
 volume_gb         = 15
 volume_type       = "fast.${var.region}a"
 labels            = {
   "project": "my",
 }
}

Ба лоиҳа корбар илова кунед:

resource "random_password" "my-k8s-user-pass" {
 length = 16
 special = true
 override_special = "_%@"
}

resource "selectel_vpc_user_v2" "my-k8s-user" {
 password = random_password.my-k8s-user-pass.result
 name = var.username
 enabled  = true
}

resource "selectel_vpc_keypair_v2" "my-k8s-user-ssh" {
 public_key = file("~/.ssh/id_rsa.pub")
 user_id    = selectel_vpc_user_v2.my-k8s-user.id
 name = var.username
}

resource "selectel_vpc_role_v2" "my-k8s-role" {
 project_id = selectel_vpc_project_v2.my-k8s.id
 user_id    = selectel_vpc_user_v2.my-k8s-user.id
}

Маълумотҳои баромад:

output "project_id" {
 value = selectel_vpc_project_v2.my-k8s.id
}

output "k8s_id" {
 value = selectel_mks_cluster_v1.k8s-cluster.id
}

output "user_name" {
 value = selectel_vpc_user_v2.my-k8s-user.name
}

output "user_pass" {
 value = selectel_vpc_user_v2.my-k8s-user.password
}

Мо оғоз мекунем:

$ env 
TF_VAR_region=ru-3 
TF_VAR_username=diamon 
TF_VAR_my_selectel_token=<token> 
terraform plan -out planfile

$ terraform apply -input=false -auto-approve planfile

Мурғ ё тухм: тақсим кардани IaC
қадам 3. Мо конфигуратсияи cube-ро мегирем.

Барои ба таври барномавӣ зеркашӣ кардани KUBECONFIG, шумо бояд аз OpenStack нишона гиред:

openstack token issue -c id -f value > token

Ва бо ин нишона ба API Managed Kubernetes Selectel дархост кунед. k8s_id масъалахое terraform:

curl -XGET -H "x-auth-token: $(cat token)" "https://ru-3.mks.selcloud.ru/v1/clusters/$(cat k8s_id)/kubeconfig" -o kubeConfig.yaml

Cupconfig инчунин метавонад тавассути панел дастрас карда шавад.

Мурғ ё тухм: тақсим кардани IaC
қадам 4. Пас аз пухтани кластер ва мо ба он дастрасӣ дорем, мо метавонем ба боло ямл илова кунем, то бичашем.

Ман мехоҳам илова кунам:

  • фазои ном
  • синфи нигоҳдорӣ
  • сиёсати амнияти pod ва ғайра.

Синфи нигоҳдорӣ барои Selectel мумкин аст аз гирифта анбори расмӣ.

Аз ибтидо ман кластерро дар минтақа интихоб кардам ру-3а, пас ба ман Синфи нигаҳдорӣ аз ин минтақа лозим аст.

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
 name: fast.ru-3a
 annotations:
   storageclass.kubernetes.io/is-default-class: "true"
provisioner: cinder.csi.openstack.org
parameters:
 type: fast.ru-3a
 availability: ru-3a
allowVolumeExpansion: true

қадам 5. Тавозуни сарборӣ насб кунед.

Мо барои бисёриҳо стандартиро истифода хоҳем бурд nginx-даромад. Барои насб кардани он аллакай дастурҳои зиёде мавҷуданд, аз ин рӯ мо дар бораи он таваққуф намекунем.

$ helm repo add nginx-stable https://helm.nginx.com/stable
$ helm upgrade nginx-ingress nginx-stable/nginx-ingress -n ingress --install -f ../internal/K8S-cluster/ingress/values.yml

Мо интизорем, ки он як IP-и берунаро тақрибан 3-4 дақиқа қабул кунад:

Мурғ ё тухм: тақсим кардани IaC
IP-и берунӣ гирифта шудааст:

Мурғ ё тухм: тақсим кардани IaC
қадам 6. GitLab насб кунед.

$ helm repo add gitlab https://charts.gitlab.io
$ helm upgrade gitlab gitlab/gitlab -n gitlab  --install -f gitlab/values.yml --set "global.hosts.domain=gitlab.$EXTERNAL_IP.nip.io"

Мо боз интизор мешавем, ки ҳама гулҳо баланд шаванд.

kubectl get po -n gitlab
NAME                                      	READY   STATUS  	RESTARTS   AGE
gitlab-gitaly-0                           	0/1 	Pending 	0      	0s
gitlab-gitlab-exporter-88f6cc8c4-fl52d    	0/1 	Pending 	0      	0s
gitlab-gitlab-runner-6b6867c5cf-hd9dp     	0/1 	Pending 	0      	0s
gitlab-gitlab-shell-55cb6ccdb-h5g8x       	0/1 	Init:0/2	0      	0s
gitlab-migrations.1-2cg6n                 	0/1 	Pending 	0      	0s
gitlab-minio-6dd7d96ddb-zd9j6             	0/1 	Pending 	0      	0s
gitlab-minio-create-buckets.1-bncdp       	0/1 	Pending 	0      	0s
gitlab-postgresql-0                       	0/2 	Pending 	0      	0s
gitlab-prometheus-server-6cfb57f575-v8k6j 	0/2 	Pending 	0      	0s
gitlab-redis-master-0                     	0/2 	Pending 	0      	0s
gitlab-registry-6bd77b4b8c-pb9v9          	0/1 	Pending 	0      	0s
gitlab-registry-6bd77b4b8c-zgb6r          	0/1 	Init:0/2	0      	0s
gitlab-shared-secrets.1-pc7-5jgq4         	0/1 	Completed   0      	20s
gitlab-sidekiq-all-in-1-v1-54dbcf7f5f-qbq67   0/1 	Pending 	0      	0s
gitlab-task-runner-6fd6857db7-9x567       	0/1 	Pending 	0      	0s
gitlab-webservice-d9d4fcff8-hp8wl         	0/2 	Pending 	0      	0s
Waiting gitlab
./wait_gitlab.sh ../internal/gitlab/gitlab/.pods
waiting for pod...
waiting for pod...
waiting for pod...

Гулҳо бархостанд:

Мурғ ё тухм: тақсим кардани IaC
қадам 7. Мо GitLab-токен мегирем.

Аввалан, пароли воридшавӣ пайдо кунед:

kubectl get secret -n gitlab gitlab-gitlab-initial-root-password -o jsonpath='{.data.password}' | base64 --decode

Акнун биёед ворид шавем ва нишона гирем:

python3 get_gitlab_token.py root $GITLAB_PASSWORD http://gitlab.gitlab.$EXTERNAL_IP.nip.io

қадам 8. Бо истифода аз провайдери Gitlab интиқол додани анбори Git ба иерархияи дуруст.

cd ../internal/gitlab/hierarchy && terraform apply -input=false -auto-approve planfile

Мутаассифона, провайдери terraform GitLab дорои шинокунанда дорад хато. Пас шумо бояд лоиҳаҳои ихтилофро дастӣ нест кунед, то tf.state ислоҳ шавад. Пас фармони '$ҳама кунад'-ро дубора иҷро кунед

қадам 9. Мо анборҳои маҳаллиро ба сервер интиқол медиҳем.

$ make push

[master (root-commit) b61d977]  Initial commit
 3 files changed, 46 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 values.yml
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 770 bytes | 770.00 KiB/s, done.
Total 5 (delta 0), reused 0 (delta 0)

Муҳокима:

Мурғ ё тухм: тақсим кардани IaC
Мурғ ё тухм: тақсим кардани IaC
Мурғ ё тухм: тақсим кардани IaC

хулоса

Мо ба он ноил шудем, ки мо ҳама чизро аз мошини маҳаллии худ декларатсия идора карда метавонем. Ҳоло ман мехоҳам ҳамаи ин вазифаҳоро ба CI интиқол диҳам ва танҳо тугмаҳоро пахш кунам. Барои ин, мо бояд иёлатҳои маҳаллии худро (давлати Terraform) ба CI интиқол диҳем. Чӣ тавр ин корро кардан дар қисми оянда аст.

Ба мо обуна шавед блогто нашри мақолаҳои навро аз даст надиҳед!

Манбаъ: will.com

Илова Эзоҳ