ڪڪڙ يا انڊا: ورهائڻ IaC

ڪڪڙ يا انڊا: ورهائڻ IaC
پهرين ڇا آيو - ڪڪڙ يا انڊا؟ انفراسٹرڪچر-جي-ڪوڊ بابت هڪ مضمون لاءِ ڪافي هڪ عجيب شروعات آهي، ڇا اهو ناهي؟

هڪ انجڻ ڇا آهي؟

گهڻو ڪري، انفراسٽرڪچر-جي-ڪوڊ (IaC) بنيادي ڍانچي جي نمائندگي ڪرڻ جو هڪ بياني طريقو آهي. ان ۾ اسان رياست کي بيان ڪريون ٿا جيڪو اسان حاصل ڪرڻ چاهيون ٿا، هارڊويئر جي حصي کان شروع ٿئي ٿو ۽ سافٽ ويئر جي ترتيب سان ختم ٿئي ٿو. تنهن ڪري IaC استعمال ڪيو ويندو آهي:

  1. وسيلن جي فراهمي. اهي آهن VMs، S3، VPC، وغيره. ڪم لاء بنيادي اوزار: ٽرافيف и Cloud Formation.
  2. سافٽ ويئر ترتيب نامو. بنيادي اوزار: ناھي، شيف، وغيره.

ڪو به ڪوڊ آهي git repositories ۾. ۽ جلدي يا بعد ۾ ٽيم ليڊر فيصلو ڪندو ته انهن کي ترتيب ڏيڻ جي ضرورت آهي. ۽ هو refactor ڪندو. ۽ اهو ڪجهه جوڙجڪ ٺاهيندو. ۽ هو ڏسندو ته اهو سٺو آهي.

اهو پڻ سٺو آهي ته اهو اڳ ۾ ئي موجود آهي GitLab и GitHub-ٽرافارم لاءِ مهيا ڪندڙ (۽ هي سافٽ ويئر ڪنفيگريشن آهي). انهن جي مدد سان، توهان سڄي پروجيڪٽ کي منظم ڪري سگهو ٿا: ٽيم ميمبر، CI/CD، git-flow، وغيره.

اوندهه ڪٿان آئي؟

تنهنڪري اسان آهستي آهستي بنيادي سوال ڏانهن وڌي رهيا آهيون.

سڀ کان پهريان، توهان کي هڪ مخزن سان شروع ڪرڻ جي ضرورت آهي جيڪا ٻين مخزن جي جوڙجڪ کي بيان ڪري ٿي، بشمول پاڻ. ۽ يقينا، GitOps جي حصي جي طور تي، توهان کي CI شامل ڪرڻ جي ضرورت آهي ته جيئن تبديليون خودڪار طور تي عمل ڪيو وڃي.

جيڪڏهن Git اڃا پيدا نه ڪيو ويو آهي؟

  1. Git ۾ ڪيئن ذخيرو ڪجي؟
  2. CI کي ڪيئن انسٽال ڪجي؟
  3. جيڪڏهن اسان IaC استعمال ڪندي Gitlab کي به ترتيب ڏيون، ۽ ڪبرنيٽس ۾ به؟
  4. ۽ GitLab رنر پڻ ڪبرنيٽس ۾؟
  5. ڪلائوڊ فراهم ڪندڙ ۾ ڪبرنيٽس بابت ڇا؟

پهرين ڇا آيو: GitLab جتي مان پنهنجو ڪوڊ اپ لوڊ ڪندس، يا اهو ڪوڊ جيڪو بيان ڪري ٿو ته مون کي ڪهڙي قسم جي GitLab جي ضرورت آهي؟

انڊيءَ سان ڪڪڙ

«اوياڪوڊون3 هڪ ڊائناسور سان" [src]

اچو ته ڪلائوڊ فراهم ڪندڙ جي طور تي استعمال ڪندي ڊش ٺاهڻ جي ڪوشش ڪريون منظم ڪيل Kubernetes Selectel.

TL، ڊاڪٽر

ڇا اهو ممڪن آهي ته هڪ ڀيرو هڪ ٽيم ۾ شامل ٿيڻ؟

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

مادي

  • اڪائونٽ my.selectel.ru کان؛
  • اڪائونٽ ٽوڪن؛
  • Kubernetes صلاحيتن؛
  • هيلم مهارت؛
  • Terraform صلاحيتن؛
  • هيلم چارٽ GitLab؛
  • هيلم چارٽ GitLab رنر.

ہدايت

  1. حاصل ڪريو MY_SELECTEL_TOKEN پينل مان my.selectel.ru.
  2. ان تي هڪ اڪائونٽ ٽوڪن منتقل ڪندي ڪبرنيٽس ڪلستر ٺاهيو.
  3. حاصل ڪريو KUBECONFIG ٺاهيل ڪلستر مان.
  4. Kubernetes تي GitLab انسٽال ڪريو.
  5. صارف لاءِ ٺاهيل GitLab مان GitLab-ٽوڪن حاصل ڪريو پاڙ.
  6. GitLab-token استعمال ڪندي GitLab ۾ پروجيڪٽ جو ڍانچو ٺاهيو.
  7. موجوده ڪوڊ کي دٻايو GitLab ڏانهن.
  8. ؟؟؟
  9. منافعو!

قدم 1. ٽوڪن سيڪشن ۾ حاصل ڪري سگھجي ٿو API ڪنجيون.

ڪڪڙ يا انڊا: ورهائڻ IaCقدم 2. اسان 2 نوڊس جو ڪلستر ”بيڪنگ“ لاءِ اسان جو Terraform تيار ڪريون ٿا. جيڪڏهن توهان کي پڪ آهي ته توهان وٽ هر شي لاءِ ڪافي وسيلا آهن، ته پوءِ توهان خودڪار ڪوٽا فعال ڪري سگهو ٿا:

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. اسان حاصل ڪيو cubeconfig.

پروگرام طور تي ڊائون لوڊ ڪرڻ لاءِ KUBECONFIG، توهان کي OpenStack مان هڪ ٽوڪن حاصل ڪرڻ جي ضرورت آهي:

openstack token issue -c id -f value > token

۽ هن ٽوڪن سان منظم ڪبرنيٽس سليڪٽيل API کي درخواست ڏيو. k8s_id ڏئي ٿو ٽريفڪ:

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- داخل ٿيڻ. ان کي انسٽال ڪرڻ لاءِ اڳ ۾ ئي ڪافي ھدايتون موجود آھن، تنھنڪري اسان ان تي نه رھنداسين.

$ 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

اسان ان جو انتظار ڪريون ٿا ان لاءِ هڪ خارجي IP حاصل ڪرڻ لاءِ اٽڪل 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-token.

پهرين، لاگ ان پاسورڊ ڳولهيو:

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. Git repositories کي Gitlab فراهم ڪندڙ کي استعمال ڪندي صحيح درجي تي آڻڻ.

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

بدقسمتي سان، terraform GitLab فراهم ڪندڙ هڪ سچل آهي بگ. پوءِ توهان کي 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 رياست) CI ڏانهن. اهو ڪيئن ڪجي ايندڙ حصي ۾.

اسان جي رڪنيت حاصل ڪريو بلاگجيئن ته نئين مضمونن جي ڇڏڻ کي نه وڃايو!

جو ذريعو: www.habr.com

تبصرو شامل ڪريو