Kylling eller æg: opdeling af IaC

Kylling eller æg: opdeling af IaC
Hvad kom først - hønen eller ægget? En ret mærkelig start på en artikel om Infrastructure-as-Code, ikke?

Hvad er et æg?

Oftest er Infrastructure-as-Code (IaC) en deklarativ måde at repræsentere infrastruktur på. I den beskriver vi den tilstand, vi ønsker at opnå, startende fra hardwaredelen og slutter med softwarekonfigurationen. Derfor bruges IaC til:

  1. Tilvejebringelse af ressourcer. Disse er VM'er, S3, VPC osv. Grundlæggende værktøjer til arbejdet: terraform и CloudFormation.
  2. Software Configuration. Grundlæggende værktøjer: Ansible, kok osv.

Enhver kode er i git repositories. Og før eller siden vil teamlederen beslutte, at de skal bringes i orden. Og han vil refaktorisere. Og det vil skabe noget struktur. Og han vil se, at det er godt.

Det er også godt, at det allerede findes GitLab и GitHub-udbyder til Terraform (og dette er softwarekonfiguration). Med deres hjælp kan du styre hele projektet: teammedlemmer, CI/CD, git-flow osv.

Hvor kom ægget fra?

Så vi nærmer os efterhånden hovedspørgsmålet.

Først og fremmest skal du starte med et depot, der beskriver strukturen af ​​andre depoter, inklusive dig selv. Og selvfølgelig skal du som en del af GitOps tilføje CI, så ændringer udføres automatisk.

Hvis Git ikke er blevet oprettet endnu?

  1. Hvordan gemmer man det i Git?
  2. Hvordan installeres CI?
  3. Hvis vi også implementerer Gitlab ved hjælp af IaC, og endda i Kubernetes?
  4. Og GitLab Runner også i Kubernetes?
  5. Hvad med Kubernetes i cloud-udbyderen?

Hvad kom først: GitLab, hvor jeg uploader min kode, eller koden, der beskriver, hvilken slags GitLab jeg har brug for?

Kylling med æg

«Oyakodon3 med en dinosaur" [src]

Lad os prøve at tilberede en ret ved at bruge som en cloud-udbyder Administreret Kubernetes Selectel.

TL; DR

Er det muligt at deltage i et hold på én gang?

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

Ingredienser:

  • Konto fra my.selectel.ru;
  • Konto token;
  • Kubernetes færdigheder;
  • Hjelmfærdigheder;
  • Terraform færdigheder;
  • Hjelmdiagram GitLab;
  • Hjelmdiagram GitLab Runner.

opskrift:

  1. Hent MY_SELECTEL_TOKEN fra panelet my.selectel.ru.
  2. Opret en Kubernetes-klynge ved at overføre et kontotoken til den.
  3. Hent KUBECONFIG fra den oprettede klynge.
  4. Installer GitLab på Kubernetes.
  5. Få GitLab-token fra GitLab oprettet til bruger rod.
  6. Opret en projektstruktur i GitLab ved hjælp af GitLab-token.
  7. Skub eksisterende kode til GitLab.
  8. ???
  9. Profit!

Trin 1. Tokenet kan fås i afsnittet API nøgler.

Kylling eller æg: opdeling af IaCTrin 2. Vi forbereder vores Terraform til at "bage" en klynge af 2 noder. Hvis du er sikker på, at du har nok ressourcer til alt, så 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",
 }
}

Tilføj en bruger til projektet:

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
}

Produktion:

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

$ 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 æg: opdeling af IaC
Trin 3. Vi får cubeconfig.

For at downloade KUBECONFIG programmatisk skal du få et token fra OpenStack:

openstack token issue -c id -f value > token

Og med dette token lav en anmodning til Managed Kubernetes Selectel API. k8s_id problemer terra form:

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å tilgås via panelet.

Kylling eller æg: opdeling af IaC
Trin 4. Efter at klyngen er bagt, og vi har adgang til den, kan vi tilføje yaml på toppen efter smag.

Jeg foretrækker at tilføje:

  • navneområde,
  • opbevaringsklasse
  • pod sikkerhedspolitik og så videre.

Opbevaringsklasse for Selectel kan tages fra officielt depot.

Siden jeg oprindeligt valgte en klynge i zonen ru-3a, så har jeg brug for Storage Class fra denne zone.

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

Trin 5. Installer en belastningsbalancer.

Vi vil bruge standarden til mange nginx-indtrængen. Der er allerede masser af instruktioner til at installere det, så vi vil ikke dvæle 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 modtager en ekstern IP i cirka 3-4 minutter:

Kylling eller æg: opdeling af IaC
Modtaget ekstern IP:

Kylling eller æg: opdeling af IaC
Trin 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"

Igen venter vi på, at alle bælgerne rejser sig.

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

Bælgene steg:

Kylling eller æg: opdeling af IaC
Trin 7. Vi modtager GitLab-token.

Find først login-adgangskoden:

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

Lad os nu logge ind og få et token:

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

Trin 8. At bringe Git-lagre til det korrekte hierarki ved hjælp af Gitlab-udbyderen.

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

Desværre har terraform GitLab-udbyderen en flydende insekt. Så bliver du nødt til at slette de modstridende projekter manuelt, for at tf.state kan rettes. Kør derefter kommandoen `$make all` igen

Trin 9. Vi overfører lokale arkiver 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 æg: opdeling af IaC
Kylling eller æg: opdeling af IaC
Kylling eller æg: opdeling af IaC

Konklusion

Vi har opnået, at vi kan styre alt deklarativt fra vores lokale maskine. Nu vil jeg overføre alle disse opgaver til CI og bare trykke på knapper. For at gøre dette skal vi overføre vores lokale stater (Terraform-staten) til CI. Hvordan man gør dette er i næste del.

Abonner på vores blogfor ikke at gå glip af udgivelsen af ​​nye artikler!

Kilde: www.habr.com

Tilføj en kommentar