چکن یا انڈا: IaC کو تقسیم کرنا

چکن یا انڈا: IaC کو تقسیم کرنا
پہلے کیا آیا - مرغی یا انڈا؟ بنیادی ڈھانچے کے طور پر کوڈ کے بارے میں ایک مضمون کے لئے ایک بہت ہی عجیب آغاز، ہے نا؟

انڈا کیا ہے؟

اکثر، بنیادی ڈھانچے کے طور پر کوڈ (IaC) بنیادی ڈھانچے کی نمائندگی کرنے کا ایک اعلانیہ طریقہ ہے۔ اس میں ہم اس حالت کو بیان کرتے ہیں جسے ہم حاصل کرنا چاہتے ہیں، ہارڈ ویئر کے حصے سے شروع ہو کر سافٹ ویئر کنفیگریشن کے ساتھ ختم ہوتا ہے۔ لہذا IaC استعمال کیا جاتا ہے:

  1. وسائل کی فراہمی۔ یہ VMs، S3، VPC وغیرہ ہیں۔ کام کے لیے بنیادی اوزار: ٹرافیفار и کلاؤڈ فارمیشن.
  2. سافٹ ویئر کی تشکیل. بنیادی اوزار: ناممکن، شیف، وغیرہ

کوئی بھی کوڈ گٹ ریپوزٹری میں ہوتا ہے۔ اور جلد یا بدیر ٹیم لیڈر فیصلہ کرے گا کہ انہیں ترتیب دینے کی ضرورت ہے۔ اور وہ ری ایکٹر کرے گا۔ اور یہ کچھ ڈھانچہ بنائے گا۔ اور وہ دیکھے گا کہ یہ اچھا ہے۔

یہ بھی اچھا ہے کہ یہ پہلے سے موجود ہے۔ GitLab и GitHub کےTerraform کے لیے فراہم کنندہ (اور یہ سافٹ ویئر کنفیگریشن ہے)۔ ان کی مدد سے، آپ پورے پروجیکٹ کا انتظام کر سکتے ہیں: ٹیم کے اراکین، CI/CD، git-flow، وغیرہ۔

انڈا کہاں سے آیا؟

تو ہم آہستہ آہستہ اصل سوال کے قریب پہنچ رہے ہیں۔

سب سے پہلے، آپ کو ایک ریپوزٹری کے ساتھ شروع کرنے کی ضرورت ہے جو آپ سمیت دیگر ریپوزٹریوں کی ساخت کو بیان کرتی ہے۔ اور یقینا، GitOps کے حصے کے طور پر، آپ کو CI شامل کرنے کی ضرورت ہے تاکہ تبدیلیاں خود بخود عمل میں آجائیں۔

اگر گٹ ابھی تک نہیں بنایا گیا ہے؟

  1. اسے Git میں کیسے اسٹور کیا جائے؟
  2. سی آئی کو کیسے انسٹال کریں؟
  3. اگر ہم IaC کا استعمال کرتے ہوئے Gitlab کو بھی تعینات کرتے ہیں، اور یہاں تک کہ Kubernetes میں؟
  4. اور گٹ لیب رنر بھی کبرنیٹس میں؟
  5. کلاؤڈ فراہم کنندہ میں کبرنیٹس کے بارے میں کیا خیال ہے؟

سب سے پہلے کیا آیا: GitLab جہاں میں اپنا کوڈ اپ لوڈ کروں گا، یا وہ کوڈ جو یہ بتاتا ہے کہ مجھے کس قسم کی GitLab کی ضرورت ہے؟

انڈوں کے ساتھ چکن

«اویاکوڈن3 ایک ڈایناسور کے ساتھ" [ایسآرسی]

آئیے کلاؤڈ فراہم کنندہ کے طور پر استعمال کرتے ہوئے ڈش پکانے کی کوشش کریں۔ 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 کی مہارت؛
  • ہیلم کی مہارت؛
  • ٹیرافارم کی مہارت؛
  • ہیلم چارٹ GitLab؛
  • ہیلم چارٹ گٹ لیب رنر۔

ہدایت:

  1. پینل سے MY_SELECTEL_TOKEN حاصل کریں۔ my.selectel.ru.
  2. اس میں ایک اکاؤنٹ ٹوکن منتقل کر کے Kubernetes کلسٹر بنائیں۔
  3. بنائے گئے کلسٹر سے KUBECONFIG حاصل کریں۔
  4. Kubernetes پر GitLab انسٹال کریں۔
  5. صارف کے لیے بنائے گئے GitLab سے GitLab ٹوکن حاصل کریں۔ جڑ.
  6. GitLab-token کا استعمال کرتے ہوئے GitLab میں پروجیکٹ ڈھانچہ بنائیں۔
  7. موجودہ کوڈ کو GitLab پر پش کریں۔
  8. ؟
  9. منافع!

1 مرحلہ. ٹوکن سیکشن میں حاصل کیا جا سکتا ہے۔ API کیز.

چکن یا انڈا: IaC کو تقسیم کرنا2 مرحلہ. ہم اپنے ٹیرافارم کو 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

اور اس ٹوکن کے ساتھ Managed Kubernetes Selectel 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 مرحلہ. جب کلسٹر بیک ہو جائے اور ہمیں اس تک رسائی حاصل ہو جائے تو ہم ذائقہ کے لیے اوپر یامل ڈال سکتے ہیں۔

میں شامل کرنے کو ترجیح دیتا ہوں:

  • نام کی جگہ
  • اسٹوریج کلاس
  • پوڈ سیکورٹی پالیسی اور اسی طرح.

اسٹوریج کلاس سلیکٹل کے لیے سے لیا جا سکتا ہے۔ سرکاری ذخیرہ.

چونکہ ابتدائی طور پر میں نے زون میں ایک کلسٹر منتخب کیا تھا۔ 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

ہم اسے تقریباً 3-4 منٹ تک بیرونی IP موصول ہونے کا انتظار کرتے ہیں:

چکن یا انڈا: 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 مرحلہ. 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 کو منتقل کرنا چاہتا ہوں اور صرف بٹن دبانا چاہتا ہوں۔ ایسا کرنے کے لیے، ہمیں اپنی مقامی ریاستوں (ٹیرافارم اسٹیٹ) کو CI میں منتقل کرنے کی ضرورت ہے۔ یہ کیسے کرنا ہے اگلے حصے میں ہے۔

ہمارے سبسکرائب کریں۔ بلاگتاکہ نئے مضامین کی رہائی سے محروم نہ رہیں!

ماخذ: www.habr.com

نیا تبصرہ شامل کریں