Kana või muna: purustame IaC

Kana või muna: purustame IaC
Mis on esimesena — kana või muna? Aeglane algus artikkel Infrastructure-as-Code'ist, eks ole?

Mis on muna?

Enamasti on Infrastructure-as-Code (IaC) deklareeritav moodus infrastruktuuri kujutamiseks. Selle raames kirjeldame olekut, mida soovime saavutada, alates riistvarast kuni tarkvara konfiguratsioonini. Seetõttu kasutatakse IaC-d järgmiste jaoks:

  1. Resursside pakkumine. Need on VMs, S3, VPC jne. Peamised tööriistad on: Terraform ja CloudFormation.
  2. Tarkvara konfiguratsioon. Peamised tööriistad: Ansible, Chef jne.

Kõik koodid on git-repositooriumides. Ükskord otsustab tiimijuht, et on vaja korrastada. Ja ta hakkab refaktoreerima. Ja loob mingi struktuuri. Ja ta näeb, et see on hea.

Samuti on hea, et juba on olemas GitLab ja GitHub-proviider Terraform'i jaoks (ja see on tarkvara konfiguratsioon). Nende abil saab hallata kogu projekti: meeskonnaliikmeid, CI/CD, git-flow jne.

Kust muna tuli?

Nüüd we slowly approach the main question.

Esiteks tuleb alustada repositooriumist, mis kirjeldab teiste repositooriumide struktuuri, sealhulgas enda. Loomulikult tuleb GitOps raames lisada CI, et automaatselt muudatused ellu viia.

Kuidas siis, kui Git't pole veel loodud?

  1. Kuidas seda Git'is hoida?
  2. Kuidas CI-se siduda?
  3. Kui me Gitlabi ka üles ehitame IaC abil ja veel Kuberneteses?
  4. Ja GitLab Runner ka Kuberneteses?
  5. Aga Kubernetes pilveteenuse pakkujas?

Mis ilmus enne: GitLab, kuhu ma oma koodi laen, või kood, mis kirjeldab, milline GitLab mul on vaja?

Kanaliha ja munad

«Oyakodon3 koos dinosaurusega» [src]

Katsume valmistada rooga, kasutades pilveteenuse pakkujana Manageeritud Kubernetes Selectel.

TL;DR

Kas saab, et korraga ühe komandiga?

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

Koostisosad:

  • My.selectel.ru konto;
  • Konto token;
  • Kubernetes oskused;
  • Helmi oskused;
  • Terraform oskused;
  • Helmi diagramm GitLab;
  • Helmi diagramm GitLab Runner.

Retsept:

  1. Käivitage MY_SELECTEL_TOKEN armatuurlaualt my.selectel.ru.
  2. Looge Kubernetes klaster, edastades sellele konto token.
  3. Saage KUBECONFIG loodud klastri kohta.
  4. Installige GitLab Kubernetesesse.
  5. Saage loodud GitLabist GitLab-token kasutaja jaoks root.
  6. Looge GitLabis projektide struktuur, kasutades GitLab-tokenit.
  7. Sünkroniseerige olemasolev kood GitLabi.
  8. ???
  9. Kasum!

Samm 1. Tokeni saab saada jaotises API võtmed.

Kana või muna: purustame IaCSamm 2. Valmistame ette meie Terraformi, et "küpsetada" klaster kahe sõlmega. Kui olete kindel, et teil on ressursse piisavalt, saate lubada automaatquoti:

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

Lisame kasutaja projekti:

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
}

Väljund:

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
}

Käivitame:

$ 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

Kana või muna: purustame IaC
Samm 3. Saame k8s konfiguratsiooni.

KUBECONFIG'i programmeerimise kaudu allalaadimiseks tuleb saada token OpenStack'ilt:

openstack token issue -c id -f value > token

Ja selle tokeniga tuleb teha päring Managed Kubernetes Selectel API-sse. k8s_id tagastab terraform:

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

K8s konfiguratsiooni saab ka paneeli kaudu.

Kana või muna: purustame IaC
4. samm. Pärast klastrile ligipääsu saamist saab yaml'i lisada vastavalt vajadusele.

Ma eelistan lisada:

  • namespace,
  • storage class,
  • pod security policy ja muud.

Storage Class Selecteli jaoks saab võtta ametlikust hoidlast ..

Kuna ma algselt valisin klusteri zonas ru-3a, siis on ka Storage Class vajalik sellest tsoonist.

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

Samm 5. Paigaldame koormuse tasakaalustaja.

Kasutame paljude jaoks standardset nginx-ingress. Selle paigaldamise juhendeid on juba piisavalt, seega ei jääme selle juurde.

$ 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

Ootame, kuni ta saab välise IP, umbes 3-4 minutit:

Kana või muna: purustame IaC
Saime välise IP:

Kana või muna: purustame IaC
Samm 6. Paigaldame GitLabi.

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

Ootame jälle, kuni kõik podid tõusevad.

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

Pood on tõusnud:

Kana või muna: purustame IaC
Samm 7. Saame GitLab-tokeni.

Esmalt selgitame välja sisselogimisparooli:

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

Nüüd autoriseerime ja saame tokeni:

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

Samm 8. Seame Git-repositorid õigesse hierarhiasse GitLab Provideri abil.

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

Kahjuks on terraform GitLabi pakkujas hõljuv viga. Siis tuleb konfliktse projekte käsitsi eemaldada, et tf.state töötaks. Seejärel käivitage käsk `$ make all`

Samm 9. Viime kohaliku repot serveerijasse.

$ make push

[master (root-commit) b61d977]  Esialgne commit
 3 faili muutmine, 46 lisamist(+)
 loo režiim 100644 .gitignore
 loo režiim 100644 values.yml
Objektide loendamine: 5, tehtud.
Objektide arvu lugemine: 100% (5/5), tehtud.
Delta kokkusurumine kuni 8 lõngaga
Objektide tihendamine: 100% (5/5), tehtud.
Objektide kirjutamine: 100% (5/5), 770 baiti | 770.00 KiB/s, tehtud.
Kokku 5 (delta 0), taaskasutatud 0 (delta 0)

Valmis:

Kana või muna: purustame IaC
Kana või muna: purustame IaC
Kana või muna: purustame IaC

Kokkuvõte

Oleme saavutanud, et saame oma kohalikust masinast deklareeritavalt kõike hallata. Nüüd tahaksime need ülesanded CI-sse viia ja ainult nuppe vajutada. Selleks tuleb meie kohalikud olekud (Terraform state) CI-sse edastada. Kuidas seda teha, järgmises osas.

Liituge meiega blogi, et mitte jääda uutest artiklitest ilma!

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster