Vistas vai olas: IaC sadalīšana

Vistas vai olas: IaC sadalīšana
Kas bija pirmais - vista vai ola? Diezgan dīvains sākums rakstam par Infrastructure-as-Code, vai ne?

Kas ir ola?

Visbiežāk Infrastruktūra kā kods (IaC) ir deklaratīvs infrastruktūras attēlošanas veids. Tajā mēs aprakstām stāvokli, kuru vēlamies sasniegt, sākot no aparatūras daļas un beidzot ar programmatūras konfigurāciju. Tāpēc IaC izmanto:

  1. Resursu nodrošināšana. Tie ir virtuālās mašīnas, S3, VPC utt. Pamatrīki darbam: Terraform и Mākoņu veidošanās.
  2. Programmatūras konfigurācija. Pamatrīki: Iespējams, šefpavārs utt.

Jebkurš kods atrodas git krātuvēs. Un agri vai vēlu komandas vadītājs nolems, ka tie ir jāsaved kārtībā. Un viņš reaģēs. Un tas radīs kādu struktūru. Un viņš redzēs, ka tas ir labi.

Ir arī labi, ka tas jau pastāv GitLab и GitHub-Terraform nodrošinātājs (un tā ir programmatūras konfigurācija). Ar viņu palīdzību jūs varat pārvaldīt visu projektu: komandas dalībniekus, CI/CD, git-flow utt.

No kurienes radās ola?

Tātad mēs pamazām tuvojamies galvenajam jautājumam.

Pirmkārt, jums ir jāsāk ar repozitoriju, kas apraksta citu repozitoriju struktūru, tostarp jūs pašu. Un, protams, kā daļa no GitOps jums ir jāpievieno CI, lai izmaiņas tiktu izpildītas automātiski.

Ja Git vēl nav izveidots?

  1. Kā to uzglabāt Git?
  2. Kā instalēt CI?
  3. Ja mēs arī izvietosim Gitlab, izmantojot IaC un pat Kubernetes?
  4. Un GitLab Runner arī Kubernetes?
  5. Kā ar Kubernetes mākoņpakalpojumā?

Kas bija pirmais: GitLab, kurā es augšupielādēšu savu kodu, vai kods, kas apraksta, kāda veida GitLab man ir nepieciešams?

Vistas gaļa ar olām

«Oyakodon3 ar dinozauru" [src]

Mēģināsim pagatavot ēdienu, izmantojot mākoņa pakalpojumu sniedzēju Pārvalda Kubernetes Selectel.

TL; DR

Vai ir iespējams iekļauties vienā komandā uzreiz?

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

Sastāvdaļas:

  • Konts no my.selectel.ru;
  • Konta marķieris;
  • Kubernetes prasmes;
  • Stūres prasmes;
  • Terraform prasmes;
  • Stūres diagramma GitLab;
  • Stūres diagramma GitLab Runner.

recepte:

  1. Iegūstiet MY_SELECTEL_TOKEN no paneļa my.selectel.ru.
  2. Izveidojiet Kubernetes klasteru, pārsūtot uz to konta pilnvaru.
  3. Iegūstiet KUBECONFIG no izveidotā klastera.
  4. Instalējiet GitLab vietnē Kubernetes.
  5. Iegūstiet lietotājam izveidoto GitLab marķieri no GitLab sakne.
  6. Izveidojiet projekta struktūru GitLab, izmantojot GitLab marķieri.
  7. Nosūtiet esošo kodu GitLab.
  8. ?
  9. Peļņa!

Solis 1. Žetonu var iegūt sadaļā API atslēgas.

Vistas vai olas: IaC sadalīšanaSolis 2. Mēs sagatavojam savu Terraform 2 mezglu kopas “izcepšanai”. Ja esat pārliecināts, ka jums ir pietiekami daudz resursu visam, varat iespējot automātiskās 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",
 }
}

Pievienojiet projektam lietotāju:

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
}

Izvade:

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
}

Mēs uzsākam:

$ 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

Vistas vai olas: IaC sadalīšana
Solis 3. Mēs iegūstam cubeconfig.

Lai programmatiski lejupielādētu KUBECONFIG, jums ir jāsaņem marķieris no OpenStack:

openstack token issue -c id -f value > token

Un ar šo pilnvaru iesniedziet pieprasījumu pārvaldītajai Kubernetes Selectel API. k8s_id izdala 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 var piekļūt arī caur paneli.

Vistas vai olas: IaC sadalīšana
Solis 4. Pēc tam, kad ķekars ir izcepts un mums tas ir pieejams, mēs varam pievienot yaml virsū pēc garšas.

Es gribētu pievienot:

  • nosaukumvieta
  • uzglabāšanas klase
  • pod drošības politika un tā tālāk.

Uzglabāšanas klase par Selectel var ņemt no oficiālais repozitorijs.

Tā kā sākotnēji es izvēlējos kopu zonā lv-3a, tad man ir nepieciešama krātuves klase no šīs zonas.

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

Solis 5. Uzstādiet slodzes balansētāju.

Mēs daudziem izmantosim standarta nginx-ingress. Tā instalēšanai jau ir daudz instrukciju, tāpēc mēs pie tā nekavēsimies.

$ 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

Mēs gaidām, līdz tas saņems ārēju IP aptuveni 3-4 minūtes:

Vistas vai olas: IaC sadalīšana
Saņemtais ārējais IP:

Vistas vai olas: IaC sadalīšana
Solis 6. Instalējiet 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"

Atkal mēs gaidām, kad visas pākstis pacelsies.

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

Pākstis pieauga:

Vistas vai olas: IaC sadalīšana
Solis 7. Mēs saņemam GitLab marķieri.

Vispirms noskaidrojiet pieteikšanās paroli:

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

Tagad pieteiksimies un saņemsim marķieri:

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

Solis 8. Git krātuvju ievietošana pareizajā hierarhijā, izmantojot Gitlab nodrošinātāju.

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

Diemžēl terraform GitLab nodrošinātājam ir peldošs kļūda. Pēc tam konfliktējošie projekti būs manuāli jāizdzēš, lai tf.state tiktu labots. Pēc tam atkārtoti palaidiet komandu $make all

Solis 9. Mēs pārsūtām lokālās krātuves uz serveri.

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

Gatavs:

Vistas vai olas: IaC sadalīšana
Vistas vai olas: IaC sadalīšana
Vistas vai olas: IaC sadalīšana

Secinājums

Esam panākuši, ka visu varam deklaratīvi pārvaldīt no mūsu vietējās mašīnas. Tagad es vēlos pārsūtīt visus šos uzdevumus uz CI un vienkārši nospiediet pogas. Lai to izdarītu, mūsu vietējie štati (Terraforma štats) ir jāpārnes uz CI. Kā to izdarīt, ir nākamajā daļā.

Abonējiet mūsu bloglai nepalaistu garām jaunu rakstu iznākšanu!

Avots: www.habr.com

Pievieno komentāru