கோழி அல்லது முட்டை: பிரித்தல் IaC

கோழி அல்லது முட்டை: பிரித்தல் IaC
முதலில் வந்தது - கோழியா அல்லது முட்டையா? உள்கட்டமைப்பு-குறியீடு பற்றிய கட்டுரைக்கு மிகவும் வித்தியாசமான தொடக்கம், இல்லையா?

முட்டை என்றால் என்ன?

பெரும்பாலும், Infrastructure-as-Code (IaC) என்பது உள்கட்டமைப்பைக் குறிக்கும் ஒரு அறிவிப்பு வழி. இதில் நாம் அடைய விரும்பும் நிலையை விவரிக்கிறோம், வன்பொருள் பகுதியிலிருந்து தொடங்கி மென்பொருள் உள்ளமைவுடன் முடிவடையும். எனவே IaC இதற்குப் பயன்படுத்தப்படுகிறது:

  1. வள வழங்கல். இவை VMகள், S3, VPC போன்றவை. வேலைக்கான அடிப்படை கருவிகள்: Terraform и கிளவுட் ஃபார்மேஷன்.
  2. மென்பொருள் கட்டமைப்பு. அடிப்படை கருவிகள்: Ansible, சமையல்காரர், முதலியன

எந்த குறியீடும் git களஞ்சியங்களில் உள்ளது. விரைவில் அல்லது பின்னர் அணித் தலைவர் அவர்கள் ஒழுங்காக வைக்கப்பட வேண்டும் என்று முடிவு செய்வார். மேலும் அவர் மறுபரிசீலனை செய்வார். மேலும் இது சில கட்டமைப்பை உருவாக்கும். இது நல்லது என்று அவர் பார்ப்பார்.

அது ஏற்கனவே இருப்பது நல்லது GitLab и மகிழ்ச்சியாடெர்ராஃபார்ம் வழங்குபவர் (இது மென்பொருள் உள்ளமைவு). அவர்களின் உதவியுடன், நீங்கள் முழு திட்டத்தையும் நிர்வகிக்கலாம்: குழு உறுப்பினர்கள், CI/CD, git-flow போன்றவை.

முட்டை எங்கிருந்து வந்தது?

எனவே நாம் படிப்படியாக முக்கிய கேள்வியை அணுகுகிறோம்.

முதலில், நீங்கள் உட்பட மற்ற களஞ்சியங்களின் கட்டமைப்பை விவரிக்கும் ஒரு களஞ்சியத்துடன் தொடங்க வேண்டும். நிச்சயமாக, GitOps இன் ஒரு பகுதியாக, நீங்கள் CI ஐச் சேர்க்க வேண்டும், இதனால் மாற்றங்கள் தானாகவே செயல்படுத்தப்படும்.

Git இன்னும் உருவாக்கப்படவில்லை என்றால்?

  1. அதை எப்படி Gitல் சேமிப்பது?
  2. CI ஐ எவ்வாறு நிறுவுவது?
  3. IaC ஐப் பயன்படுத்தி, குபெர்னெட்டஸில் கூட கிட்லாப்பைப் பயன்படுத்தினால்?
  4. மற்றும் குபெர்னெட்டஸில் கிட்லாப் ரன்னர்?
  5. கிளவுட் வழங்குநரில் குபெர்னெட்ஸ் பற்றி என்ன?

முதலில் வந்தது: எனது குறியீட்டைப் பதிவேற்றும் GitLab அல்லது எனக்கு எந்த வகையான GitLab தேவை என்பதை விவரிக்கும் குறியீடு?

முட்டையுடன் கோழி

«ஓயகோடோன்3 டைனோசருடன்" [மூல]

கிளவுட் வழங்குநராகப் பயன்படுத்தி ஒரு உணவை சமைக்க முயற்சிப்போம் Kubernetes Selectel நிர்வகிக்கப்படுகிறது.

டிஎல்; DR

ஒரே நேரத்தில் ஒரு அணியில் சேர முடியுமா?

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

பொருட்கள்:

  • my.selectel.ru இலிருந்து கணக்கு;
  • கணக்கு டோக்கன்;
  • குபெர்னெட்ஸ் திறன்கள்;
  • ஹெல்ம் திறன்கள்;
  • டெர்ராஃபார்ம் திறன்கள்;
  • ஹெல்ம் விளக்கப்படம் GitLab;
  • ஹெல்ம் விளக்கப்படம் GitLab ரன்னர்.

செய்முறையை:

  1. பேனலில் இருந்து MY_SELECTEL_TOKEN ஐப் பெறவும் my.selectel.ru.
  2. கணக்கு டோக்கனை மாற்றுவதன் மூலம் குபெர்னெட்ஸ் கிளஸ்டரை உருவாக்கவும்.
  3. உருவாக்கப்பட்ட கிளஸ்டரிலிருந்து KUBECONFIG ஐப் பெறவும்.
  4. குபெர்னெட்டஸில் GitLab ஐ நிறுவவும்.
  5. பயனருக்காக உருவாக்கப்பட்ட GitLab இலிருந்து GitLab-டோக்கனைப் பெறவும் ரூட்.
  6. GitLab-டோக்கனைப் பயன்படுத்தி GitLab இல் திட்ட கட்டமைப்பை உருவாக்கவும்.
  7. ஏற்கனவே உள்ள குறியீட்டை GitLab க்கு அழுத்தவும்.
  8. ???
  9. லாபம்!

1 விலக. பிரிவில் டோக்கனைப் பெறலாம் API விசைகள்.

கோழி அல்லது முட்டை: பிரித்தல் IaC2 விலக. 2 முனைகள் கொண்ட ஒரு கிளஸ்டரை "பேக்கிங்" செய்ய நாங்கள் எங்கள் டெர்ராஃபார்மை தயார் செய்கிறோம். எல்லாவற்றிற்கும் போதுமான ஆதாரங்கள் உங்களிடம் உள்ளன என்று நீங்கள் உறுதியாக நம்பினால், நீங்கள் தானியங்கு ஒதுக்கீட்டை இயக்கலாம்:

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

திட்டத்தில் பயனரைச் சேர்க்கவும்:

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

தொடங்குவோம்:

$ 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

கோழி அல்லது முட்டை: பிரித்தல் IaC
3 விலக. நாங்கள் க்யூப் கான்ஃபிக் பெறுகிறோம்.

நிரல் முறையில் KUBECONFIG ஐப் பதிவிறக்க, நீங்கள் OpenStack இலிருந்து ஒரு டோக்கனைப் பெற வேண்டும்:

openstack token issue -c id -f value > token

இந்த டோக்கன் மூலம் நிர்வகிக்கப்படும் குபெர்னெட்ஸ் செலக்டெல் API க்கு கோரிக்கை விடுங்கள். k8s_id பிரச்சினைகள் 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 ஐ பேனல் மூலமாகவும் அணுகலாம்.

கோழி அல்லது முட்டை: பிரித்தல் IaC
4 விலக. கொத்து சுடப்பட்ட பிறகு, நமக்கு அணுகல் கிடைத்ததும், சுவைக்கு மேல் யாழ் சேர்க்கலாம்.

நான் சேர்க்க விரும்புகிறேன்:

  • பெயர்வெளி
  • சேமிப்பு வகுப்பு
  • நெற்று பாதுகாப்பு கொள்கை மற்றும் பல.

சேமிப்பு வகுப்பு Selectel இலிருந்து எடுக்கப்படலாம் அதிகாரப்பூர்வ களஞ்சியம்.

ஆரம்பத்தில் இருந்து நான் மண்டலத்தில் ஒரு கிளஸ்டரைத் தேர்ந்தெடுத்தேன் ru-3a, இந்த மண்டலத்திலிருந்து எனக்கு சேமிப்பக வகுப்பு தேவை.

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

5 விலக. சுமை சமநிலையை நிறுவவும்.

பலருக்கு தரமான ஒன்றைப் பயன்படுத்துவோம் nginx-ingress. அதை நிறுவுவதற்கு ஏற்கனவே ஏராளமான வழிமுறைகள் உள்ளன, எனவே நாங்கள் அதில் வசிக்க மாட்டோம்.

$ 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

3-4 நிமிடங்கள் வெளிப்புற ஐபியைப் பெறுவதற்கு நாங்கள் காத்திருக்கிறோம்:

கோழி அல்லது முட்டை: பிரித்தல் IaC
பெறப்பட்ட வெளிப்புற IP:

கோழி அல்லது முட்டை: பிரித்தல் IaC
6 விலக. 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"

மீண்டும் அனைத்து காய்களும் எழும்ப காத்திருக்கிறோம்.

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

காய்கள் உயர்ந்தன:

கோழி அல்லது முட்டை: பிரித்தல் IaC
7 விலக. நாங்கள் GitLab-டோக்கனைப் பெறுகிறோம்.

முதலில், உள்நுழைவு கடவுச்சொல்லைக் கண்டறியவும்:

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

இப்போது உள்நுழைந்து டோக்கனைப் பெறுவோம்:

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

8 விலக. Gitlab வழங்குநரைப் பயன்படுத்தி Git களஞ்சியங்களை சரியான படிநிலைக்கு கொண்டு வருதல்.

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

துரதிர்ஷ்டவசமாக, டெராஃபார்ம் கிட்லேப் வழங்குநரிடம் மிதக்கும் வசதி உள்ளது பிழை. tf.state ஐ சரிசெய்ய, முரண்பட்ட திட்டங்களை கைமுறையாக நீக்க வேண்டும். பிறகு `$make all` கட்டளையை மீண்டும் இயக்கவும்

9 விலக. உள்ளூர் களஞ்சியங்களை நாங்கள் சேவையகத்திற்கு மாற்றுகிறோம்.

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

பினிஷ்:

கோழி அல்லது முட்டை: பிரித்தல் IaC
கோழி அல்லது முட்டை: பிரித்தல் IaC
கோழி அல்லது முட்டை: பிரித்தல் IaC

முடிவுக்கு

எங்களின் உள்ளூர் இயந்திரத்தில் இருந்து அனைத்தையும் பிரகடனமாக நிர்வகிக்க முடியும் என்பதை நாங்கள் அடைந்துள்ளோம். இப்போது நான் இந்த எல்லா பணிகளையும் CI க்கு மாற்ற விரும்புகிறேன் மற்றும் பொத்தான்களை அழுத்தவும். இதைச் செய்ய, நமது உள்ளூர் மாநிலங்களை (Terraform state) CIக்கு மாற்ற வேண்டும். இதை எப்படி செய்வது என்பது அடுத்த பகுதியில்.

எங்கள் குழுசேர் வலைப்பதிவுபுதிய கட்டுரைகளை வெளியிடுவதைத் தவறவிடாமல் இருக்க!

ஆதாரம்: www.habr.com

கருத்தைச் சேர்