
پہلے کیا آیا - مرغی یا انڈا؟ بنیادی ڈھانچے کے طور پر کوڈ کے بارے میں ایک مضمون کے لئے ایک بہت ہی عجیب آغاز، ہے نا؟
انڈا کیا ہے؟
اکثر، بنیادی ڈھانچے کے طور پر کوڈ (IaC) بنیادی ڈھانچے کی نمائندگی کرنے کا ایک اعلانیہ طریقہ ہے۔ اس میں ہم اس حالت کو بیان کرتے ہیں جسے ہم حاصل کرنا چاہتے ہیں، ہارڈ ویئر کے حصے سے شروع ہو کر سافٹ ویئر کنفیگریشن کے ساتھ ختم ہوتا ہے۔ لہذا IaC استعمال کیا جاتا ہے:
- وسائل کی فراہمی۔ یہ VMs، S3، VPC وغیرہ ہیں۔ کام کے لیے بنیادی اوزار: и .
- . بنیادی اوزار: ، شیف، وغیرہ
کوئی بھی کوڈ گٹ ریپوزٹری میں ہوتا ہے۔ اور جلد یا بدیر ٹیم لیڈر فیصلہ کرے گا کہ انہیں ترتیب دینے کی ضرورت ہے۔ اور وہ ری ایکٹر کرے گا۔ اور یہ کچھ ڈھانچہ بنائے گا۔ اور وہ دیکھے گا کہ یہ اچھا ہے۔
یہ بھی اچھا ہے کہ یہ پہلے سے موجود ہے۔ и Terraform کے لیے فراہم کنندہ (اور یہ سافٹ ویئر کنفیگریشن ہے)۔ ان کی مدد سے، آپ پورے پروجیکٹ کا انتظام کر سکتے ہیں: ٹیم کے اراکین، CI/CD، git-flow، وغیرہ۔
انڈا کہاں سے آیا؟
تو ہم آہستہ آہستہ اصل سوال کے قریب پہنچ رہے ہیں۔
سب سے پہلے، آپ کو ایک ریپوزٹری کے ساتھ شروع کرنے کی ضرورت ہے جو آپ سمیت دیگر ریپوزٹریوں کی ساخت کو بیان کرتی ہے۔ اور یقینا، GitOps کے حصے کے طور پر، آپ کو CI شامل کرنے کی ضرورت ہے تاکہ تبدیلیاں خود بخود عمل میں آجائیں۔
اگر گٹ ابھی تک نہیں بنایا گیا ہے؟
- اسے Git میں کیسے اسٹور کیا جائے؟
- سی آئی کو کیسے انسٹال کریں؟
- اگر ہم IaC کا استعمال کرتے ہوئے Gitlab کو بھی تعینات کرتے ہیں، اور یہاں تک کہ Kubernetes میں؟
- اور گٹ لیب رنر بھی کبرنیٹس میں؟
- کلاؤڈ فراہم کنندہ میں کبرنیٹس کے بارے میں کیا خیال ہے؟
سب سے پہلے کیا آیا: GitLab جہاں میں اپنا کوڈ اپ لوڈ کروں گا، یا وہ کوڈ جو یہ بتاتا ہے کہ مجھے کس قسم کی GitLab کی ضرورت ہے؟
انڈوں کے ساتھ چکن
«3 ایک ڈایناسور کے ساتھ" []
آئیے کلاؤڈ فراہم کنندہ کے طور پر استعمال کرتے ہوئے ڈش پکانے کی کوشش کریں۔ .
TL؛ ڈاکٹر
کیا ایک ہی وقت میں ایک ٹیم میں شامل ہونا ممکن ہے؟
$ export MY_SELECTEL_TOKEN=<token>
$ curl https://gitlab.com/chicken-or-egg/mks/make/-/snippets/2002106/raw | bashاجزاء:
- my.selectel.ru سے اکاؤنٹ؛
- اکاؤنٹ ٹوکن؛
- Kubernetes کی مہارت؛
- ہیلم کی مہارت؛
- ٹیرافارم کی مہارت؛
- ہیلم چارٹ GitLab؛
- ہیلم چارٹ گٹ لیب رنر۔
ہدایت:
- پینل سے MY_SELECTEL_TOKEN حاصل کریں۔ my.selectel.ru.
- اس میں ایک اکاؤنٹ ٹوکن منتقل کر کے Kubernetes کلسٹر بنائیں۔
- بنائے گئے کلسٹر سے KUBECONFIG حاصل کریں۔
- Kubernetes پر GitLab انسٹال کریں۔
- صارف کے لیے بنائے گئے GitLab سے GitLab ٹوکن حاصل کریں۔ جڑ.
- GitLab-token کا استعمال کرتے ہوئے GitLab میں پروجیکٹ ڈھانچہ بنائیں۔
- موجودہ کوڈ کو GitLab پر پش کریں۔
- ؟
- منافع!
1 مرحلہ. ٹوکن سیکشن میں حاصل کیا جا سکتا ہے۔ .
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 
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.yamlCupconfig تک پینل کے ذریعے بھی رسائی حاصل کی جا سکتی ہے۔

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: true5 مرحلہ. لوڈ بیلنسر انسٹال کریں۔
ہم بہت سے لوگوں کے لیے معیاری استعمال کریں گے۔ 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 موصول ہونے کا انتظار کرتے ہیں:

خارجی IP موصول ہوا:

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...پھلیاں اٹھیں:

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.io8 مرحلہ. 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)ہو گیا:


حاصل يہ ہوا
ہم نے یہ حاصل کیا ہے کہ ہم اپنی مقامی مشین سے ہر چیز کو اعلانیہ طور پر منظم کر سکتے ہیں۔ اب میں ان تمام کاموں کو CI کو منتقل کرنا چاہتا ہوں اور صرف بٹن دبانا چاہتا ہوں۔ ایسا کرنے کے لیے، ہمیں اپنی مقامی ریاستوں (ٹیرافارم اسٹیٹ) کو CI میں منتقل کرنے کی ضرورت ہے۔ یہ کیسے کرنا ہے اگلے حصے میں ہے۔
ہمارے سبسکرائب کریں۔ تاکہ نئے مضامین کی رہائی سے محروم نہ رہیں!
ماخذ: www.habr.com
