Pulë ose vezë: ndarja e IaC

Pulë ose vezë: ndarja e IaC
Çfarë erdhi e para - pula apo veza? Një fillim mjaft i çuditshëm për një artikull rreth Infrastrukturës-as-Code, apo jo?

Çfarë është një vezë?

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

  1. Sigurimi i burimeve. Këto janë VM, S3, VPC, etj. Mjetet bazë për punë: Terraform и Formimi i reve.
  2. Konfigurimi i softverit. Mjetet bazë: Ansible, Shef, etj.

Çdo kod është në magazinat git. Dhe herët a vonë drejtuesi i ekipit do të vendosë që ato duhet të rregullohen. Dhe ai do të rifaktojë. Dhe kjo do të krijojë një strukturë. Dhe ai do të shohë se kjo është e mirë.

Është gjithashtu mirë që ekziston tashmë GitLab и GitHub-ofrues për Terraform (dhe ky është konfigurimi i softuerit). Me ndihmën e tyre, ju mund të menaxhoni të gjithë projektin: anëtarët e ekipit, CI/CD, git-flow, etj.

Nga erdhi veza?

Pra gradualisht po i afrohemi pyetjes kryesore.

Para së gjithash, duhet të filloni me një depo që përshkruan strukturën e depove të tjera, duke përfshirë edhe veten tuaj. Dhe sigurisht, si pjesë e GitOps, duhet të shtoni CI në mënyrë që ndryshimet të ekzekutohen automatikisht.

Nëse Git nuk është krijuar ende?

  1. Si ta ruani atë në Git?
  2. Si të instaloni CI?
  3. Nëse vendosim edhe Gitlab duke përdorur IaC, madje edhe në Kubernetes?
  4. Dhe GitLab Runner gjithashtu në Kubernetes?
  5. Po Kubernetes në ofruesin e cloud?

Çfarë erdhi e para: GitLab ku do të ngarkoj kodin tim, ose kodi që përshkruan se çfarë lloj GitLab më nevojitet?

Pulë me vezë

«Oyakodon3 me një dinosaur" [src]

Le të përpiqemi të gatuajmë një pjatë duke përdorur si ofrues cloud Menaxhuar Kubernetes Selectel.

TL; DR

A është e mundur të bashkohesh në një ekip menjëherë?

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

Përbërësit:

  • Llogaria nga my.selectel.ru;
  • Shenja e llogarisë;
  • aftësitë Kubernetes;
  • Aftësitë e Helm;
  • Aftësitë Terraform;
  • Diagrami i timonit GitLab;
  • Diagrami i timonit GitLab Runner.

recetë:

  1. Merr MY_SELECTEL_TOKEN nga paneli my.selectel.ru.
  2. Krijo një grup Kubernetes duke transferuar një shenjë llogarie në të.
  3. Merrni KUBECONFIG nga grupi i krijuar.
  4. Instaloni GitLab në Kubernetes.
  5. Merrni GitLab-token nga GitLab krijuar për përdoruesit rrënjë.
  6. Krijo një strukturë projekti në GitLab duke përdorur GitLab-token.
  7. Shtyni kodin ekzistues në GitLab.
  8. ?
  9. Fitimi!

Hapi 1. Shenja mund të merret në seksion Çelësat API.

Pulë ose vezë: ndarja e IaCHapi 2. Ne përgatisim Terraformin tonë për "pjekjen" e një grupi prej 2 nyjesh. Nëse jeni të sigurt se keni burime të mjaftueshme për gjithçka, atëherë mund të aktivizoni kuotat automatike:

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

Shtoni një 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
}

Prodhimi:

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
}

Ne nisim:

$ 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

Pulë ose vezë: ndarja e IaC
Hapi 3. Ne marrim cubeconfig.

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

openstack token issue -c id -f value > token

Dhe me këtë shenjë bëni një kërkesë për API-në e menaxhuar të Kubernetes Selectel. k8s_id çështjet 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 gjithashtu mund të aksesohet përmes panelit.

Pulë ose vezë: ndarja e IaC
Hapi 4. Pasi të jetë pjekur tufa dhe të kemi akses, mund të shtojmë jaml sipër për shije.

Unë preferoj të shtoj:

  • hapësira e emrit
  • klasa e ruajtjes
  • politika e sigurisë së pod dhe kështu me radhë.

Klasa e ruajtjes për Selectel mund të merret nga depo zyrtare.

Meqenëse fillimisht zgjodha një grup në zonë ru-3a, atëherë më duhet Klasa e ruajtjes nga kjo zonë.

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

Hapi 5. Instaloni një balancues të ngarkesës.

Ne do të përdorim atë standard për shumë nginx-hyrje. Tashmë ka shumë udhëzime për instalimin e tij, kështu që ne nuk do të ndalemi në 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

Ne presim që ajo të marrë një IP të jashtme për rreth 3-4 minuta:

Pulë ose vezë: ndarja e IaC
IP e jashtme e marrë:

Pulë ose vezë: ndarja e IaC
Hapi 6. Instaloni 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ë gjitha bishtajat të ngrihen.

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...

Bishtajat u rritën:

Pulë ose vezë: ndarja e IaC
Hapi 7. Ne marrim GitLab-token.

Së pari, gjeni fjalëkalimin e hyrjes:

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

Tani le të identifikohemi dhe të marrim një shenjë:

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

Hapi 8. Sjellja e depove Git në hierarkinë e duhur duke përdorur Ofruesin Gitlab.

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

Fatkeqësisht, ofruesi terraform GitLab ka një lundrues insekt. Pastaj do t'ju duhet të fshini manualisht projektet konfliktuale në mënyrë që tf.state të rregullohet. Pastaj ekzekutoni përsëri komandën `$make all`

Hapi 9. Ne transferojmë depot lokale në server.

$ 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)

Finish:

Pulë ose vezë: ndarja e IaC
Pulë ose vezë: ndarja e IaC
Pulë ose vezë: ndarja e IaC

Përfundim

Ne kemi arritur që të mund të menaxhojmë gjithçka në mënyrë deklarative nga makina jonë lokale. Tani dua t'i transferoj të gjitha këto detyra në CI dhe thjesht shtyp butonat. Për ta bërë këtë, ne duhet të transferojmë shtetet tona lokale (shteti Terraform) në CI. Si ta bëni këtë është në pjesën tjetër.

Regjistrohu në tonë blogpër të mos humbur publikimin e artikujve të rinj!

Burimi: www.habr.com

Shto një koment