Manok o ang itlog: pagbahin sa IaC

Manok o ang itlog: pagbahin sa IaC
Unsa ang una - ang manok o ang itlog? Talagsaon nga pagsugod alang sa usa ka artikulo bahin sa Infrastructure-as-Code, dili ba?

Unsa ang itlog?

Kasagaran, ang Infrastructure-as-Code (IaC) usa ka deklaratibo nga paagi sa pagrepresentar sa imprastraktura. Niini gihulagway namon ang estado nga gusto namon nga makab-ot, sugod sa bahin sa hardware ug natapos sa pagsumpo sa software. Busa ang IaC gigamit alang sa:

  1. Pagtagana sa Kapanguhaan. Kini ang mga VM, S3, VPC, ug uban pa. Panguna nga mga himan alang sa pagtrabaho: Terraform ΠΈ CloudFormation.
  2. Pag-configure sa Software. Panguna nga mga himan: Ansible, Chef, ug uban pa.

Ang bisan unsang code naa sa git repository. Ug sa madugay o sa madali ang lider sa grupo mohukom nga sila kinahanglan nga ibutang sa kahusay. Ug siya mag-refactor. Ug maghimo kini og pipila ka istruktura. Ug iyang makita nga kini maayo.

Maayo sab kay naa na GitLab ΠΈ GitHub-provider para sa Terraform (ug kini mao ang Software Configuration). Sa ilang tabang, mahimo nimong madumala ang tibuuk nga proyekto: mga miyembro sa team, CI / CD, git-flow, ug uban pa.

Diin gikan ang itlog?

Busa anam-anam na natong giduol ang panguna nga pangutana.

Una sa tanan, kinahanglan ka magsugod sa usa ka repository nga naghulagway sa istruktura sa ubang mga repository, lakip ang imong kaugalingon. Ug siyempre, isip bahin sa GitOps, kinahanglan nimo nga idugang ang CI aron ang mga pagbag-o awtomatiko nga ipatuman.

Kung wala pa nahimo ang Git?

  1. Giunsa kini pagtipig sa Git?
  2. Unsaon pag-instalar sa CI?
  3. Kung i-deploy usab namo ang Gitlab gamit ang IaC, ug bisan sa Kubernetes?
  4. Ug ang GitLab Runner usab sa Kubernetes?
  5. Komosta ang Kubernetes sa cloud provider?

Unsa ang nag-una: ang GitLab diin akong i-upload ang akong code, o ang code nga naghulagway kung unsang klase sa GitLab ang akong kinahanglan?

Manok nga adunay itlog

Β«Oyakodon3 nga adunay dinosaur" [src]

Atong sulayan ang pagluto og putahe gamit ang cloud provider Gidumala ang Kubernetes Selectel.

TL; DR

Posible ba nga moapil sa usa ka team sa usa ka higayon?

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

Sagol:

  • Account gikan sa my.selectel.ru;
  • Token sa account;
  • Mga kahanas sa Kubernetes;
  • Kahanas sa Helm;
  • Mga kahanas sa terraform;
  • Helm chart GitLab;
  • Helm chart GitLab Runner.

Resipe:

  1. Kuhaa ang MY_SELECTEL_TOKEN gikan sa panel my.selectel.ru.
  2. Paghimo ug Kubernetes cluster pinaagi sa pagbalhin ug account token niini.
  3. Kuhaa ang KUBECONFIG gikan sa gibuhat nga cluster.
  4. I-install ang GitLab sa Kubernetes.
  5. Kuhaa ang GitLab-token gikan sa GitLab nga gihimo alang sa tiggamit gamut.
  6. Paghimo usa ka istruktura sa proyekto sa GitLab gamit ang GitLab-token.
  7. Iduso ang kasamtangan nga code sa GitLab.
  8. ???
  9. Kaayohan!

lakang 1. Ang token mahimong makuha sa seksyon Mga yawe sa API.

Manok o ang itlog: pagbahin sa IaClakang 2. Giandam namo ang among Terraform alang sa "pagluto" sa usa ka pungpong sa 2 ka node. Kung sigurado ka nga adunay ka igo nga mga kapanguhaan alang sa tanan, mahimo nimong ma-enable ang mga auto quota:

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

Pagdugang usa ka tiggamit sa proyekto:

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
}

Output:

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
}

Atong ilunsad:

$ 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

Manok o ang itlog: pagbahin sa IaC
lakang 3. Gikuha namon ang cubeconfig.

Aron ma-program ang pag-download sa KUBECONFIG, kinahanglan nimo nga makakuha usa ka token gikan sa OpenStack:

openstack token issue -c id -f value > token

Ug uban niini nga timaan paghimo usa ka hangyo sa Managed Kubernetes Selectel API. k8s_id naghatag sa terraform:

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

Ang Cupconfig mahimo usab nga ma-access pinaagi sa panel.

Manok o ang itlog: pagbahin sa IaC
lakang 4. Human maluto ang cluster ug aduna na kitay access niini, mahimo natong idugang ang yaml sa ibabaw aron makatilaw.

Mas gusto nako nga idugang:

  • namespace
  • klase sa pagtipig
  • polisiya pod sa seguridad ug uban pa.

Klase sa Pagtipig kay Selectel mahimong kuhaon gikan sa opisyal nga tipiganan.

Sukad sa sinugdan gipili nako ang usa ka cluster sa zone ru-3a, unya kinahanglan nako ang Storage Class gikan niini nga zone.

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

lakang 5. Pagbutang ug load balancer.

Among gamiton ang sumbanan alang sa kadaghanan nginx-ingress. Daghan na ang mga instruksyon sa pag-instalar niini, mao nga dili na namo kini hisgotan.

$ 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

Naghulat kami nga makadawat kini usa ka eksternal nga IP sa mga 3-4 minuto:

Manok o ang itlog: pagbahin sa IaC
Nakadawat sa gawas nga IP:

Manok o ang itlog: pagbahin sa IaC
lakang 6. I-install ang 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"

Pag-usab naghulat kami nga mobangon ang tanan nga mga pod.

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

Mibangon ang mga pod:

Manok o ang itlog: pagbahin sa IaC
lakang 7. Gidawat namo ang GitLab-token.

Una, hibal-i ang password sa pag-login:

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

Karon mag-log in kita ug makakuha usa ka token:

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

lakang 8. Pagdala sa Git repository sa husto nga hierarchy gamit ang Gitlab Provider.

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

Ikasubo, ang terraform GitLab provider adunay naglutaw bug. Unya kinahanglan nimo nga papason ang nagkasumpaki nga mga proyekto sa mano-mano aron ma-ayo ang tf.state. Dayon ipadagan pag-usab ang sugo nga `$make all`

lakang 9. Gibalhin namon ang mga lokal nga repositoryo sa 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)

Nahuman:

Manok o ang itlog: pagbahin sa IaC
Manok o ang itlog: pagbahin sa IaC
Manok o ang itlog: pagbahin sa IaC

konklusyon

Nakab-ot namon nga mahimo namon madumala ang tanan nga deklaratibo gikan sa among lokal nga makina. Karon gusto nako nga ibalhin ang tanan niini nga mga buluhaton sa CI ug ipadayon lang ang mga buton. Aron mahimo kini, kinahanglan natong ibalhin ang atong lokal nga estado (estado sa Terraform) ngadto sa CI. Kon unsaon pagbuhat niini anaa sa sunod nga bahin.

Subscribe sa among blogaron dili masipyat sa pagpagawas sa bag-ong mga artikulo!

Source: www.habr.com

Idugang sa usa ka comment