Vištiena arba kiaušinis: IaC padalijimas

Vištiena arba kiaušinis: IaC padalijimas
Kas buvo pirma – višta ar kiaušinis? Gana keista straipsnio apie infrastruktūrą kaip kodą pradžia, ar ne?

Kas yra kiaušinis?

Dažniausiai Infrastruktūra kaip kodas (IaC) yra deklaratyvus infrastruktūros vaizdavimo būdas. Jame aprašome būseną, kurią norime pasiekti, pradedant nuo aparatinės dalies ir baigiant programinės įrangos konfigūracija. Todėl IaC naudojamas:

  1. Išteklių aprūpinimas. Tai VM, S3, VPC ir kt. Pagrindinės darbo priemonės: Terraformas и Debesų susidarymas.
  2. Programinės įrangos konfigūracija. Pagrindiniai įrankiai: Galimas, virėjas ir kt.

Bet koks kodas yra git saugyklose. Ir anksčiau ar vėliau komandos vadovas nuspręs, kad juos reikia sutvarkyti. Ir jis reaguos. Ir tai sukurs tam tikrą struktūrą. Ir jis pamatys, kad tai yra gerai.

Taip pat gerai, kad jis jau egzistuoja GitLab и GitHub-Terraform teikėjas (ir tai yra programinės įrangos konfigūracija). Jų pagalba galite valdyti visą projektą: komandos narius, CI/CD, git-flow ir kt.

Iš kur atsirado kiaušinis?

Taigi pamažu artėjame prie pagrindinio klausimo.

Visų pirma, reikia pradėti nuo saugyklos, kuri aprašo kitų saugyklų, įskaitant save, struktūrą. Ir, žinoma, kaip „GitOps“ dalį turite pridėti CI, kad pakeitimai būtų vykdomi automatiškai.

Jei Git dar nebuvo sukurtas?

  1. Kaip jį laikyti Git?
  2. Kaip įdiegti CI?
  3. Jei taip pat įdiegsime „Gitlab“ naudodami IaC ir net „Kubernetes“?
  4. Ir „GitLab Runner“ taip pat yra „Kubernetes“?
  5. O kaip su „Kubernetes“ debesies paslaugų teikėju?

Kas įvyko pirmiausia: „GitLab“, kur įkelsiu savo kodą, ar kodas, apibūdinantis, kokios „GitLab“ man reikia?

Vištiena su kiaušiniais

«Oyakodonas3 su dinozauru“ [src]

Pabandykime paruošti patiekalą naudodamiesi debesų paslaugų teikėju Tvarko Kubernetes Selectel.

Lt; DR

Ar galima vienu metu prisijungti prie vienos komandos?

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

Sudėtis:

  • Paskyra iš my.selectel.ru;
  • Paskyros žetonas;
  • Kubernetes įgūdžiai;
  • vairo įgūdžiai;
  • Terraforminiai įgūdžiai;
  • „GitLab“ vairo diagrama;
  • „GitLab Runner“ vairo diagrama.

Receptas:

  1. Gaukite MY_SELECTEL_TOKEN iš skydelio my.selectel.ru.
  2. Sukurkite Kubernetes klasterį perkeldami į jį paskyros prieigos raktą.
  3. Gaukite KUBECONFIG iš sukurto klasterio.
  4. Įdiekite „GitLab“ „Kubernetes“.
  5. Gaukite „GitLab“ prieigos raktą iš „GitLab“, sukurtą vartotojui šaknis.
  6. Sukurkite projekto struktūrą „GitLab“ naudodami „GitLab“ raktą.
  7. Perkelkite esamą kodą į „GitLab“.
  8. ???
  9. Pelnas!

Žingsnis 1. Žetoną galite gauti skyriuje API raktai.

Vištiena arba kiaušinis: IaC padalijimasŽingsnis 2. Paruošiame savo Terraform 2 mazgų klasteriui „kepti“. Jei esate tikri, kad turite pakankamai išteklių viskam, galite įjungti automatines kvotas:

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

Pridėkite vartotoją prie projekto:

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
}

Išvestis:

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
}

Paleidžiame:

$ 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

Vištiena arba kiaušinis: IaC padalijimas
Žingsnis 3. Gauname kubo konfigūraciją.

Norėdami programiškai atsisiųsti KUBECONFIG, turite gauti prieigos raktą iš OpenStack:

openstack token issue -c id -f value > token

Ir naudodami šį prieigos raktą pateikite užklausą valdomai „Kubernetes Selectel“ API. k8s_id Problemos terraformas:

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

„Cupconfig“ taip pat galima pasiekti per skydelį.

Vištiena arba kiaušinis: IaC padalijimas
Žingsnis 4. Po to, kai kekė iškepa ir turėsime prieigą prie jo, ant viršaus galime uždėti yaml pagal skonį.

Man labiau patinka pridėti:

  • vardų erdvė
  • saugojimo klasė
  • pod saugumo politika ir pan.

Sandėliavimo klasė už Selectel galima paimti iš oficialią saugyklą.

Kadangi iš pradžių pasirinkau klasterį zonoje ru-3a, tada man reikia saugyklos klasės iš šios zonos.

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

Žingsnis 5. Įdiekite apkrovos balansavimo įtaisą.

Daugeliui naudosime standartinį nginx-ingress. Jau yra daug instrukcijų, kaip jį įdiegti, todėl mes apie tai nesigilinsime.

$ 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

Laukiame, kol jis gaus išorinį IP apie 3–4 minutes:

Vištiena arba kiaušinis: IaC padalijimas
Gautas išorinis IP:

Vištiena arba kiaušinis: IaC padalijimas
Žingsnis 6. Įdiekite „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"

Vėl laukiame, kol visos ankštys pakils.

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

Ankštys pakilo:

Vištiena arba kiaušinis: IaC padalijimas
Žingsnis 7. Mes gauname GitLab-žetoną.

Pirmiausia sužinokite prisijungimo slaptažodį:

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

Dabar prisijunkime ir gaukime žetoną:

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

Žingsnis 8. „Git“ saugyklų perkėlimas į tinkamą hierarchiją naudojant „Gitlab“ teikėją.

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

Deja, „Terraform GitLab“ teikėjas turi plūduriuojančią funkciją klaida. Tada turėsite rankiniu būdu ištrinti nesuderinamus projektus, kad būtų ištaisyta tf.state. Tada iš naujo paleiskite komandą „$make all“.

Žingsnis 9. Vietines saugyklas perkeliame į 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)

Atlikta:

Vištiena arba kiaušinis: IaC padalijimas
Vištiena arba kiaušinis: IaC padalijimas
Vištiena arba kiaušinis: IaC padalijimas

išvada

Pasiekėme, kad viską galime tvarkyti deklaratyviai iš savo vietinės mašinos. Dabar noriu perkelti visas šias užduotis į CI ir tiesiog paspauskite mygtukus. Norėdami tai padaryti, turime perkelti savo vietines valstijas (Terraformos būseną) į CI. Kaip tai padaryti – kitoje dalyje.

Užsiprenumeruokite mūsų dienoraštiskad nepraleistumėte naujų straipsnių!

Šaltinis: www.habr.com