Kokido aŭ la ovo: fendi IaC

Kokido aŭ la ovo: fendi IaC
Kio unue venis - la kokido aŭ la ovo? Sufiĉe stranga komenco por artikolo pri Infrastructure-as-Code, ĉu ne?

Kio estas ovo?

Plej ofte, Infrastructure-as-Code (IaC) estas deklara maniero reprezenti infrastrukturon. En ĝi ni priskribas la staton, kiun ni volas atingi, komencante de la aparataro kaj finante per la programara agordo. Tial IaC estas uzata por:

  1. Provizo de Rimedo. Ĉi tiuj estas VMs, S3, VPC, ktp. Bazaj iloj por laboro: Terraform и CloudFormation.
  2. Programara Agordo. Bazaj iloj: Respondema, Kuiristo, ktp.

Ajna kodo estas en git-deponejoj. Kaj pli aŭ malpli frue la teamestro decidos, ke oni devas ordigi ilin. Kaj li refaktorigos. Kaj ĝi kreos iun strukturon. Kaj li vidos, ke tio estas bona.

Ankaŭ estas bone, ke ĝi jam ekzistas GitLab и GitHub-provizanto por Terraform (kaj ĉi tio estas Programaro-Agordo). Kun ilia helpo, vi povas administri la tutan projekton: teamanoj, CI/CD, git-flow, ktp.

De kie venis la ovo?

Do ni iom post iom alproksimiĝas al la ĉefa demando.

Antaŭ ĉio, vi devas komenci per deponejo, kiu priskribas la strukturon de aliaj deponejoj, inkluzive de vi mem. Kaj kompreneble, kiel parto de GitOps, vi devas aldoni CI por ke ŝanĝoj efektiviĝu aŭtomate.

Se Git ankoraŭ ne estas kreita?

  1. Kiel konservi ĝin en Git?
  2. Kiel instali CI?
  3. Se ni ankaŭ deplojos Gitlab uzante IaC, kaj eĉ en Kubernetes?
  4. Kaj GitLab Runner ankaŭ en Kubernetes?
  5. Kio pri Kubernetes en la nuba provizanto?

Kio unue venis: la GitLab, kie mi alŝutos mian kodon, aŭ la kodon, kiu priskribas kian GitLab mi bezonas?

Kokido kun ovoj

«Oyakodon3 kun dinosaŭro" [src]

Ni provu kuiri pladon uzante kiel nuba provizanto Administrita Kubernetes Selectel.

TL; DR

Ĉu eblas aliĝi al unu teamo samtempe?

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

Ingrediencoj:

  • Konto de my.selectel.ru;
  • Konto-ĵetono;
  • Kubernetes-kapabloj;
  • Helm Kapabloj;
  • Terraform Kapabloj;
  • Helm-diagramo GitLab;
  • Helm-diagramo GitLab Runner.

Recepto:

  1. Akiru MY_SELECTEL_TOKEN el panelo mia.selectel.ru.
  2. Kreu Kubernetes-grupon transdonante kontan ĵetonon al ĝi.
  3. Akiru KUBECONFIG el la kreita areto.
  4. Instalu GitLab sur Kubernetes.
  5. Akiru GitLab-tokenon de GitLab kreita por uzanto radikon.
  6. Kreu projektan strukturon en GitLab uzante GitLab-token.
  7. Puŝu ekzistantan kodon al GitLab.
  8. ???
  9. Profito!

paŝi 1. La ĵetono povas esti akirita en la sekcio API-Ŝlosiloj.

Kokido aŭ la ovo: fendi IaCpaŝi 2. Ni preparas nian Terraform por "baki" areton de 2 nodoj. Se vi certas, ke vi havas sufiĉajn rimedojn por ĉio, tiam vi povas ebligi aŭtomatajn kvotojn:

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

Aldonu uzanton al la 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
}

Eligo:

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
}

Ni lanĉu:

$ 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

Kokido aŭ la ovo: fendi IaC
paŝi 3. Ni ricevas la cubeconfig.

Por programe elŝuti KUBECONFIG, vi devas akiri ĵetonon de OpenStack:

openstack token issue -c id -f value > token

Kaj per ĉi tiu signo faru peton al la Administrita Kubernetes Selectel API. k8s_id donas 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 ankaŭ estas alirebla per la panelo.

Kokido aŭ la ovo: fendi IaC
paŝi 4. Post kiam la grapo estas bakita kaj ni havas aliron al ĝi, ni povas aldoni yaml supre por gustumi.

Mi preferas aldoni:

  • nomspaco
  • stokado klaso
  • pod sekureca politiko kaj tiel plu.

Stokado Klaso por Selectel povas esti prenita de oficiala deponejo.

Ĉar komence mi elektis areton en la zono ru-3a, tiam mi bezonas la Stokan Klason el ĉi tiu zono.

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

paŝi 5. Instalu ŝarĝbalancilon.

Ni uzos la norman por multaj nginx-ingress. Jam ekzistas multaj instrukcioj por instali ĝin, do ni ne pritraktos ĝin.

$ 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

Ni atendas ke ĝi ricevos eksteran IP dum ĉirkaŭ 3-4 minutoj:

Kokido aŭ la ovo: fendi IaC
Ricevita ekstera IP:

Kokido aŭ la ovo: fendi IaC
paŝi 6. Instalu 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"

Denove ni atendas ke ĉiuj balgoj leviĝos.

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

La balgoj leviĝis:

Kokido aŭ la ovo: fendi IaC
paŝi 7. Ni ricevas GitLab-tokenon.

Unue, malkovru la ensalutan pasvorton:

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

Nun ni ensalutu kaj ricevu ĵetonon:

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

paŝi 8. Alportante Git-deponejojn al la ĝusta hierarkio uzante la Gitlab-Provizanton.

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

Bedaŭrinde, terraform GitLab-provizanto havas flosan cimo. Tiam vi devos forigi la konfliktajn projektojn permane por ke tf.state estu riparita. Poste rerulu la komandon `$make all`

paŝi 9. Ni transdonas lokajn deponejojn al la servilo.

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

Farita:

Kokido aŭ la ovo: fendi IaC
Kokido aŭ la ovo: fendi IaC
Kokido aŭ la ovo: fendi IaC

konkludo

Ni atingis, ke ni povas administri ĉion deklara de nia loka maŝino. Nun mi volas transdoni ĉiujn ĉi tiujn taskojn al CI kaj nur premu butonojn. Por fari tion, ni devas translokigi niajn lokajn ŝtatojn (Terraform-ŝtato) al CI. Kiel fari ĉi tion estas en la sekva parto.

Abonu nian блогpor ne maltrafi la eldonon de novaj artikoloj!

fonto: www.habr.com

Aldoni komenton