Тахианы мах эсвэл өндөг: IaC хуваах

Тахианы мах эсвэл өндөг: IaC хуваах
Эхлээд юу ирсэн бэ - тахиа эсвэл өндөг? Дэд бүтэц-кодны тухай нийтлэлийн эхлэл нь хачирхалтай, тийм үү?

Өндөг гэж юу вэ?

Ихэнхдээ Infrastructure-as-Code (IaC) нь дэд бүтцийг төлөөлөх тунхаглалын арга юм. Үүнд бид техник хангамжийн хэсгээс эхлээд програм хангамжийн тохиргоо хүртэл хүрэхийг хүсч буй төлөвийг дүрсэлсэн болно. Тиймээс IaC-ийг дараахь зорилгоор ашигладаг.

  1. Нөөцийн хангамж. Эдгээр нь VM, S3, VPC гэх мэт. Ажлын үндсэн хэрэгсэл: Терраформ и CloudFormation.
  2. Програм хангамжийн тохиргоо. Үндсэн хэрэгслүүд: Алгасах, тогооч гэх мэт.

Аливаа код git репозиторуудад байдаг. Эрт орой хэзээ нэгэн цагт багийн ахлагч тэднийг эмх цэгцтэй болгох шаардлагатай гэж шийднэ. Тэгээд тэр рефакт хийх болно. Мөн энэ нь зарим бүтцийг бий болгоно. Энэ нь сайн гэдгийг тэр харах болно.

Энэ нь аль хэдийн байгаа нь бас сайн хэрэг GitLab и 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 үлэг гүрвэлтэй" [SRC]

Үүл үйлчилгээ үзүүлэгч болгон ашиглаж хоол хийхийг хичээцгээе Удирддаг Kubernetes Selectel.

TL, 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-ийн жолооны график.

Recipe:

  1. Самбараас MY_SELECTEL_TOKEN аваарай my.selectel.ru.
  2. Бүртгэлийн жетон шилжүүлснээр Kubernetes кластер үүсгэнэ үү.
  3. Үүсгэсэн кластераас KUBECONFIG-г аваарай.
  4. Kubernetes дээр GitLab суулгана уу.
  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 алхам. Бид кубын тохиргоог авдаг.

KUBECONFIG-г программчлан татаж авахын тулд та OpenStack-аас токен авах шаардлагатай.

openstack token issue -c id -f value > token

Мөн энэ токеныг ашиглан Managed Kubernetes Selectel API-д хүсэлт гаргана уу. 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 аюулгүй байдлын бодлого гэх мэт.

Хадгалах анги for Selectel-аас авч болно албан ёсны агуулах.

Эхлээд би бүсэд кластер сонгосон ru-3a, тэгвэл надад энэ бүсээс Хадгалах анги хэрэгтэй байна.

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-г засахын тулд зөрчилтэй төслүүдийг гараар устгах хэрэгтэй болно. Дараа нь `$ 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

сэтгэгдэл нэмэх