Oilaskoa edo arrautza: IaC zatitzea

Oilaskoa edo arrautza: IaC zatitzea
Zer izan zen lehen - oilaskoa ala arrautza? Nahiko hasiera bitxia Infrastructure-as-Code-ri buruzko artikulu batentzat, ezta?

Zer da arrautza?

Gehienetan, Infrastructure-as-Code (IaC) azpiegiturak irudikatzeko modu deklaratiboa da. Bertan lortu nahi dugun egoera deskribatzen dugu, hardware zatitik hasi eta software konfigurazioarekin amaituz. Beraz, IaC hauetarako erabiltzen da:

  1. Baliabideen hornidura. Hauek VM, S3, VPC, etab. Lanerako oinarrizko tresnak: Terraform ΠΈ CloudFormation.
  2. Softwarearen konfigurazioa. Oinarrizko tresnak: Ansible, sukaldaria, etab.

Edozein kodea git biltegietan dago. Eta lehenago edo beranduago taldeburuak erabakiko du ordenatu behar direla. Eta birfaktorea egingo du. Eta egituraren bat sortuko du. Eta hori ona dela ikusiko du.

Dagoeneko existitzea ere ona da GitLab ΠΈ GitHub-Terraform-en hornitzailea (eta hau Software Konfigurazioa da). Haien laguntzarekin, proiektu osoa kudeatu dezakezu: taldekideak, CI/CD, git-flow, etab.

Nondik atera zen arrautza?

Beraz, pixkanaka galdera nagusira hurbiltzen ari gara.

Lehenik eta behin, beste biltegi batzuen egitura deskribatzen duen biltegi batekin hasi behar duzu, zuk zeuk barne. Eta noski, GitOps-en zati gisa, CI gehitu behar duzu aldaketak automatikoki exekutatu daitezen.

Git oraindik sortu ez bada?

  1. Nola gorde Git-en?
  2. Nola instalatu CI?
  3. Gitlab ere zabaltzen badugu IaC erabiliz, eta baita Kubernetes-en ere?
  4. Eta GitLab Runner-ek Kubernetesen ere?
  5. Zer gertatzen da Kubernetes hodeiko hornitzailean?

Zer izan zen lehenik: nire kodea igoko dudan GitLab-a, edo zer nolako GitLab behar dudan deskribatzen duen kodea?

Oilaskoa arrautzekin

Β«Oyakodon3 dinosauro batekin" [src]

Saia gaitezen plater bat prestatzen hodeiko hornitzaile gisa erabiliz Kubernetes Selectel kudeatua.

TL; DR

Posible al da talde batean aldi berean sartzea?

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

Osagaiak:

  • my.selectel.ru-ko kontua;
  • Kontuaren tokena;
  • Kubernetes gaitasunak;
  • Helmuga Trebetasunak;
  • Terraform Trebetasunak;
  • Helm taula GitLab;
  • Helm taula GitLab Runner.

errezeta:

  1. Lortu MY_SELECTEL_TOKEN paneletik my.selectel.ru.
  2. Sortu Kubernetes kluster bat hari kontu-token bat transferituz.
  3. Lortu KUBECONFIG sortutako klusteretik.
  4. Instalatu GitLab Kubernetes-en.
  5. Eskuratu erabiltzailearentzako sortutako GitLab-etik GitLab-tokena root.
  6. Sortu proiektuaren egitura GitLab-en GitLab-token erabiliz.
  7. Bidali lehendik dagoen kodea GitLab-era.
  8. ?
  9. Irabazi asmorik!

Urratsera 1. Tokena atalean lor daiteke API gakoak.

Oilaskoa edo arrautza: IaC zatitzeaUrratsera 2. Gure Terraform 2 nodo multzo bat "labean" egiteko prestatzen dugu. Ziur bazaude guztietarako nahikoa baliabide dituzula, orduan automatikoki kuotak gaitu ditzakezu:

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

Gehitu erabiltzaile bat proiektuan:

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
}

Irteera:

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
}

Abiarazi dezagun:

$ 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

Oilaskoa edo arrautza: IaC zatitzea
Urratsera 3. cubeconfig lortuko dugu.

KUBECONFIG programatikoki deskargatzeko, OpenStack-etik token bat lortu behar duzu:

openstack token issue -c id -f value > token

Eta token honekin eskaera bat egin Kubernetes Selectel API kudeatzaileari. k8s_id gaiak 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 panelaren bidez ere sar daiteke.

Oilaskoa edo arrautza: IaC zatitzea
Urratsera 4. Klusterra labean jarri eta horretarako sarbidea izan ondoren, gainean yaml gehitu dezakegu dastatzeko.

Nahiago dut gehitu:

  • izen-espazioa
  • biltegiratze klasea
  • pod segurtasun politika eta abar.

Biltegiratze Klasea for Selectel-etik har daiteke biltegi ofiziala.

Hasieran eremuan kluster bat hautatu nuenetik ru-3a, orduan eremu honetako Biltegiratze Klasea behar dut.

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

Urratsera 5. Instalatu karga-orekatzailea.

Askorentzat estandarra erabiliko dugu nginx-sarrera. Dagoeneko instalatzeko argibide ugari daude, beraz, ez gara horretan geldituko.

$ 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

Kanpoko IP bat jaso arte itxarongo dugu 3-4 minutu inguru:

Oilaskoa edo arrautza: IaC zatitzea
Jasotako kanpoko IPa:

Oilaskoa edo arrautza: IaC zatitzea
Urratsera 6. Instalatu 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"

Berriz ere leka guztiak igo arte itxarongo dugu.

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

Lekak altxatu ziren:

Oilaskoa edo arrautza: IaC zatitzea
Urratsera 7. GitLab-tokena jasotzen dugu.

Lehenik eta behin, bilatu saioa hasteko pasahitza:

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

Orain saioa egin dezagun eta lortu token bat:

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

Urratsera 8. Git biltegiak hierarkia egokira ekartzea Gitlab hornitzailea erabiliz.

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

Zoritxarrez, terraform GitLab hornitzaileak flotagarria du akatsa. Orduan gatazkan dauden proiektuak eskuz ezabatu beharko dituzu tf.state konpondu ahal izateko. Ondoren, berriro exekutatu `$make all` komandoa

Urratsera 9. Tokiko biltegiak zerbitzarira transferitzen ditugu.

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

Amaitu:

Oilaskoa edo arrautza: IaC zatitzea
Oilaskoa edo arrautza: IaC zatitzea
Oilaskoa edo arrautza: IaC zatitzea

Ondorioa

Gure tokiko makinatik dena modu deklaratiboan kudeatu ahal izatea lortu dugu. Orain zeregin horiek guztiak CIra transferitu nahi ditut eta botoiak sakatu besterik ez dut. Horretarako, gure tokiko estatuak (Terraform estatua) CIra transferitu behar ditugu. Nola egin hurrengo zatian dago.

Harpidetu gure blogartikulu berrien kaleratzea ez galtzeko!

Iturria: www.habr.com

Gehitu iruzkin berria