ما جاء أولا، الدجاجة أم البيضة؟ بداية غريبة جدًا لمقال عن البنية التحتية كرمز، أليس كذلك؟
ما هي البيضة؟
في أغلب الأحيان، تكون البنية التحتية كرمز (IaC) طريقة تعريفية لتمثيل البنية التحتية. نصف فيه الحالة التي نريد تحقيقها، بدءًا من جزء الأجهزة وانتهاءً بتكوين البرنامج. لذلك يتم استخدام IaC من أجل:
- توفير الموارد. هذه هي VMs وS3 وVPC وما إلى ذلك. الأدوات الأساسية للعمل:
Terraform иتشكيل السحابة . برامج التكوين . الأدوات الأساسية:Ansible ، الشيف، الخ.
أي كود موجود في مستودعات git. وعاجلاً أم آجلاً سيقرر قائد الفريق ضرورة ترتيب الأمور. وسوف يعيد البناء. وسوف يخلق بعض الهيكل. وسوف يرى أن هذا جيد.
ومن الجيد أيضًا أنها موجودة بالفعل
من أين أتت البيضة؟
لذلك نحن نقترب تدريجيا من السؤال الرئيسي.
أولاً، عليك أن تبدأ بمستودع يصف بنية المستودعات الأخرى، بما في ذلك أنت. وبالطبع، كجزء من GitOps، تحتاج إلى إضافة CI حتى يتم تنفيذ التغييرات تلقائيًا.
إذا لم يتم إنشاء Git بعد؟
- كيفية تخزينه في جيت؟
- كيفية تثبيت سي آي؟
- إذا قمنا أيضًا بنشر Gitlab باستخدام IaC، وحتى في Kubernetes؟
- وGitLab Runner أيضًا في Kubernetes؟
- ماذا عن Kubernetes في مزود السحابة؟
ما الذي جاء أولاً: GitLab حيث سأقوم بتحميل الكود الخاص بي، أم الكود الذي يصف نوع GitLab الذي أحتاجه؟
دجاج مع البيض
«أوياكودون 3 مع ديناصور" [SRC ]
دعونا نحاول طهي طبق باستخدام كمزود سحابي
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.
وصفة:
- احصل على MY_SELECTEL_TOKEN من اللوحة my.selectel.ru.
- قم بإنشاء مجموعة Kubernetes عن طريق نقل الرمز المميز للحساب إليها.
- احصل على KUBECONFIG من المجموعة التي تم إنشاؤها.
- قم بتثبيت GitLab على Kubernetes.
- احصل على رمز GitLab من GitLab الذي تم إنشاؤه للمستخدم جذر.
- قم بإنشاء بنية مشروع في GitLab باستخدام رمز GitLab.
- ادفع الكود الموجود إلى GitLab.
- ؟
- الربح!
الخطوة 1. يمكن الحصول على الرمز المميز في القسم
الخطوة 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
الخطوة 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 من خلال اللوحة.
الخطوة 4. بعد خبز المجموعة وتمكننا من الوصول إليها، يمكننا إضافة البطاطا الحلوة فوقها حسب الرغبة.
أفضل أن أضيف:
- مساحة الاسم
- فئة التخزين
- سياسة أمان الكبسولة وما إلى ذلك.
منذ البداية قمت بتحديد مجموعة في المنطقة رو-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 دقائق تقريبًا:
تلقى IP الخارجي:
الخطوة 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...
ارتفعت القرون:
الخطوة 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)
النهاية:
اختتام
لقد حققنا أنه يمكننا إدارة كل شيء بشكل تصريحي من أجهزتنا المحلية. الآن أريد نقل كل هذه المهام إلى CI والضغط فقط على الأزرار. للقيام بذلك، نحتاج إلى نقل ولاياتنا المحلية (ولاية Terraform) إلى CI. كيفية القيام بذلك في الجزء التالي.
اشترك في موقعنا
بلوق حتى لا يفوتك صدور مقالات جديدة!
المصدر: www.habr.com