Kofsha ose veze: heqim IaC

Kofsha ose veze: heqim IaC
ÇfarĂ« u krijua mĂ« parĂ« — pula apo veza? NjĂ« fillim mjaft i çuditshĂ«m pĂ«r njĂ« artikull rreth Infrastructure-as-Code, apo jo?

ÇfarĂ« Ă«shtĂ« vezĂ«?

Më shpesh, Infrastructure-as-Code (IaC) është një mënyrë deklarative për të përshkruar infrastrukturën. Ne e përshkruajmë gjendjen që duam të arrijmë, duke filluar nga pjesa harduerore dhe duke përfunduar me konfigurimin e softuerit. Prandaj IaC përdoret për:

  1. Furnizimin 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 herĂ«t a vonĂ«, lideri i ekipit do tĂ« vendosĂ« se Ă«shtĂ« koha pĂ«r t'i bĂ«rĂ« ato nĂ« rregull. Ai do ta riorganizojĂ«. Ai do tĂ« krijojĂ« njĂ« strukturĂ«. Ai do tĂ« kuptojĂ« se kjo Ă«shtĂ« shumĂ« mirĂ«.

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

Nga erdhi veze?

Këtu po i afrohemi gradualisht pyetjes kryesore.

Së pari, duhet të filloni me depozitat që përshkruajnë strukturën e depozitave të tjera, duke përfshirë edhe veten. Dhe natyrisht, brenda GitOps duhët të shtoni CI, në mënyrë që ndryshimet të ekzekutohen automatikisht.

Nëse Git ende nuk është krijuar?

  1. Si ta ruaj në Git?
  2. Si ta lidhem me CI?
  3. Nëse ne gjithashtu e zhvillojmë GitLab me ndihmën e IaC, dhe po ashtu në Kubernetes?
  4. Dhe GitLab Runner gjithashtu në Kubernetes?
  5. Dhe Kubernetes te ofruesi i qasjes?

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

Pula me vezë

«Oyakodon3 me dinosaurin» [src]

Le të përpiqemi të përgatisim një pjatë duke përdorur si ofrues qasje Kubernetes i Menaxhuar Selectel.

TL;DR

A është e mundur që menjëherë dhe 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 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. Shtyni kodin ekzistues në GitLab.
  8. ???
  9. Fitim!

Hapi 1. Tokeni mund tĂ« merret nĂ« seksionin ÇelĂ«sat API.

Kofsha ose veze: heqim IaCHapi 2. Po përgatisim Terraform tonë për "pjekjen" e klasterit me 2 nodë. Nëse jeni të sigurt se keni mjaft burime për gjithçka, atëherë mund të aktivizoni kufizimet automatikisht:

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ërdorues 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
}

Të dhënat 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
}

Nisim:

$ 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

Kofsha ose veze: heqim IaC
Hapi 3. Marrim kubkonfig.

Për të shkarkuar KUBECONFIG në mënyrë programore, duhet të merrni një token nga OpenStack:

openstack token issue -c id -f value > token

Dhe me këtë token bëni një kërkesë në API-në e 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

Kubkonfigun mund ta merrni gjithashtu përmes panelit.

Kofsha ose veze: heqim IaC
Hapi 4. Pasi klasteri është ngritur dhe kemi qasje në të, mund të shtojmë sipër një yaml sipas dëshirës.

Unë preferoj të shtoj:

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

Storage Class Për Selectel mund të merren nga depoja zyrtare.

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

lloji: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
 emri: fast.ru-3a
 annotime: 
   storageclass.kubernetes.io/is-default-class: "true"
provisioner: cinder.csi.openstack.org
parametra:
 tipi: fast.ru-3a
 disponibiliteti: ru-3a
lejoftoVolumeExpansion: true

Hapi 5. Vendosim balancuesin e ngarkesës.

Do të përdorim standardin për shumë nginx-ingress. Ka mjaft udhëzime për instalimin e tij, kështu që nuk do të qëndrojmë te kjo.

$ 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

Pritim derisa të marrë IP-të e jashtme, rreth 3-4 minuta:

Kofsha ose veze: heqim IaC
Mora IP-në e jashtme:

Kofsha ose veze: heqim IaC
Hapi 6. Instalojmë 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 derisa të ngrihen të gjitha pod-ët.

kubectl get po -n gitlab
EMRI                                      	GATI   STATUS  	RINGTUR  	MOSHA
gitlab-gitaly-0                           	0/1 	Prishtë 	0      	0s
gitlab-gitlab-exporter-88f6cc8c4-fl52d    	0/1 	Prishtë 	0      	0s
gitlab-gitlab-runner-6b6867c5cf-hd9dp     	0/1 	Prishtë 	0      	0s
gitlab-gitlab-shell-55cb6ccdb-h5g8x       	0/1 	Inic:0/2	0      	0s
gitlab-migrations.1-2cg6n                 	0/1 	Prishtë 	0      	0s
gitlab-minio-6dd7d96ddb-zd9j6             	0/1 	Prishtë 	0      	0s
gitlab-minio-create-buckets.1-bncdp       	0/1 	Prishtë 	0      	0s
gitlab-postgresql-0                       	0/2 	Prishtë 	0      	0s
gitlab-prometheus-server-6cfb57f575-v8k6j 	0/2 	Prishtë 	0      	0s
gitlab-redis-master-0                     	0/2 	Prishtë 	0      	0s
gitlab-registry-6bd77b4b8c-pb9v9          	0/1 	Prishtë 	0      	0s
gitlab-registry-6bd77b4b8c-zgb6r          	0/1 	Inic: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 	Prishtë 	0      	0s
gitlab-task-runner-6fd6857db7-9x567       	0/1 	Prishtë 	0      	0s
gitlab-webservice-d9d4fcff8-hp8wl         	0/2 	Prishtë 	0      	0s
Prit a gitlab
./wait_gitlab.sh ../internal/gitlab/gitlab/.pods
po presim pod...
po presim pod...
po presim pod...

Pod-ët janë ngritur:

Kofsha ose veze: heqim IaC
Hapi 7. Merrni GitLab-token.

Së pari, le të zbulojmë fjalëkalimin për qasje:

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

Tani autorizohemi dhe marrim token-in:

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

Hapi 8. Shtyjmë 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ë konflikt defekti. Ndryshe, do të duhet të fshijmë projektet konfliktuale manualisht, në mënyrë që tf.state të riparohet. Pastaj rihapni komandën "$ make all"

Hapi 9. Transferojmë repo-t lokale në server.

$ make push

[master (root-commit) b61d977]  Komitimi fillestar
 3 skeduj të ndryshuar, 46 futje(+)
 krijo modalitet 100644 .gitignore
 krijo modalitet 100644 values.yml
Enumerimi i objekteve: 5, e bërë.
Numërimi i objekteve: 100% (5/5), e bërë.
Kompresimi i deltat në përdorim deri në 8 thread
Kompresimi i objekteve: 100% (5/5), e bërë.
Shkrimi i objekteve: 100% (5/5), 770 bajta | 770.00 KiB/s, e bërë.
Total 5 (delta 0), përsëritur 0 (delta 0)

Gati:

Kofsha ose veze: heqim IaC
Kofsha ose veze: heqim IaC
Kofsha ose veze: heqim IaC

Përfundimi

Ne kemi arritur që nga kompjuteri ynë lokal të menaxhojmë gjithçka në mënyrë deklarative. Tani dëshirojmë t'i transferojmë të gjitha këto detyra në CI dhe të klikojmë vetëm butonat. Për këtë, duhet të kalojmë gjendjet tona lokale (Terraform state) në CI. Si ta bëjmë këtë, në pjesën tjetër.

Regjistrohuni në kanalin tonë blog, për të mos humbur publikimet e reja të artikujve!

Burimi: habr.com

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