Kylling eller egg: splitting av IaC

Kylling eller egg: splitting av IaC
Hva kom først - kyllingen eller egget? En ganske merkelig start på en artikkel om Infrastructure-as-Code, ikke sant?

Hva er et egg?

Oftest er Infrastructure-as-Code (IaC) en deklarativ måte å representere infrastruktur på. I den beskriver vi tilstanden vi ønsker å oppnå, fra maskinvaredelen og slutter med programvarekonfigurasjonen. Derfor brukes IaC til:

  1. Ressursavsetning. Dette er VM-er, S3, VPC, etc. Grunnleggende verktøy for arbeid: terra и CloudFormation.
  2. Programvarekonfigurasjon. Grunnleggende verktøy: Ansible, kokk, etc.

Enhver kode er i git-repositories. Og før eller siden vil teamlederen bestemme at de må settes i stand. Og han vil refaktorere. Og det vil skape litt struktur. Og han vil se at dette er bra.

Det er også bra at det allerede finnes GitLab и GitHub-leverandør for Terraform (og dette er programvarekonfigurasjon). Med deres hjelp kan du administrere hele prosjektet: teammedlemmer, CI/CD, git-flow, etc.

Hvor kom egget fra?

Så vi nærmer oss etter hvert hovedspørsmålet.

Først av alt må du starte med et depot som beskriver strukturen til andre depoter, inkludert deg selv. Og selvfølgelig, som en del av GitOps, må du legge til CI slik at endringer utføres automatisk.

Hvis Git ikke er opprettet ennå?

  1. Hvordan lagrer jeg det i Git?
  2. Hvordan installerer jeg CI?
  3. Hvis vi også distribuerer Gitlab ved hjelp av IaC, og til og med i Kubernetes?
  4. Og GitLab Runner også i Kubernetes?
  5. Hva med Kubernetes i skyleverandøren?

Hva kom først: GitLab hvor jeg skal laste opp koden min, eller koden som beskriver hva slags GitLab jeg trenger?

Kylling med egg

«Oyakodon3 med en dinosaur" [src]

La oss prøve å lage en rett ved å bruke som en skyleverandør Administrert Kubernetes Selectel.

TL; DR

Er det mulig å bli med i ett lag samtidig?

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

Ingredienser:

  • Konto fra my.selectel.ru;
  • Kontotoken;
  • Kubernetes ferdigheter;
  • Rorferdigheter;
  • Terraform ferdigheter;
  • Hjelmdiagram GitLab;
  • Hjelmdiagram GitLab Runner.

oppskrift:

  1. Få MY_SELECTEL_TOKEN fra panelet my.selectel.ru.
  2. Opprett en Kubernetes-klynge ved å overføre et kontotoken til den.
  3. Få KUBECONFIG fra den opprettede klyngen.
  4. Installer GitLab på Kubernetes.
  5. Få GitLab-token fra GitLab laget for bruker root.
  6. Lag en prosjektstruktur i GitLab ved hjelp av GitLab-token.
  7. Skyv eksisterende kode til GitLab.
  8. ?
  9. Fortjeneste!

Trinn 1. Tokenet kan fås i seksjonen API-nøkler.

Kylling eller egg: splitting av IaCTrinn 2. Vi forbereder vår Terraform for å "bake" en klynge med 2 noder. Hvis du er sikker på at du har nok ressurser til alt, kan du aktivere automatiske kvoter:

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

Legg til en bruker i prosjektet:

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
}

Produksjon:

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
}

Vi lanserer:

$ 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

Kylling eller egg: splitting av IaC
Trinn 3. Vi får cubeconfig.

For å laste ned KUBECONFIG programmatisk, må du få et token fra OpenStack:

openstack token issue -c id -f value > token

Og med dette tokenet, send en forespørsel til Managed Kubernetes Selectel API. k8s_id gir ut terra:

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

Cupconfig kan også nås gjennom panelet.

Kylling eller egg: splitting av IaC
Trinn 4. Etter at klyngen er bakt og vi har tilgang til den, kan vi tilsette yaml på toppen etter smak.

Jeg foretrekker å legge til:

  • navneområde,
  • lagringsklasse
  • pod sikkerhetspolitikk og så videre.

Oppbevaringsklasse for Selectel kan tas fra offisielt depot.

Siden jeg først valgte en klynge i sonen ru-3a, så trenger jeg lagringsklassen fra denne sonen.

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

Trinn 5. Installer en lastbalanser.

Vi vil bruke standarden for mange nginx-inngang. Det er allerede mange instruksjoner for å installere det, så vi vil ikke dvele ved det.

$ 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

Vi venter på at den skal motta en ekstern IP i omtrent 3-4 minutter:

Kylling eller egg: splitting av IaC
Mottatt ekstern IP:

Kylling eller egg: splitting av IaC
Trinn 6. Installer 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"

Igjen venter vi på at alle belgene skal reise seg.

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

Belgene steg:

Kylling eller egg: splitting av IaC
Trinn 7. Vi mottar GitLab-token.

Først, finn ut påloggingspassordet:

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

La oss nå logge på og få et token:

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

Trinn 8. Bringe Git-depoter til det riktige hierarkiet ved å bruke Gitlab-leverandøren.

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

Dessverre har terraform GitLab-leverandøren en flytende feil. Deretter må du slette de motstridende prosjektene manuelt for at tf.state skal fikses. Kjør deretter kommandoen `$make all` på nytt

Trinn 9. Vi overfører lokale depoter til serveren.

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

Kylling eller egg: splitting av IaC
Kylling eller egg: splitting av IaC
Kylling eller egg: splitting av IaC

Konklusjon

Vi har oppnådd at vi kan administrere alt deklarativt fra vår lokale maskin. Nå vil jeg overføre alle disse oppgavene til CI og bare trykke på knapper. For å gjøre dette, må vi overføre våre lokale stater (Terraform state) til CI. Hvordan du gjør dette er i neste del.

Abonner på vår bloggfor ikke å gå glipp av utgivelsen av nye artikler!

Kilde: www.habr.com

Legg til en kommentar