Kip of het ei: IaC splitsen

Kip of het ei: IaC splitsen
Wat was er eerst: de kip of het ei? Een nogal vreemde start voor een artikel over Infrastructure-as-Code, nietwaar?

Wat is een ei?

Meestal is Infrastructure-as-Code (IaC) een declaratieve manier om infrastructuur weer te geven. Daarin beschrijven we de staat die we willen bereiken, beginnend bij het hardwaregedeelte en eindigend met de softwareconfiguratie. Daarom wordt IaC gebruikt voor:

  1. Voorziening van hulpbronnen. Dit zijn VM's, S3, VPC, enz. Basishulpmiddelen voor werk: Terraform и Wolkenvorming.
  2. software Configuration. Basishulpmiddelen: Ansible, Chef-kok, enz.

Elke code bevindt zich in git-repository's. En vroeg of laat zal de teamleider besluiten dat ze op orde moeten worden gebracht. En hij zal herstructureren. En het zal wat structuur creëren. En hij zal zien dat dit goed is.

Het is ook goed dat het al bestaat GitLab и GitHub-provider voor Terraform (en dit is Softwareconfiguratie). Met hun hulp kun je het hele project beheren: teamleden, CI/CD, git-flow, enz.

Waar kwam het ei vandaan?

We naderen dus geleidelijk de hoofdvraag.

Allereerst moet je beginnen met een repository die de structuur van andere repository's beschrijft, inclusief jezelf. En natuurlijk moet je, als onderdeel van GitOps, CI toevoegen zodat wijzigingen automatisch worden uitgevoerd.

Als Git nog niet is gemaakt?

  1. Hoe sla je het op in Git?
  2. Hoe CI installeren?
  3. Als we Gitlab ook inzetten met IaC, en zelfs in Kubernetes?
  4. En GitLab Runner ook in Kubernetes?
  5. Hoe zit het met Kubernetes in de cloudprovider?

Wat was er eerst: het GitLab waar ik mijn code upload, of de code die beschrijft wat voor soort GitLab ik nodig heb?

Kip met eieren

«Oyakodon3 met een dinosaurus" [src]

Laten we proberen een gerecht te bereiden als cloudprovider Beheerde Kubernetes Selectel.

TL; DR

Is het mogelijk om in één keer deel te nemen aan één team?

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

Ingrediënten:

  • Account van mijn.selectel.ru;
  • Accounttoken;
  • Kubernetes-vaardigheden;
  • Helmvaardigheden;
  • Terraform-vaardigheden;
  • Helmdiagram GitLab;
  • Helmgrafiek GitLab Runner.

recept:

  1. Ontvang MY_SELECTEL_TOKEN van het paneel mijn.selectel.ru.
  2. Maak een Kubernetes-cluster door er een accounttoken naar over te dragen.
  3. Haal KUBECONFIG op uit het gemaakte cluster.
  4. Installeer GitLab op Kubernetes.
  5. Haal het GitLab-token op van GitLab gemaakt voor de gebruiker wortel.
  6. Maak een projectstructuur in GitLab met behulp van GitLab-token.
  7. Push bestaande code naar GitLab.
  8. ???
  9. Winst!

Stap 1. Het token kan worden verkregen in de sectie API-sleutels.

Kip of het ei: IaC splitsenStap 2. We bereiden onze Terraform voor op het “bakken” van een cluster van 2 knooppunten. Als u zeker weet dat u voor alles voldoende middelen heeft, kunt u automatische quota inschakelen:

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

Voeg een gebruiker toe aan het project:

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
}

Uitgang:

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
}

Laten we lanceren:

$ 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

Kip of het ei: IaC splitsen
Stap 3. We krijgen de cubeconfig.

Om KUBECONFIG programmatisch te downloaden, hebt u een token van OpenStack nodig:

openstack token issue -c id -f value > token

En doe met dit token een verzoek aan de Managed Kubernetes Selectel API. k8s_id problemen 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 is ook toegankelijk via het paneel.

Kip of het ei: IaC splitsen
Stap 4. Nadat het cluster is gebakken en we er toegang toe hebben, kunnen we naar smaak yaml toevoegen.

Ik voeg liever toe:

  • naamruimte,
  • opslag klasse
  • pod-beveiligingsbeleid enzovoort.

Opslag klasse voor Selectel kan worden afgenomen officiële opslagplaats.

Sinds aanvankelijk heb ik een cluster in de zone geselecteerd ru-3a, dan heb ik de opslagklasse uit deze zone nodig.

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

Stap 5. Installeer een load-balancer.

Voor velen zullen wij de standaard gebruiken nginx-ingang. Er zijn al voldoende instructies om het te installeren, dus we zullen er niet bij stilstaan.

$ 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

We wachten ongeveer 3-4 minuten tot het een extern IP-adres ontvangt:

Kip of het ei: IaC splitsen
Ontvangen extern IP:

Kip of het ei: IaC splitsen
Stap 6. Installeer 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"

Opnieuw wachten we tot alle peulen omhoog zijn gekomen.

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

De peulen stegen op:

Kip of het ei: IaC splitsen
Stap 7. Wij ontvangen GitLab-token.

Zoek eerst het inlogwachtwoord op:

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

Laten we nu inloggen en een token krijgen:

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

Stap 8. Git-repository's naar de juiste hiërarchie brengen met behulp van de Gitlab Provider.

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

Helaas heeft de terraform GitLab-provider een floating beestje. Vervolgens moet u de conflicterende projecten handmatig verwijderen om tf.state te kunnen herstellen. Voer vervolgens het commando `$make all` opnieuw uit

Stap 9. We dragen lokale repository's over naar de server.

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

Kip of het ei: IaC splitsen
Kip of het ei: IaC splitsen
Kip of het ei: IaC splitsen

Conclusie

We hebben bereikt dat we alles declaratief kunnen beheren vanaf onze lokale machine. Nu wil ik al deze taken overbrengen naar CI en gewoon op de knoppen drukken. Om dit te doen, moeten we onze lokale staten (Terraform-staat) overbrengen naar CI. Hoe u dit doet, vindt u in het volgende deel.

Abonneer u op onze blogom de release van nieuwe artikelen niet te missen!

Bron: www.habr.com

Voeg een reactie