Пилешко или јајце: разделување на IaC

Пилешко или јајце: разделување на IaC
Што е прво - пилешкото или јајцето? Сосема чуден почеток за статија за Infrastructure-as-Code, нели?

Што е јајце?

Најчесто, Infrastructure-as-Code (IaC) е декларативен начин на претставување на инфраструктурата. Во него ја опишуваме состојбата што сакаме да ја постигнеме, почнувајќи од хардверскиот дел и завршувајќи со конфигурацијата на софтверот. Затоа IaC се користи за:

  1. Обезбедување ресурси. Тоа се VMs, S3, VPC итн. Основни алатки за работа: Terraform и Облак Формирање.
  2. Конфигурација на софтвер. Основни алатки: Ansible, готвач итн.

Секој код е во git складишта. И порано или подоцна, лидерот на тимот ќе одлучи дека тие треба да се стават во ред. И тој ќе рефакторира. И тоа ќе создаде одредена структура. И тој ќе види дека ова е добро.

Исто така, добро е што веќе постои GitLab и GitHub-провајдер за Terraform (а ова е софтверска конфигурација). Со нивна помош, можете да управувате со целиот проект: членови на тимот, CI/CD, git-flow итн.

Од каде дојде јајцето?

Така, постепено се приближуваме до главното прашање.

Пред сè, треба да започнете со складиште кое ја опишува структурата на другите складишта, вклучително и вие самите. И, се разбира, како дел од GitOps, треба да додадете CI за промените да се извршуваат автоматски.

Ако Git сè уште не е создаден?

  1. Како да го складирате во Git?
  2. Како да инсталирате CI?
  3. Ако го распоредиме и Gitlab користејќи IaC, па дури и во Kubernetes?
  4. И GitLab Runner исто така во Kubernetes?
  5. Што е со Kubernetes во провајдерот на облак?

Што дојде прво: GitLab каде што ќе го подигнам мојот код или кодот што опишува каков вид GitLab ми треба?

Пилешко со јајца

«Ојакодон3 со диносаурус“ [src]

Ајде да се обидеме да готвиме јадење користејќи како давател на облак Управуван со Kubernetes Selectel.

TL; ДР

Дали е можно да се приклучите на еден тим одеднаш?

$ 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-токен од GitLab создаден за корисник корен.
  6. Креирајте проектна структура во GitLab користејќи 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. Ја добиваме cubeconfig.

За програмски да преземете KUBECONFIG, треба да добиете токен од OpenStack:

openstack token issue -c id -f value > token

И со овој токен направете барање до Managed Kubernetes Selectel API. k8s_id прашања тераформски:

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а, тогаш ми треба Storage Class од оваа зона.

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. Доведување на складиштата на Git до правилната хиерархија со помош на провајдерот Gitlab.

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

За жал, terraform GitLab провајдер има лебдечки бубачка. Потоа ќе треба рачно да ги избришете конфликтните проекти за да се поправи tf.state. Потоа повторно извршете ја командата `$ make all`

Чекор 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 и само да притискам копчиња. За да го направите ова, треба да ги пренесеме нашите локални држави (држава Тераформ) во CI. Како да го направите ова е во следниот дел.

Претплатете се на нашата блогза да не го пропуштите објавувањето на нови статии!

Извор: www.habr.com

Додадете коментар