ကြက်သား ဒါမှမဟုတ် ကြက်ဥက ဘာအရင်လာတာလဲ။ Infrastructure-as-Code အကြောင်း ဆောင်းပါးတစ်ပုဒ်အတွက် အတော်လေး ထူးဆန်းနေပြီ မဟုတ်လား။
ကြက်ဥဆိုတာဘာလဲ။
အများစုမှာ Infrastructure-as-Code (IaC) သည် အခြေခံအဆောက်အဦများကို ကိုယ်စားပြုသည့် ကြေငြာနည်းလမ်းဖြစ်သည်။ ၎င်းတွင် ကျွန်ုပ်တို့သည် ဟာ့ဒ်ဝဲအပိုင်းမှစတင်ကာ ဆော့ဖ်ဝဲလ်ဖွဲ့စည်းပုံစနစ်ဖြင့် အဆုံးသတ်ကာ ကျွန်ုပ်တို့ရရှိလိုသည့်အခြေအနေကို ဖော်ပြသည်။ ထို့ကြောင့် IaC ကို:
- အရင်းအမြစ်ပံ့ပိုးမှု။ ၎င်းတို့သည် VMs၊ S3၊ VPC စသည်တို့ဖြစ်သည်။ အလုပ်အတွက် အခြေခံကိရိယာများ
Terraform иCloudFormation . ဆော့ဝဲ Configuration . အခြေခံကိရိယာများ-မြင်မရဘူး စားဖိုမှူး စသဖြင့်၊
မည်သည့်ကုဒ်မဆို git repositories တွင်ရှိသည်။ အနှေးနဲ့အမြန်ဆိုသလိုပဲ အဖွဲ့ခေါင်းဆောင်က သူတို့ကို စနစ်တကျထားဖို့ ဆုံးဖြတ်ပါလိမ့်မယ်။ ပြီးတော့ သူက ပြန်ဖြည့်ပေးလိမ့်မယ်။ ပြီးတော့ ဖွဲ့စည်းပုံအချို့ကို ဖန်တီးပါလိမ့်မယ်။ ဤအရာသည် ကောင်းသည်ကို မြင်လိမ့်မည်။
ရှိပြီးသားလည်း ကောင်းပါတယ်။
ကြက်ဥက ဘယ်ကလာတာလဲ။
အဲဒီတော့ အဓိကမေးခွန်းကို တဖြည်းဖြည်း ချဉ်းကပ်လာပါပြီ။
ပထမဆုံးအနေနဲ့၊ သင်ကိုယ်တိုင် အပါအဝင် အခြား repositories တွေရဲ့ ဖွဲ့စည်းပုံကို ဖော်ပြတဲ့ repository တစ်ခုနဲ့ စတင်ရပါမယ်။ GitOps ၏တစ်စိတ်တစ်ပိုင်းအနေဖြင့်၊ သင်သည်ပြောင်းလဲမှုများကိုအလိုအလျောက်လုပ်ဆောင်နိုင်ရန် CI ကိုထည့်ရန်လိုအပ်သည်။
Git မဖန်တီးရသေးရင်
- Git မှာ ဘယ်လိုသိမ်းမလဲ။
- CI ကို ဘယ်လိုထည့်သွင်းရမလဲ။
- အကယ်၍ ကျွန်ုပ်တို့သည် IaC ကို အသုံးပြု၍ Gitlab နှင့် Kubernetes တွင်ပင် အသုံးပြုနိုင်ပါသလား။
- ပြီးတော့ Kubernetes မှာလည်း GitLab Runner ပါလား။
- cloud ဝန်ဆောင်မှုပေးသူရှိ Kubernetes ကကော။
ဘယ်အရာက အရင်လာသလဲ- ကျွန်ုပ်ကုဒ်ကို အပ်လုဒ်လုပ်မည့် GitLab သို့မဟုတ် ကျွန်ုပ်လိုအပ်သော GitLab အမျိုးအစားကို ဖော်ပြသည့် ကုဒ်။
ကြက်ဥနှင့်ကြက်သား
«Oyakodon 3 ဒိုင်နိုဆောနှင့်အတူ"src ]
cloud ဝန်ဆောင်မှုပေးသူအဖြစ် အသုံးပြု၍ ဟင်းချက်ရန် ကြိုးစားကြပါစို့
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 အပြေးသမား။
စာရွက်:
- အကန့်မှ MY_SELECTEL_TOKEN ရယူပါ။ my.selectel.ru.
- ၎င်းသို့ အကောင့်တိုကင်တစ်ခု လွှဲပြောင်းခြင်းဖြင့် Kubernetes အစုအဝေးတစ်ခုကို ဖန်တီးပါ။
- ဖန်တီးထားသောအစုမှ KUBECONFIG ကို ရယူပါ။
- Kubernetes တွင် GitLab ကို ထည့်သွင်းပါ။
- အသုံးပြုသူအတွက် ဖန်တီးထားသော GitLab မှ GitLab-တိုကင်ကို ရယူပါ။ အမြစ်.
- GitLab-token ကို အသုံးပြု၍ GitLab တွင် ပရောဂျက်တည်ဆောက်ပုံ ဖန်တီးပါ။
- ရှိပြီးသားကုဒ်ကို GitLab သို့ တွန်းပါ။
- ???
- အမြတ်အစွန်း!
ခြေလှမ်း 1. တိုကင်ကို ကဏ္ဍတွင် ရယူနိုင်ပါသည်။
ခြေလှမ်း 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
ခြေလှမ်း 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 မှတဆင့်ဝင်ရောက်နိုင်သည်။
ခြေလှမ်း 4. အစုအဝေးကို ဖုတ်ပြီးပါက ၎င်းကို သုံးဆောင်နိုင်ပါပြီ၊ အရသာအတွက် အပေါ်မှ ယမ်းစိမ်းထည့်နိုင်ပါသည်။
ထည့်ရတာ ပိုကြိုက်တယ်
- namespace
- သိုလှောင်မှုအတန်း
- pod လုံခြုံရေးမူဝါဒ စသည်တို့ဖြစ်သည်။
အစကတည်းက ကျွန်တော်သည် ဇုန်ရှိ အစုအဖွဲ့တစ်ခုကို ရွေးချယ်ခဲ့သည်။ 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 ကို ၃-၄ မိနစ်ခန့် လက်ခံရရှိရန် ကျွန်ုပ်တို့ စောင့်မျှော်နေပါသည်။
ရရှိထားသော ပြင်ပ IP-
ခြေလှမ်း 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...
အစေ့အဆန်များ-
ခြေလှမ်း 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 ကို:
ကောက်ချက်
ကျွန်ုပ်တို့သည် ကျွန်ုပ်တို့၏ဒေသခံစက်မှ အရာအားလုံးကို တိကျစွာ စီမံခန့်ခွဲနိုင်သည်ကို ကျွန်ုပ်တို့ အောင်မြင်ခဲ့ပါသည်။ ယခု ဤလုပ်ဆောင်စရာများအားလုံးကို CI သို့လွှဲပြောင်းပြီး ခလုတ်များကို နှိပ်လိုက်ချင်ပါသည်။ ထိုသို့လုပ်ဆောင်ရန် ကျွန်ုပ်တို့သည် ကျွန်ုပ်တို့၏ဒေသခံပြည်နယ်များ (Terraform state) ကို CI သို့ လွှဲပြောင်းရန်လိုအပ်ပါသည်။ ဒါကို ဘယ်လို လုပ်ရမလဲ ဆိုတာ နောက်အပိုင်းမှာ ရေးထားပါတယ်။
ကျွန်ုပ်တို့ထံ စာရင်းသွင်းပါ။
блог ဆောင်းပါးအသစ်များကို လက်လွတ်မခံစေရန်။
source: www.habr.com