Эхлээд юу ирсэн бэ - тахиа эсвэл өндөг? Дэд бүтэц-кодны тухай нийтлэлийн эхлэл нь хачирхалтай, тийм үү?
Өндөг гэж юу вэ?
Ихэнхдээ Infrastructure-as-Code (IaC) нь дэд бүтцийг төлөөлөх тунхаглалын арга юм. Үүнд бид техник хангамжийн хэсгээс эхлээд програм хангамжийн тохиргоо хүртэл хүрэхийг хүсч буй төлөвийг дүрсэлсэн болно. Тиймээс IaC-ийг дараахь зорилгоор ашигладаг.
- Нөөцийн хангамж. Эдгээр нь VM, S3, VPC гэх мэт. Ажлын үндсэн хэрэгсэл:
Терраформ иCloudFormation . Програм хангамжийн тохиргоо . Үндсэн хэрэгслүүд:Алгасах , тогооч гэх мэт.
Аливаа код git репозиторуудад байдаг. Эрт орой хэзээ нэгэн цагт багийн ахлагч тэднийг эмх цэгцтэй болгох шаардлагатай гэж шийднэ. Тэгээд тэр рефакт хийх болно. Мөн энэ нь зарим бүтцийг бий болгоно. Энэ нь сайн гэдгийг тэр харах болно.
Энэ нь аль хэдийн байгаа нь бас сайн хэрэг
Өндөг хаанаас ирсэн бэ?
Тиймээс бид аажмаар гол асуултанд ойртож байна.
Юуны өмнө та бусад репозиторуудын бүтцийг, тэр дундаа өөрийгөө тодорхойлсон агуулахаас эхлэх хэрэгтэй. Мэдээжийн хэрэг, GitOps-ийн нэг хэсэг болгон та өөрчлөлтийг автоматаар гүйцэтгэхийн тулд CI нэмэх хэрэгтэй.
Хэрэв Git хараахан бүтээгдээгүй бол?
- Үүнийг Git-д хэрхэн хадгалах вэ?
- CI-г хэрхэн суулгах вэ?
- Хэрэв бид Gitlab-ийг IaC, тэр ч байтугай Kubernetes-д байрлуулбал?
- Мөн GitLab Runner нь Кубернетес дээр байна уу?
- Клоуд үйлчилгээ үзүүлэгч дэх 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 сайтаас данс;
- Дансны токен;
- Kubernetes ур чадвар;
- Жолоо барих ур чадвар;
- Терраформ ур чадвар;
- GitLab жолооны график;
- GitLab Runner-ийн жолооны график.
Recipe:
- Самбараас MY_SELECTEL_TOKEN аваарай my.selectel.ru.
- Бүртгэлийн жетон шилжүүлснээр Kubernetes кластер үүсгэнэ үү.
- Үүсгэсэн кластераас KUBECONFIG-г аваарай.
- Kubernetes дээр GitLab суулгана уу.
- Хэрэглэгчдэд зориулан бүтээсэн GitLab-аас GitLab-токен аваарай эх.
- GitLab-токен ашиглан 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 алхам. Бид кубын тохиргоог авдаг.
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 алхам. Кластерийг жигнэж, бид түүнд хандах боломжтой болсны дараа бид амтлахын тулд дээр нь ямл нэмж болно.
Би нэмэхийг илүүд үздэг:
- нэрийн орон зай
- хадгалах ангилал
- pod аюулгүй байдлын бодлого гэх мэт.
Эхлээд би бүсэд кластер сонгосон ru-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 алхам. 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-г засахын тулд зөрчилтэй төслүүдийг гараар устгах хэрэгтэй болно. Дараа нь `$ 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 руу шилжүүлж, зүгээр л товчлууруудыг дарахыг хүсч байна. Үүнийг хийхийн тулд бид орон нутгийн мужаа (Терраформ муж) CI руу шилжүүлэх хэрэгтэй. Үүнийг хэрхэн хийх нь дараагийн хэсэгт байна.
Манай захиалах
блог шинэ нийтлэл гарахыг алдахгүйн тулд!
Эх сурвалж: www.habr.com