Аввалин чӣ омад - мурғ ё тухм? Оғози хеле аҷиб барои мақола дар бораи Infrastructure-as-Code, ҳамин тавр не?
Тухм чист?
Аксар вақт, Infrastructure-as-Code (IaC) як роҳи декларативии муаррифии инфрасохтор мебошад. Дар он мо ҳолатеро, ки мо мехоҳем ба даст орем, аз қисми сахтафзор сар карда то бо конфигуратсияи нармафзор тавсиф мекунем. Аз ин рӯ, IaC барои:
- Таъмини захираҳо. Инҳо VMs, S3, VPC ва ғайра мебошанд. Воситаҳои асосӣ барои кор:
Терафром иCloudFormation . Танзимоти нармафзор . Воситаҳои асосӣ:Фаҳмост , Ошпаз ва ғайра.
Ҳама гуна код дар анбори git мавҷуд аст. Ва дер ё зуд сардори бригада тасмим мегирад, ки онҳоро ба тартиб даровардан лозим аст. Ва ӯ рефаксия хоҳад кард. Ва он баъзе сохторҳоро эҷод мекунад. Ва ӯ хоҳад дид, ки ин хуб аст.
Инчунин хуб аст, ки он аллакай вуҷуд дорад
Тухм аз куҷо пайдо шуд?
Ҳамин тавр, мо тадриҷан ба саволи асосӣ наздик мешавем.
Пеш аз ҳама, шумо бояд аз анборе оғоз кунед, ки сохтори дигар анборҳо, аз ҷумла худатонро тавсиф мекунад. Ва албатта, ҳамчун як қисми GitOps, шумо бояд CI-ро илова кунед, то тағиротҳо ба таври худкор иҷро шаванд.
Агар Git ҳанӯз сохта нашуда бошад?
- Чӣ тавр онро дар Git нигоҳ доштан мумкин аст?
- Чӣ тавр насб кардани CI?
- Агар мо низ Gitlab-ро бо истифода аз IaC ва ҳатто дар Kubernetes ҷойгир кунем?
- Ва GitLab Runner низ дар Кубернетес?
- Дар бораи Kubernetes дар провайдери абр чӣ гуфтан мумкин аст?
Аввалин чӣ омад: GitLab, ки дар он ман рамзи худро бор мекунам ё коде, ки ба ман чӣ гуна GitLab лозим аст?
Гӯшти мурғ бо тухм
«Оякодон 3 бо динозавр" [СРС ]
Биёед кӯшиш кунем, ки як табақро ҳамчун провайдери абрӣ истифода барем
ХИБ; DR
Оё мумкин аст, ки якбора ба як даста ҳамроҳ шавад?
$ export MY_SELECTEL_TOKEN=<token>
$ curl https://gitlab.com/chicken-or-egg/mks/make/-/snippets/2002106/raw | bash
Компонентњо:
- Ҳисоб аз my.selectel.ru;
- Нишонаи ҳисоб;
- малакаҳои Kubernetes;
- Малакаҳои руль;
- малакаҳои терраформӣ;
- Диаграммаи чархи GitLab;
- Диаграммаи чархи GitLab Runner.
Дорухат:
- MY_SELECTEL_TOKEN-ро аз панел гиред my.selectel.ru.
- Бо интиқол додани аломати ҳисоб ба он кластери Kubernetes эҷод кунед.
- KUBECONFIG-ро аз кластери сохташуда гиред.
- GitLab-ро дар Kubernetes насб кунед.
- GitLab-token-ро аз GitLab барои корбар эҷод кунед реша.
- Бо истифода аз GitLab-token дар GitLab сохтори лоиҳа эҷод кунед.
- Рамзи мавҷударо ба GitLab тела диҳед.
- ???
- Фоида!
қадам 1. Токенро дар бахш дастрас кардан мумкин аст
қадам 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
қадам 3. Мо конфигуратсияи cube-ро мегирем.
Барои ба таври барномавӣ зеркашӣ кардани KUBECONFIG, шумо бояд аз OpenStack нишона гиред:
openstack token issue -c id -f value > token
Ва бо ин нишона ба API Managed Kubernetes Selectel дархост кунед. 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. Пас аз пухтани кластер ва мо ба он дастрасӣ дорем, мо метавонем ба боло ямл илова кунем, то бичашем.
Ман мехоҳам илова кунам:
- фазои ном
- синфи нигоҳдорӣ
- сиёсати амнияти pod ва ғайра.
Аз ибтидо ман кластерро дар минтақа интихоб кардам ру-3а, пас ба ман Синфи нигаҳдорӣ аз ин минтақа лозим аст.
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. 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. Бо истифода аз провайдери Gitlab интиқол додани анбори Git ба иерархияи дуруст.
cd ../internal/gitlab/hierarchy && terraform apply -input=false -auto-approve planfile
Мутаассифона, провайдери terraform GitLab дорои шинокунанда дорад
хато . Пас шумо бояд лоиҳаҳои ихтилофро дастӣ нест кунед, то tf.state ислоҳ шавад. Пас фармони '$ҳама кунад'-ро дубора иҷро кунед
қадам 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 интиқол диҳем. Чӣ тавр ин корро кардан дар қисми оянда аст.
Ба мо обуна шавед
блог то нашри мақолаҳои навро аз даст надиҳед!
Манбаъ: will.com