Kana või muna: IaC tükeldamine

Kana või muna: IaC tükeldamine
Mis oli enne – kana või muna? Üsna kummaline algus artiklile Infrastructure-as-Code, kas pole?

Mis on muna?

Enamasti on Infrastructure-as-Code (IaC) taristu deklaratiivne esitusviis. Selles kirjeldame olekut, mida soovime saavutada, alustades riistvaraosast ja lõpetades tarkvara konfiguratsiooniga. Seetõttu kasutatakse IaC-d:

  1. Ressursi pakkumine. Need on VM-id, S3, VPC jne. Põhilised töövahendid: Terraform и Pilve moodustumine.
  2. Tarkvara konfigureerimine. Põhilised tööriistad: Võimalik, kokk jne.

Iga kood on giti hoidlates. Ja varem või hiljem otsustab meeskonna juht, et need tuleb korda teha. Ja ta reageerib. Ja see loob mingi struktuuri. Ja ta näeb, et see on hea.

Hea on ka see, et see on juba olemas GitLab и GitHub- Terraformi pakkuja (ja see on tarkvara konfiguratsioon). Nende abiga saate hallata kogu projekti: meeskonnaliikmed, CI/CD, git-flow jne.

Kust muna tuli?

Seega läheneme järk-järgult põhiküsimusele.

Kõigepealt peate alustama hoidlast, mis kirjeldab teiste hoidlate, sealhulgas teie enda struktuuri. Ja loomulikult peate GitOpsi osana lisama CI, et muudatused täidetaks automaatselt.

Kui Git pole veel loodud?

  1. Kuidas seda Gitis salvestada?
  2. Kuidas installida CI?
  3. Kui juurutame Gitlabi ka IaC-ga ja isegi Kubernetesis?
  4. Ja GitLab Runner ka Kubernetesis?
  5. Aga Kubernetes pilveteenuse pakkujas?

Mis oli enne: GitLab, kuhu ma oma koodi üles laadin, või kood, mis kirjeldab, millist GitLabi ma vajan?

Kana munaga

«Oyakodon3 dinosaurusega" [src]

Proovime valmistada roogi pilveteenuse pakkujana Hallatud Kubernetes Selectel.

TL; DR

Kas on võimalik ühe meeskonnaga korraga liituda?

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

Koostis:

  • konto saidilt my.selectel.ru;
  • konto tunnus;
  • Kubernetese oskused;
  • Helmi oskused;
  • Terraformi oskused;
  • Helm diagramm GitLab;
  • Helmi diagramm GitLabi jooksja.

Retsept:

  1. Hankige paneelilt MY_SELECTEL_TOKEN my.selectel.ru.
  2. Looge Kubernetese klaster, teisaldades sellele konto märgi.
  3. Hankige loodud klastrist KUBECONFIG.
  4. Installige GitLab Kubernetesesse.
  5. Hankige kasutaja jaoks loodud GitLab-märk GitLabist juur.
  6. Looge GitLabis projekti struktuur GitLab-tokeni abil.
  7. Lükake olemasolev kood GitLabi.
  8. ?
  9. Kasum!

Samm 1. Märki saab sektsioonist API võtmed.

Kana või muna: IaC tükeldamineSamm 2. Valmistame oma Terraformi ette kahest sõlmest koosneva klastri “küpsetamiseks”. Kui olete kindel, et teil on kõige jaoks piisavalt ressursse, saate lubada automaatsed kvoodid:

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

Lisage projekti kasutaja:

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=<token> 
terraform plan -out planfile

$ terraform apply -input=false -auto-approve planfile

Kana või muna: IaC tükeldamine
Samm 3. Saame cubeconfigi.

Rakenduse KUBECONFIG programmiliseks allalaadimiseks peate hankima OpenStackist loa:

openstack token issue -c id -f value > token

Ja selle märgiga esitage taotlus hallatud Kubernetes Selecteli API-le. k8s_id annab välja terra vorm:

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

Cupconfigile pääseb juurde ka paneeli kaudu.

Kana või muna: IaC tükeldamine
Samm 4. Kui kobar on küpsetatud ja meil on sellele juurdepääs, võime maitse järgi lisada yamli.

Eelistan lisada:

  • nimeruum
  • ladustamisklass
  • pod turvapoliitika ja nii edasi.

Säilitusklass jaoks Selectel saab võtta ametlik hoidla.

Kuna algselt valisin tsoonis klastri ru-3a, siis on mul vaja selle tsooni salvestusklassi.

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

Samm 5. Paigaldage koormuse tasakaalustaja.

Kasutame paljude jaoks standardset nginx-ingress. Selle installimiseks on juba palju juhiseid, nii et me ei peatu sellel.

$ 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 välise IP-aadressi saamist umbes 3-4 minutit:

Kana või muna: IaC tükeldamine
Vastu võetud väline IP:

Kana või muna: IaC tükeldamine
Samm 6. Installige 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"

Jällegi ootame, kuni kõik kaunad kerkivad.

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

Kaunad tõusid:

Kana või muna: IaC tükeldamine
Samm 7. Saame GitLab-tokeni.

Esmalt uurige sisselogimisparooli:

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

Nüüd logime sisse ja hankime märgi:

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

Samm 8. Git-hoidlate viimine õigesse hierarhiasse Gitlabi pakkuja abil.

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

Kahjuks on terraform GitLabi pakkujal ujuv viga. Seejärel peate faili tf.state parandamiseks konfliktsed projektid käsitsi kustutama. Seejärel käivitage käsk $make all uuesti

Samm 9. Edastame kohalikud hoidlad serverisse.

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

Valmis:

Kana või muna: IaC tükeldamine
Kana või muna: IaC tükeldamine
Kana või muna: IaC tükeldamine

Järeldus

Oleme saavutanud selle, et saame kõike deklaratiivselt oma kohalikust masinast hallata. Nüüd tahan kõik need ülesanded CI-sse üle kanda ja lihtsalt vajutada nuppe. Selleks peame oma kohalikud osariigid (Terraform State) üle kandma CI-le. Kuidas seda teha, on järgmises osas.

Telli meie bloget mitte ilma jääda uute artiklite ilmumisest!

Allikas: www.habr.com

Lisa kommentaar