ကြက် သို့မဟုတ် ကြက်ဥ- IaC ကို ပိုင်းခြားပါ။

ကြက် သို့မဟုတ် ကြက်ဥ- IaC ကို ပိုင်းခြားပါ။
ကြက်သား ဒါမှမဟုတ် ကြက်ဥက ဘာအရင်လာတာလဲ။ Infrastructure-as-Code အကြောင်း ဆောင်းပါးတစ်ပုဒ်အတွက် အတော်လေး ထူးဆန်းနေပြီ မဟုတ်လား။

ကြက်ဥဆိုတာဘာလဲ။

အများစုမှာ Infrastructure-as-Code (IaC) သည် အခြေခံအဆောက်အဦများကို ကိုယ်စားပြုသည့် ကြေငြာနည်းလမ်းဖြစ်သည်။ ၎င်းတွင် ကျွန်ုပ်တို့သည် ဟာ့ဒ်ဝဲအပိုင်းမှစတင်ကာ ဆော့ဖ်ဝဲလ်ဖွဲ့စည်းပုံစနစ်ဖြင့် အဆုံးသတ်ကာ ကျွန်ုပ်တို့ရရှိလိုသည့်အခြေအနေကို ဖော်ပြသည်။ ထို့ကြောင့် IaC ကို:

  1. အရင်းအမြစ်ပံ့ပိုးမှု။ ၎င်းတို့သည် VMs၊ S3၊ VPC စသည်တို့ဖြစ်သည်။ အလုပ်အတွက် အခြေခံကိရိယာများ Terraform и CloudFormation.
  2. ဆော့ဝဲ Configuration. အခြေခံကိရိယာများ- မြင်မရဘူးစားဖိုမှူး စသဖြင့်၊

မည်သည့်ကုဒ်မဆို git repositories တွင်ရှိသည်။ အနှေးနဲ့အမြန်ဆိုသလိုပဲ အဖွဲ့ခေါင်းဆောင်က သူတို့ကို စနစ်တကျထားဖို့ ဆုံးဖြတ်ပါလိမ့်မယ်။ ပြီးတော့ သူက ပြန်ဖြည့်ပေးလိမ့်မယ်။ ပြီးတော့ ဖွဲ့စည်းပုံအချို့ကို ဖန်တီးပါလိမ့်မယ်။ ဤအရာသည် ကောင်းသည်ကို မြင်လိမ့်မည်။

ရှိပြီးသားလည်း ကောင်းပါတယ်။ GitLab и GitHubTerraform အတွက် ပံ့ပိုးပေးသူ (၎င်းသည် ဆော့ဖ်ဝဲပြင်ဆင်မှုဖြစ်သည်)။ ၎င်းတို့၏အကူအညီဖြင့်၊ အဖွဲ့၀င်များ၊ CI/CD၊ git-flow စသည်တို့ကို သင်စီမံနိုင်သည်။

ကြက်ဥက ဘယ်ကလာတာလဲ။

အဲဒီတော့ အဓိကမေးခွန်းကို တဖြည်းဖြည်း ချဉ်းကပ်လာပါပြီ။

ပထမဆုံးအနေနဲ့၊ သင်ကိုယ်တိုင် အပါအဝင် အခြား repositories တွေရဲ့ ဖွဲ့စည်းပုံကို ဖော်ပြတဲ့ repository တစ်ခုနဲ့ စတင်ရပါမယ်။ GitOps ၏တစ်စိတ်တစ်ပိုင်းအနေဖြင့်၊ သင်သည်ပြောင်းလဲမှုများကိုအလိုအလျောက်လုပ်ဆောင်နိုင်ရန် CI ကိုထည့်ရန်လိုအပ်သည်။

Git မဖန်တီးရသေးရင်

  1. Git မှာ ဘယ်လိုသိမ်းမလဲ။
  2. CI ကို ဘယ်လိုထည့်သွင်းရမလဲ။
  3. အကယ်၍ ကျွန်ုပ်တို့သည် IaC ကို အသုံးပြု၍ Gitlab နှင့် Kubernetes တွင်ပင် အသုံးပြုနိုင်ပါသလား။
  4. ပြီးတော့ Kubernetes မှာလည်း GitLab Runner ပါလား။
  5. cloud ဝန်ဆောင်မှုပေးသူရှိ Kubernetes ကကော။

ဘယ်အရာက အရင်လာသလဲ- ကျွန်ုပ်ကုဒ်ကို အပ်လုဒ်လုပ်မည့် GitLab သို့မဟုတ် ကျွန်ုပ်လိုအပ်သော GitLab အမျိုးအစားကို ဖော်ပြသည့် ကုဒ်။

ကြက်ဥနှင့်ကြက်သား

«Oyakodon3 ဒိုင်နိုဆောနှင့်အတူ"src]

cloud ဝန်ဆောင်မှုပေးသူအဖြစ် အသုံးပြု၍ ဟင်းချက်ရန် ကြိုးစားကြပါစို့ 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 Skills များ၊
  • ပဲ့စင်ဇယား GitLab;
  • ပဲ့စင်ဇယား GitLab အပြေးသမား။

စာရွက်:

  1. အကန့်မှ MY_SELECTEL_TOKEN ရယူပါ။ my.selectel.ru.
  2. ၎င်းသို့ အကောင့်တိုကင်တစ်ခု လွှဲပြောင်းခြင်းဖြင့် Kubernetes အစုအဝေးတစ်ခုကို ဖန်တီးပါ။
  3. ဖန်တီးထားသောအစုမှ KUBECONFIG ကို ရယူပါ။
  4. Kubernetes တွင် GitLab ကို ထည့်သွင်းပါ။
  5. အသုံးပြုသူအတွက် ဖန်တီးထားသော GitLab မှ GitLab-တိုကင်ကို ရယူပါ။ အမြစ်.
  6. GitLab-token ကို အသုံးပြု၍ GitLab တွင် ပရောဂျက်တည်ဆောက်ပုံ ဖန်တီးပါ။
  7. ရှိပြီးသားကုဒ်ကို GitLab သို့ တွန်းပါ။
  8. ???
  9. အမြတ်အစွန်း!

ခြေလှမ်း 1. တိုကင်ကို ကဏ္ဍတွင် ရယူနိုင်ပါသည်။ API သော့များ.

ကြက် သို့မဟုတ် ကြက်ဥ- IaC ကို ပိုင်းခြားပါ။ခြေလှမ်း 2. ကျွန်ုပ်တို့သည် ဆုံမှတ် 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 ကိုလည်း panel မှတဆင့်ဝင်ရောက်နိုင်သည်။

ကြက် သို့မဟုတ် ကြက်ဥ- IaC ကို ပိုင်းခြားပါ။
ခြေလှမ်း 4. အစုအဝေးကို ဖုတ်ပြီးပါက ၎င်းကို သုံးဆောင်နိုင်ပါပြီ၊ အရသာအတွက် အပေါ်မှ ယမ်းစိမ်းထည့်နိုင်ပါသည်။

ထည့်ရတာ ပိုကြိုက်တယ်

  • namespace
  • သိုလှောင်မှုအတန်း
  • pod လုံခြုံရေးမူဝါဒ စသည်တို့ဖြစ်သည်။

သိုလှောင်မှုအတန်း for Selectel မှ မှာယူနိုင်ပါသည်။ တရားဝင်သိုလှောင်မှု.

အစကတည်းက ကျွန်တော်သည် ဇုန်ရှိ အစုအဖွဲ့တစ်ခုကို ရွေးချယ်ခဲ့သည်။ ru-3aဒါဆို ဒီဇုန်ကနေ Storage Class ကို လိုပါတယ်။

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. load balancer ကို တပ်ဆင်ပါ။

ကျွန်ုပ်တို့သည် များစွာသော စံနှုန်းကို အသုံးပြုပါမည်။ 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 ကို ​​၃-၄ မိနစ်ခန့် လက်ခံရရှိရန် ကျွန်ုပ်တို့ စောင့်မျှော်နေပါသည်။

ကြက် သို့မဟုတ် ကြက်ဥ- IaC ကို ပိုင်းခြားပါ။
ရရှိထားသော ပြင်ပ IP-

ကြက် သို့မဟုတ် ကြက်ဥ- IaC ကို ပိုင်းခြားပါ။
ခြေလှမ်း 6. GitLab ကို install လုပ်ပါ။

$ 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. Gitlab ဝန်ဆောင်မှုပေးသူကို အသုံးပြု၍ မှန်ကန်သော အထက်တန်းအဆင့်သို့ Git repositories ကို ယူဆောင်လာခြင်း။

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)

Finish ကို:

ကြက် သို့မဟုတ် ကြက်ဥ- IaC ကို ပိုင်းခြားပါ။
ကြက် သို့မဟုတ် ကြက်ဥ- IaC ကို ပိုင်းခြားပါ။
ကြက် သို့မဟုတ် ကြက်ဥ- IaC ကို ပိုင်းခြားပါ။

ကောက်ချက်

ကျွန်ုပ်တို့သည် ကျွန်ုပ်တို့၏ဒေသခံစက်မှ အရာအားလုံးကို တိကျစွာ စီမံခန့်ခွဲနိုင်သည်ကို ကျွန်ုပ်တို့ အောင်မြင်ခဲ့ပါသည်။ ယခု ဤလုပ်ဆောင်စရာများအားလုံးကို CI သို့လွှဲပြောင်းပြီး ခလုတ်များကို နှိပ်လိုက်ချင်ပါသည်။ ထိုသို့လုပ်ဆောင်ရန် ကျွန်ုပ်တို့သည် ကျွန်ုပ်တို့၏ဒေသခံပြည်နယ်များ (Terraform state) ကို CI သို့ လွှဲပြောင်းရန်လိုအပ်ပါသည်။ ဒါကို ဘယ်လို လုပ်ရမလဲ ဆိုတာ နောက်အပိုင်းမှာ ရေးထားပါတယ်။

ကျွန်ုပ်တို့ထံ စာရင်းသွင်းပါ။ блогဆောင်းပါးအသစ်များကို လက်လွတ်မခံစေရန်။

source: www.habr.com

မှတ်ချက် Add