Pula apo veza: po zbërthejmë IaC

Pula apo veza: po zbërthejmë IaC
ÇfarĂ« erdhi sĂ« pari - pula apo veza? NjĂ« fillim mjaft i çuditshĂ«m pĂ«r njĂ« artikel mbi InfrastrukturĂ«n si Kod, apo jo?

ÇfarĂ« Ă«shtĂ« veza?

Më së shpeshti, Infrastrukturën si Kod (IaC) paraqet një mënyrë deklarative për të paraqitur infrastrukturën. Në të, ne përshkruajmë gjendjen që duam të arrijmë, duke filluar nga pjesa e harduerit, deri te konfigurimi i softuerit. Prandaj, IaC përdoret për:

  1. Sigurimin e Burimeve. Këto janë VM-të, S3, VPC etj. Mjetet kryesore për punë: Terraform dhe CloudFormation.
  2. Konfigurimi i Softuerit. Mjetet kryesore: Ansible, Chef etj.

Çdo kod ndodhet nĂ« depo git. Dhe pĂ«r sooner apo mĂ« vonĂ«, lideri i ekipit do tĂ« vendosĂ« qĂ« duhet tĂ« bĂ«jĂ« njĂ« renditje nĂ« to. Dhe ai do ta refaktorojĂ« atĂ«. Dhe do tĂ« krijojĂ« njĂ« strukturĂ«. Dhe ai do tĂ« shohĂ« se Ă«shtĂ« e mirĂ«.

Po ashtu është mirë që tashmë ekziston GitLab dhe GitHub- ofruesi për Terraform (dhe kjo është Konfigurimi i Softuerit). Me ndihmën e tyre mund të menaxhohet e gjithë projekti: anëtarët e ekipit, CI/CD, git-flow etj.

Nga erdhi veza?

Ja, dhe ngadalë po i afrohemi pyetjes kryesore.

Së pari duhet të filloni me depozitën që përshkruan strukturën e depozitave të tjera, duke përfshirë veten e saj. Dhe sigurisht, brenda GitOps duhet të shtoni CI, për të siguruar që ndërrimet të ekzekutohen automatikisht.

Nëse Git ende nuk është krijuar?

  1. Si ta ruajmë në Git?
  2. Si ta lidhim CI?
  3. Nëse ne gjithashtu e zhvillojmë Gitlab me IaC, madje edhe në Kubernetes?
  4. Dhe GitLab Runner gjithashtu në Kubernetes?
  5. Dhe Kubernetes në ofruesin e cloud?

ÇfarĂ« erdhi mĂ« parĂ«: GitLab, nĂ« tĂ« cilin do tĂ« ngarkoj kodin tim, apo kodi qĂ« pĂ«rshkruan se çfarĂ« GitLab mĂ« nevojitet?

Pula me vezë

«Oyakodon3 me dinosaurin» [src]

Le të përpiqemi të përgatisim një pjatë, duke përdorur si ofrues cloud Managed Kubernetes Selectel.

TL;DR

A mundet që të jetë gjithashtu në një komandë?

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

Përbërësit:

  • Llogari nga my.selectel.ru;
  • Token nga llogaria;
  • AftĂ«si nĂ« Kubernetes;
  • AftĂ«si nĂ« Helm;
  • AftĂ«si nĂ« Terraform;
  • Helm chart GitLab;
  • Helm chart GitLab Runner.

Receta:

  1. Merrni MY_SELECTEL_TOKEN nga paneli my.selectel.ru.
  2. Krijoni një klaster Kubernetes, duke kaluar në të tokenin nga llogaria.
  3. Merrni KUBECONFIG nga klasteri i krijuar.
  4. Instaloni GitLab në Kubernetes.
  5. Merrni GitLab-token nga GitLab i krijuar për përdoruesin. root.
  6. Krijoni strukturën e projekteve në GitLab, duke përdorur GitLab-token.
  7. Ngarkoni kodin ekzistues në GitLab.
  8. ???
  9. Fitim!

Hapi 1. Tokenin mund ta merrni nĂ« seksionin ÇelĂ«sat API.

Pula apo veza: po zbërthejmë IaCHapi 2. Përgatitim Terraform-in tonë për 'pjekjen' e klasterit nga 2 nodë. Nëse jeni të sigurt që keni mjaft burime për gjithçka, atëherë mund të përfshini automatikisht quota:

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

Shtojmë përdoruesin në projekt:

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
}

Rezultatet e daljes:

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
}

Fillojmë:

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

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

Pula apo veza: po zbërthejmë IaC
Hapi 3. Merrni kubkonfigurimin.

Për të shkarkuar programatikisht KUBECONFIG, duhet të merrni një token nga OpenStack:

openstack token issue -c id -f value > token

Dhe tashmë me këtë token të bëni një kërkesë në API-në Managed Kubernetes Selectel. k8s_id jep terraform:

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

Kubkonfigurimi mund të merret gjithashtu përmes panelit.

Pula apo veza: po zbërthejmë IaC
Hapi 4. Pasi klasteri është përfshirë dhe kemi akses në të, mund të shtojmë YAML sipas dëshirës.

Unë preferoj të shtoj:

  • namespace,
  • klasĂ«n e ruajtjes,
  • politikat e sigurisĂ« sĂ« pod-it dhe tĂ« tjera.

Klasa e Ruajtjes për Selectel mund të merret nga repozitari zyrtar.

Duke qenë se fillimisht kam zgjedhur klasterin në zonën ru-3a, edhe Klasën e Ruajtjes e kam nevojë nga kjo zonë.

lloj: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
 emri: fast.ru-3a
 annotations:
   storageclass.kubernetes.io/is-default-class: "true"
provisioner: cinder.csi.openstack.org
parameters:
 tipi: fast.ru-3a
 disponueshmëri: ru-3a
lejohetZgjerimiIVolume: true

Hapi 5. Vendosim balancuesin e ngarkesës.

Do të përdorim standardin e zakonshëm për shumë nginx-ingress. Ka mjaft udhëzime për instaluar atë, kështu që nuk do të qëndrojmë në këtë.

$ 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

Presim që të marrë një IP të jashtme për rreth 3-4 minuta:

Pula apo veza: po zbërthejmë IaC
Morëm IP të jashtme:

Pula apo veza: po zbërthejmë IaC
Hapi 6. Po instalohet 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"

Përsëri presim që të ngrihen të gjitha pod-et.

kubectl get po -n gitlab
EMRI				GATI   STATUS  	RIFILLIMET   MOSHA
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	Përfunduar	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
Duke pritur gitlab
./wait_gitlab.sh ../internal/gitlab/gitlab/.pods
duke pritur për pod...
duke pritur për pod...
duke pritur për pod...

Pod-et janë ngritur:

Pula apo veza: po zbërthejmë IaC
Hapi 7. Po marrim GitLab-token.

Së pari, mësojmë fjalëkalimin për t'u lidhur:

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

Tani, autorizohemi dhe marrë tokenin:

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

Hapi 8. Rregullojmë Git-repozitat në hierarkinë e duhur me ndihmën e Gitlab Provider.

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

Fatkeqësisht, në terraform GitLab provider ka një problem flottues çështje. Atëherë do të duhet të fshini projektet konfliktuese me duar, në mënyrë që tf.state të rregullohej. Pastaj, rivendosni komandën `$ make all`

Hapi 9. Transferojmë repozitat lokale në server.

$ make push

[master (root-commit) b61d977]  Komitimi fillestar
 3 skedarë u ndërruan, 46 shtesa(+)
 krijohet mod-i 100644 .gitignore
 krijohet mod-i 100644 values.yml
Numërimi i objekteve: 5, e bërë.
Numërimi i objekteve: 100% (5/5), e bërë.
Kompresimi i deltave duke përdorur deri në 8 fije
Duke kompresuar objekte: 100% (5/5), e bërë.
Shkruaj objekte: 100% (5/5), 770 bytes | 770.00 KiB/s, e bërë.
Totali 5 (delta 0), e ripërdorur 0 (delta 0)

Përfunduan:

Pula apo veza: po zbërthejmë IaC
Pula apo veza: po zbërthejmë IaC
Pula apo veza: po zbërthejmë IaC

Përfundim

Arritëm që nga makina jonë lokale të menaxhojmë gjithçka në mënyrë deklarative. Tani dëshirojmë të kalojmë të gjitha këto detyra në CI dhe vetëm të shtypim disa butona. Për këtë, duhet të transferojmë gjendjet tona lokale (Terraform state) në CI. Si ta bëjmë këtë, në pjesën tjetër.

Abonohuni në blog, për të mos humbur publikimet e artikujve të rinj!

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster