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



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



ما هي البيضة؟



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



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


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



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



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



لذلك نأتي تدريجياً إلى السؤال الرئيسي.



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



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



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


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


دجاج بالبيض



" ديناصور Oyakodon 3 » [ src ]



دعنا نحاول طهي طبق باستخدام Managed 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 ؛
  • رمز من الحساب ؛
  • مهارات Kubernetes.
  • مهارات خوذة.
  • مهارات Terraform
  • مخطط Helm GitLab ؛
  • مخطط Helm GitLab Runner.


وصفة:



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


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



الخطوة الثانية . نقوم بإعداد Terraform لخبز مجموعة مكونة من عقدتين. إذا كنت متأكدًا من أن لديك موارد كافية للجميع ، فيمكنك تمكين autoquotas:



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 . نحصل على Cubconfig.



لتنزيل 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


يمكن أيضًا الحصول على Cubconfig من خلال اللوحة.





الخطوة 4 . بعد خبز الكتلة والوصول إليها ، يمكننا إضافة yaml في الأعلى حسب رغبتنا.



أفضل أن أضيف:



  • مساحة الاسم
  • فئة التخزين ،
  • سياسة أمان pod والمزيد.


يمكن الحصول على فئة التخزين لـ 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


الخطوة الخامسة . نقوم بتثبيت موازن التحميل.



سنستخدم 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


نحن ننتظر وصوله إلى IP خارجي لمدة 3-4 دقائق:





عنوان 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.



أولاً ، نكتشف كلمة المرور للدخول:



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



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


لسوء الحظ ، يعاني موفر GitLab من Terraform من خلل عائم . ثم يتعين عليك إزالة المشاريع المتضاربة يدويًا حتى يتم إصلاح 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 والضغط فقط على الأزرار. للقيام بذلك ، نحتاج إلى تمرير ولاياتنا المحلية (ولاية Terraform) إلى CI. كيف تفعل هذا في الجزء التالي.



اشترك في مدونتنا حتى لا تفوت أي مقالات جديدة!



All Articles