مرغ یا تخم مرغ: تقسیم IaC

مرغ یا تخم مرغ: تقسیم IaC
چه چیزی اول شد - مرغ یا تخم مرغ؟ شروع بسیار عجیبی برای مقاله ای در مورد Infrastructure-as-Code است، اینطور نیست؟

تخم مرغ چیست؟

بیشتر اوقات، زیرساخت به عنوان کد (IaC) یک روش اعلامی برای نشان دادن زیرساخت است. در آن وضعیتی را که می‌خواهیم به آن دست یابیم، از بخش سخت‌افزار شروع کرده و به پیکربندی نرم‌افزار ختم می‌کنیم. بنابراین IaC برای موارد زیر استفاده می شود:

  1. تامین منابع اینها ماشین های مجازی، S3، VPC و غیره هستند. ابزارهای اساسی برای کار: Terraform и CloudFormation.
  2. پیکربندی نرم افزار. ابزارهای اساسی: غیر ممکن، آشپز و غیره

هر کدی در مخازن git است. و دیر یا زود رهبر تیم تصمیم خواهد گرفت که آنها باید مرتب شوند. و او اصلاح خواهد کرد. و ساختاری ایجاد خواهد کرد. و او خواهد دید که این خوب است.

همچنین خوب است که از قبل وجود دارد گیتلب и 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 نیاز دارم؟

مرغ با تخم مرغ

«اویاکودون3 با دایناسور" ["]

بیایید سعی کنیم یک غذا را با استفاده از ارائه دهنده ابر بپزیم مدیریت 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;
  • نمودار هلم GitLab;
  • نمودار هلم 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.

مرغ یا تخم مرغ: تقسیم IaCمرحله 2. ما Terraform خود را برای "پخت" یک خوشه از 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. 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. بعد از اینکه خوشه پخت و به آن دسترسی پیدا کردیم می توانیم برای مزه دار شدن روی آن یامل اضافه کنیم.

ترجیح می دهم اضافه کنم:

  • فضای نام ،
  • کلاس ذخیره سازی
  • سیاست امنیتی pod و غیره.

کلاس ذخیره سازی برای Selectel را می توان از مخزن رسمی.

از آنجایی که در ابتدا یک خوشه در منطقه انتخاب کردم ru-3a، سپس من به کلاس Storage از این منطقه نیاز دارم.

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

ما حدود 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 را دریافت می کنیم.

ابتدا رمز ورود را پیدا کنید:

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

اضافه کردن نظر