Kana või muna: murame IaC

Kana või muna: murame IaC
Mis on enne tulnud — kana või muna? See on üsna veider algus artiklile Infrastructure-as-Code'ist, kas pole?

Mis on muna?

Lähitulevikus on Infrastructure-as-Code (IaC) deklareeriv viis infrastruktuuri esitlemiseks. Sellega kirjeldame olekut, mida soovime saavutada, alates riistvarast kuni tarkvara konfiguratsioonini. Seetõttu kasutatakse IaC-d järgmiseks:

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

Iga kood asub git-repositooriumides. Ja varem või hiljem otsustab tiimijuht, et neid tuleks korrastada. Ta peab neid refaktoreerima. Ja ta loob teatud struktuuri. Ja ta näeb, et see on hea.

Samuti on hea, et juba eksisteerib GitLab ja GitHub-teenus Terraformi jaoks (ja see on Tarkvara konfiguratsioon). Nende abil on võimalik hallata kogu projekti: meeskonna liikmeid, CI/CD, git-flow jne.

Kust tuli muna?

Siin me lähme järk-järgult põhiküsimuse juurde.

Esiteks tuleb alustada repositooriumist, mis kirjeldab teiste repositooriumide struktuuri, sealhulgas enda oma. Ja muidugi, GitOps'i raames tuleb lisada CI, et muudatused toimuksid automaatselt.

Mis siis, kui Git veel loodud ei ole?

  1. Kuidas seda Git'is hoida?
  2. Kuidas lisada CI?
  3. Kui me ka Gitlabi käivitame IaC abil ja veel Kuberneteses?
  4. Ja GitLab Runner ka Kuberneteses?
  5. Aga Kubernetes pilveteenuses?

Mis tuli enne: GitLab, millele ma oma koodi laadin, või kood, mis kirjeldab, milline GitLab mul vaja on?

Kana koos munadega

«Oyakodon3 koos dinosaurusega» [src]

Proovime valmistada rooga, kasutades pilveteenuse pakkujana Managed Kubernetes Selectel.

TL;DR

Kas oleks võimalik, et kõik koos ühte käsu?

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

Koostisosad:

  • Kontod my.selectel.ru-st;
  • Kontotoken;
  • Kubernetes oskused;
  • Helm oskused;
  • Terraform oskused;
  • Helm chart GitLab;
  • Helm chart GitLab Runner.

Retsept:

  1. Saada MY_SELECTEL_TOKEN juhtpaneelilt my.selectel.ru.
  2. Loo Kubernetes klaster, edastades sinna konto token.
  3. Saada KUBECONFIG loodud klastri abil.
  4. Paigaldage GitLab Kubernetesesse.
  5. Saada GitLab-token loodud GitLab'ilt kasutajale root.
  6. Loo projektide struktuur GitLab'is, kasutades GitLab-tokenit.
  7. Pushige olemasolev kood GitLab'i.
  8. ???
  9. Kasum!

Samm 1. Tokenit saab saada sektsioonis API võtmed.

Kana või muna: murame IaCSamm 2. Valmistame oma Terraformi 2 sõlme klastrite "küpsetamiseks". Kui olete kindel, et teil on piisavalt ressursse, siis võite sisse lülitada automaatsed kvotid:

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: murame IaC
Samm 3. Saame k8s konfi.

Et KUBECONFIGi programmeerimise teel alla laadida, tuleb OpenStackist token saada:

openstack token issue -c id -f value > token

Ja juba sellega teha päring Managed Kubernetes Selectel API-le. 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

Kubeconfigi saab ka paneeli kaudu.

Kana või muna: murame IaC
Samm 4. Pärast seda, kui klaster on loodud ja meil on sellele juurdepääs, saame lisada oma maitse järgi yaml.

Eelistaksin lisada:

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

Salvestusklass Selecteli jaoks võib võtta ametlikust repost..

Kuna alguses valisin klastrit tsoonis ru-3a, siis pean samuti Storage Class'i saama sellest tsoonist.

tüüp: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
 nimi: fast.ru-3a
 annotatsioonid:
   storageclass.kubernetes.io/is-default-class: "true"
provisioner: cinder.csi.openstack.org
parameetrid:
 tüüp: fast.ru-3a
 kättesaadavus: ru-3a
allowVolumeExpansion: true

Samm 5. Seame koormuse tasakaalustaja.

Kasutame paljude jaoks standardset nginx-ingress. Installimise juhiseid on juba piisavalt, nii et ei jää sellele pidama.

$ 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 see saab välist IP, umbes 3-4 minutit:

Kana või muna: murame IaC
Sai väline IP:

Kana või muna: murame IaC
Samm 6. Installime 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
NIMI                                    	VALMIS   STS 	TAASKÄIVITUSED   VANUS
gitlab-gitaly-0                         	0/1 	Ootejärjekord 	0      	0s
gitlab-gitlab-exporter-88f6cc8c4-fl52d  	0/1 	Ootejärjekord 	0      	0s
gitlab-gitlab-runner-6b6867c5cf-hd9dp   	0/1 	Ootejärjekord 	0      	0s
gitlab-gitlab-shell-55cb6ccdb-h5g8x     	0/1 	Algus:0/2	0      	0s
gitlab-migrations.1-2cg6n               	0/1 	Ootejärjekord 	0      	0s
gitlab-minio-6dd7d96ddb-zd9j6           	0/1 	Ootejärjekord 	0      	0s
gitlab-minio-create-buckets.1-bncdp     	0/1 	Ootejärjekord 	0      	0s
gitlab-postgresql-0                     	0/2 	Ootejärjekord 	0      	0s
gitlab-prometheus-server-6cfb57f575-v8k6j 	0/2 	Ootejärjekord 	0      	0s
gitlab-redis-master-0                   	0/2 	Ootejärjekord 	0      	0s
gitlab-registry-6bd77b4b8c-pb9v9        	0/1 	Ootejärjekord 	0      	0s
gitlab-registry-6bd77b4b8c-zgb6r        	0/1 	Algus:0/2	0      	0s
gitlab-shared-secrets.1-pc7-5jgq4       	0/1 	Täidetud   0      	20s
gitlab-sidekiq-all-in-1-v1-54dbcf7f5f-qbq67 	0/1 	Ootejärjekord 	0      	0s
gitlab-task-runner-6fd6857db7-9x567     	0/1 	Ootejärjekord 	0      	0s
gitlab-webservice-d9d4fcff8-hp8wl       	0/2 	Ootejärjekord 	0      	0s
Ootame gitlab
./wait_gitlab.sh ../internal/gitlab/gitlab/.pods
ootame poodi...
ootame poodi...
ootame poodi...

Podid on tõusnud:

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

Esmalt saame sisse logimise parooli:

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

Nüüd autentime ja saame tokeni:

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

Samm 8. Asetame Git-reposid õigele hierarhiale Gitlab Provideriga.

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

Kahjuks on terraform GitLab provideris probleemne viga. Siis tuleb eemaldada konfliktivad projektid käsitsi, et tf.state parandus toimuks. Seejärel käivitage käsk `$ make all`

Samm 9. Edastame kohalikke repo-serverisse.

$ make push

[master (root-commit) b61d977]  Esmase kohustus
 3 failide muudatust, 46 lisamisi(+)
 loo režiim 100644 .gitignore
 loo režiim 100644 values.yml
Objektide loendamine: 5, valmis.
Objektide loendamine: 100% (5/5), valmis.
Delta tihendamine kasutades kuni 8 niiti
Objektide tihendamine: 100% (5/5), valmis.
Objektide kirjutamine: 100% (5/5), 770 baiti | 770.00 KiB/s, valmis.
Kokku 5 (delta 0), taaskasutatud 0 (delta 0)

Valmis:

Kana või muna: murame IaC
Kana või muna: murame IaC
Kana või muna: murame IaC

Kokkuvõte

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

Telli meie blogi, et uusi artiklite väljalaskmisi mitte mööda lasta!

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster