Csirke vagy tojás: az IaC felosztása

Csirke vagy tojás: az IaC felosztása
Mi volt előbb - a tyúk vagy a tojás? Elég furcsa kezdet az Infrastructure-as-Code-ról szóló cikkhez, nem igaz?

Mi az a tojás?

Az Infrastructure-as-Code (IaC) leggyakrabban az infrastruktúra deklaratív ábrázolási módja. Ebben leírjuk az elérni kívánt állapotot, kezdve a hardveres résztől a szoftverkonfigurációig. Ezért az IaC-t a következőkre használják:

  1. Erőforrás-ellátás. Ezek a virtuális gépek, az S3, a VPC stb. A munka alapvető eszközei: Terraform и Felhőképződés.
  2. Szoftver konfiguráció. Alap eszközök: Ansible, Szakács stb.

Bármely kód a git tárolókban van. A csapatvezető pedig előbb-utóbb úgy dönt, hogy rendbe kell tenni őket. És vissza fog hárulni. És létrehoz majd valami struktúrát. És látni fogja, hogy ez jó.

Az is jó, hogy már létezik GitLab и GitHub-szolgáltató a Terraform számára (ez a szoftverkonfiguráció). Segítségükkel kezelheti a teljes projektet: csapattagok, CI/CD, git-flow stb.

Honnan jött a tojás?

Tehát fokozatosan közeledünk a fő kérdéshez.

Először is egy olyan tárolóval kell kezdenie, amely leírja más tárolók szerkezetét, beleértve Önt is. És természetesen a GitOps részeként hozzá kell adnia a CI-t, hogy a változtatások automatikusan végrehajtásra kerüljenek.

Ha a Git még nem jött létre?

  1. Hogyan kell tárolni a Gitben?
  2. Hogyan kell telepíteni a CI-t?
  3. Ha a Gitlabot is telepítjük IaC használatával, sőt Kubernetesben?
  4. És a GitLab Runner is Kubernetesben?
  5. Mi a helyzet a Kubernetestel a felhőszolgáltatóban?

Mi volt előbb: a GitLab, ahová feltöltöm a kódomat, vagy az a kód, amely leírja, hogy milyen GitLabra van szükségem?

Csirke tojással

«Oyakodon3 egy dinoszaurusszal" [src]

Próbáljunk meg főzni egy ételt felhőszolgáltatóként Felügyelt Kubernetes Selectel.

TL, DR

Lehet egyszerre egy csapathoz csatlakozni?

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

Hozzávalók:

  • Fiók a my.selectel.ru webhelyről;
  • számla token;
  • Kubernetes készségek;
  • Helm Skills;
  • Terraform készségek;
  • Helm chart GitLab;
  • Helm chart GitLab Runner.

Recept:

  1. A MY_SELECTEL_TOKEN lekérése a panelről my.selectel.ru.
  2. Hozzon létre egy Kubernetes-fürtöt egy fiókjogkivonat átvitelével.
  3. Töltse le a KUBECONFIG-ot a létrehozott fürtből.
  4. Telepítse a GitLabot a Kubernetesre.
  5. Szerezze be a felhasználó számára létrehozott GitLab-tokent a GitLab-ból gyökér.
  6. Hozzon létre egy projektstruktúrát a GitLab-ban a GitLab-token használatával.
  7. Küldje el a meglévő kódot a GitLab-nak.
  8. ?
  9. Profit!

Lépés 1. A tokent a szekcióban lehet beszerezni API kulcsok.

Csirke vagy tojás: az IaC felosztásaLépés 2. A Terraformunkat felkészítjük egy 2 csomópontból álló klaszter „sütésére”. Ha biztos benne, hogy mindenre van elegendő erőforrása, akkor engedélyezheti az automatikus kvótákat:

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

Felhasználó hozzáadása a projekthez:

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
}

Kimenet:

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
}

Elindítjuk:

$ 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

Csirke vagy tojás: az IaC felosztása
Lépés 3. Megkapjuk a cubeconfig-ot.

A KUBECONFIG programozott letöltéséhez be kell szereznie egy tokent az OpenStackből:

openstack token issue -c id -f value > token

Ezzel a tokennel kérjen a Managed Kubernetes Selectel API-hoz. k8s_id kiadja terra forma:

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

A Cupconfig a panelen keresztül is elérhető.

Csirke vagy tojás: az IaC felosztása
Lépés 4. Miután megsült a fürt és hozzáférünk, tehetünk a tetejére ízlés szerint yamlt.

Inkább hozzáteszem:

  • névtér,
  • tárolási osztály
  • pod biztonsági szabályzat és így tovább.

Tárolási osztály mert Selectel től vehető hivatalos adattár.

Mivel kezdetben kiválasztottam egy klasztert a zónában ru-3a, akkor szükségem van a Storage Class-ra ebből a zónából.

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

Lépés 5. Telepítsen egy terheléselosztót.

Sokaknál a standardot fogjuk használni nginx-ingress. Rengeteg instrukció van már a telepítéshez, ezért nem foglalkozunk vele.

$ 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

Körülbelül 3-4 percig várunk, amíg külső IP-t kap:

Csirke vagy tojás: az IaC felosztása
Fogadott külső IP:

Csirke vagy tojás: az IaC felosztása
Lépés 6. Telepítse a GitLabot.

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

Ismét megvárjuk, amíg az összes hüvely felkel.

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

A hüvelyek felemelkedtek:

Csirke vagy tojás: az IaC felosztása
Lépés 7. GitLab-token-t kapunk.

Először keresse meg a bejelentkezési jelszót:

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

Most jelentkezzünk be, és szerezzünk be egy tokent:

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

Lépés 8. A Git adattárak megfelelő hierarchiába állítása a Gitlab szolgáltató segítségével.

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

Sajnos a terraform GitLab szolgáltatónak van egy lebegő bogár. Ezután manuálisan kell törölnie az ütköző projekteket a tf.state javításához. Ezután futtassa újra a „$make all” parancsot

Lépés 9. Helyi adattárakat helyezünk át a szerverre.

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

Kész:

Csirke vagy tojás: az IaC felosztása
Csirke vagy tojás: az IaC felosztása
Csirke vagy tojás: az IaC felosztása

Következtetés

Elértük, hogy mindent deklaratívan kezelhetünk a helyi gépünkről. Most szeretném átvinni ezeket a feladatokat a CI-re, és csak megnyomni a gombokat. Ehhez át kell vinnünk a helyi állapotainkat (Terraform állapot) a CI-be. Ennek módja a következő részben.

Iratkozzon fel a bloghogy ne maradj le az új cikkek megjelenéséről!

Forrás: will.com

Hozzászólás