الدجاجة أو البيضة: تقسيم IaC

الدجاجة أو البيضة: تقسيم IaC
ما جاء أولا، الدجاجة أم البيضة؟ بداية غريبة جدًا لمقال عن البنية التحتية كرمز، أليس كذلك؟

ما هي البيضة؟

في أغلب الأحيان، تكون البنية التحتية كرمز (IaC) طريقة تعريفية لتمثيل البنية التحتية. نصف فيه الحالة التي نريد تحقيقها، بدءًا من جزء الأجهزة وانتهاءً بتكوين البرنامج. لذلك يتم استخدام IaC من أجل:

  1. توفير الموارد. هذه هي VMs وS3 وVPC وما إلى ذلك. الأدوات الأساسية للعمل: Terraform и تشكيل السحابة.
  2. برامج التكوين. الأدوات الأساسية: Ansible، الشيف، الخ.

أي كود موجود في مستودعات git. وعاجلاً أم آجلاً سيقرر قائد الفريق ضرورة ترتيب الأمور. وسوف يعيد البناء. وسوف يخلق بعض الهيكل. وسوف يرى أن هذا جيد.

ومن الجيد أيضًا أنها موجودة بالفعل GitLab и GitHub جيثب:-موفر Terraform (وهذا هو تكوين البرنامج). بمساعدتهم، يمكنك إدارة المشروع بأكمله: أعضاء الفريق، CI/CD، git-flow، وما إلى ذلك.

من أين أتت البيضة؟

لذلك نحن نقترب تدريجيا من السؤال الرئيسي.

أولاً، عليك أن تبدأ بمستودع يصف بنية المستودعات الأخرى، بما في ذلك أنت. وبالطبع، كجزء من GitOps، تحتاج إلى إضافة CI حتى يتم تنفيذ التغييرات تلقائيًا.

إذا لم يتم إنشاء Git بعد؟

  1. كيفية تخزينه في جيت؟
  2. كيفية تثبيت سي آي؟
  3. إذا قمنا أيضًا بنشر Gitlab باستخدام IaC، وحتى في Kubernetes؟
  4. وGitLab Runner أيضًا في Kubernetes؟
  5. ماذا عن Kubernetes في مزود السحابة؟

ما الذي جاء أولاً: GitLab حيث سأقوم بتحميل الكود الخاص بي، أم الكود الذي يصف نوع GitLab الذي أحتاجه؟

دجاج مع البيض

«أوياكودون3 مع ديناصور" [SRC]

دعونا نحاول طهي طبق باستخدام كمزود سحابي إدارة Kubernetes Selectel.

TL؛ DR

هل من الممكن الانضمام لفريق واحد في وقت واحد؟

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

المقادير:

  • حساب من my.selectel.ru؛
  • رمز الحساب؛
  • مهارات كوبيرنيت.
  • مهارات القيادة؛
  • مهارات التضاريس؛
  • مخطط الخوذة GitLab؛
  • مخطط رأس GitLab Runner.

وصفة:

  1. احصل على MY_SELECTEL_TOKEN من اللوحة my.selectel.ru.
  2. قم بإنشاء مجموعة Kubernetes عن طريق نقل الرمز المميز للحساب إليها.
  3. احصل على KUBECONFIG من المجموعة التي تم إنشاؤها.
  4. قم بتثبيت GitLab على Kubernetes.
  5. احصل على رمز GitLab من GitLab الذي تم إنشاؤه للمستخدم جذر.
  6. قم بإنشاء بنية مشروع في GitLab باستخدام رمز GitLab.
  7. ادفع الكود الموجود إلى GitLab.
  8. ؟
  9. الربح!

الخطوة 1. يمكن الحصول على الرمز المميز في القسم مفاتيح واجهة برمجة التطبيقات.

الدجاجة أو البيضة: تقسيم IaCالخطوة 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

وباستخدام هذا الرمز المميز، يمكنك تقديم طلب إلى Managed Kubernetes Selectel 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 يمكن أن تؤخذ من المستودع الرسمي.

منذ البداية قمت بتحديد مجموعة في المنطقة رو-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. قم بتثبيت جيتلاب.

$ 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. إحضار مستودعات Git إلى التسلسل الهرمي الصحيح باستخدام موفر 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

إضافة تعليق