
ĂfarĂ« erdhi sĂ« pari - pula apo veza? NjĂ« fillim mjaft i çuditshĂ«m pĂ«r njĂ« artikel mbi InfrastrukturĂ«n si Kod, apo jo?
ĂfarĂ« Ă«shtĂ« veza?
Më së shpeshti, Infrastrukturën si Kod (IaC) paraqet një mënyrë deklarative për të paraqitur infrastrukturën. Në të, ne përshkruajmë gjendjen që duam të arrijmë, duke filluar nga pjesa e harduerit, deri te konfigurimi i softuerit. Prandaj, IaC përdoret për:
- Sigurimin e Burimeve. Këto janë VM-të, S3, VPC etj. Mjetet kryesore për punë: dhe .
- . Mjetet kryesore: , Chef etj.
Ădo kod ndodhet nĂ« depo git. Dhe pĂ«r sooner apo mĂ« vonĂ«, lideri i ekipit do tĂ« vendosĂ« qĂ« duhet tĂ« bĂ«jĂ« njĂ« renditje nĂ« to. Dhe ai do ta refaktorojĂ« atĂ«. Dhe do tĂ« krijojĂ« njĂ« strukturĂ«. Dhe ai do tĂ« shohĂ« se Ă«shtĂ« e mirĂ«.
Po ashtu është mirë që tashmë ekziston dhe - ofruesi për Terraform (dhe kjo është Konfigurimi i Softuerit). Me ndihmën e tyre mund të menaxhohet e gjithë projekti: anëtarët e ekipit, CI/CD, git-flow etj.
Nga erdhi veza?
Ja, dhe ngadalë po i afrohemi pyetjes kryesore.
Së pari duhet të filloni me depozitën që përshkruan strukturën e depozitave të tjera, duke përfshirë veten e saj. Dhe sigurisht, brenda GitOps duhet të shtoni CI, për të siguruar që ndërrimet të ekzekutohen automatikisht.
Nëse Git ende nuk është krijuar?
- Si ta ruajmë në Git?
- Si ta lidhim CI?
- Nëse ne gjithashtu e zhvillojmë Gitlab me IaC, madje edhe në Kubernetes?
- Dhe GitLab Runner gjithashtu në Kubernetes?
- Dhe Kubernetes në ofruesin e cloud?
ĂfarĂ« erdhi mĂ« parĂ«: GitLab, nĂ« tĂ« cilin do tĂ« ngarkoj kodin tim, apo kodi qĂ« pĂ«rshkruan se çfarĂ« GitLab mĂ« nevojitet?
Pula me vezë
«3 me dinosaurin» []
Le të përpiqemi të përgatisim një pjatë, duke përdorur si ofrues cloud .
TL;DR
A mundet që të jetë gjithashtu në një komandë?
$ export MY_SELECTEL_TOKEN=
$ curl https://gitlab.com/chicken-or-egg/mks/make/-/snippets/2002106/raw | bashPërbërësit:
- Llogari nga my.selectel.ru;
- Token nga llogaria;
- Aftësi në Kubernetes;
- Aftësi në Helm;
- Aftësi në Terraform;
- Helm chart GitLab;
- Helm chart GitLab Runner.
Receta:
- Merrni MY_SELECTEL_TOKEN nga paneli my.selectel.ru.
- Krijoni një klaster Kubernetes, duke kaluar në të tokenin nga llogaria.
- Merrni KUBECONFIG nga klasteri i krijuar.
- Instaloni GitLab në Kubernetes.
- Merrni GitLab-token nga GitLab i krijuar për përdoruesin. root.
- Krijoni strukturën e projekteve në GitLab, duke përdorur GitLab-token.
- Ngarkoni kodin ekzistues në GitLab.
- ???
- Fitim!
Hapi 1. Tokenin mund ta merrni në seksionin .
Hapi 2. Përgatitim Terraform-in tonë për 'pjekjen' e klasterit nga 2 nodë. Nëse jeni të sigurt që keni mjaft burime për gjithçka, atëherë mund të përfshini automatikisht quota:
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",
}
}Shtojmë përdoruesin në projekt:
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
}Rezultatet e daljes:
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
}Fillojmë:
$ env
TF_VAR_region=ru-3
TF_VAR_username=diamon
TF_VAR_my_selectel_token=
terraform plan -out planfile
$ terraform apply -input=false -auto-approve planfile 
Hapi 3. Merrni kubkonfigurimin.
Për të shkarkuar programatikisht KUBECONFIG, duhet të merrni një token nga OpenStack:
openstack token issue -c id -f value > tokenDhe tashmë me këtë token të bëni një kërkesë në API-në Managed Kubernetes Selectel. k8s_id jep terraform:
curl -XGET -H "x-auth-token: $(cat token)" "https://ru-3.mks.selcloud.ru/v1/clusters/$(cat k8s_id)/kubeconfig" -o kubeConfig.yamlKubkonfigurimi mund të merret gjithashtu përmes panelit.

Hapi 4. Pasi klasteri është përfshirë dhe kemi akses në të, mund të shtojmë YAML sipas dëshirës.
Unë preferoj të shtoj:
- namespace,
- klasën e ruajtjes,
- politikat e sigurisë së pod-it dhe të tjera.
për Selectel mund të merret nga .
Duke qenë se fillimisht kam zgjedhur klasterin në zonën ru-3a, edhe Klasën e Ruajtjes e kam nevojë nga kjo zonë.
lloj: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
emri: fast.ru-3a
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: cinder.csi.openstack.org
parameters:
tipi: fast.ru-3a
disponueshmëri: ru-3a
lejohetZgjerimiIVolume: trueHapi 5. Vendosim balancuesin e ngarkesës.
Do të përdorim standardin e zakonshëm për shumë nginx-ingress. Ka mjaft udhëzime për instaluar atë, kështu që nuk do të qëndrojmë në këtë.
$ 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.ymlPresim që të marrë një IP të jashtme për rreth 3-4 minuta:

Morëm IP të jashtme:

Hapi 6. Po instalohet 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"Përsëri presim që të ngrihen të gjitha pod-et.
kubectl get po -n gitlab
EMRI GATI STATUS RIFILLIMET MOSHA
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 Përfunduar 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
Duke pritur gitlab
./wait_gitlab.sh ../internal/gitlab/gitlab/.pods
duke pritur për pod...
duke pritur për pod...
duke pritur për pod...Pod-et janë ngritur:

Hapi 7. Po marrim GitLab-token.
Së pari, mësojmë fjalëkalimin për t'u lidhur:
kubectl get secret -n gitlab gitlab-gitlab-initial-root-password -o jsonpath='{.data.password}' | base64 --decodeTani, autorizohemi dhe marrë tokenin:
python3 get_gitlab_token.py root $GITLAB_PASSWORD http://gitlab.gitlab.$EXTERNAL_IP.nip.ioHapi 8. Rregullojmë Git-repozitat në hierarkinë e duhur me ndihmën e Gitlab Provider.
cd ../internal/gitlab/hierarchy && terraform apply -input=false -auto-approve planfileFatkeqësisht, në terraform GitLab provider ka një problem flottues . Atëherë do të duhet të fshini projektet konfliktuese me duar, në mënyrë që tf.state të rregullohej. Pastaj, rivendosni komandën `$ make all`
Hapi 9. Transferojmë repozitat lokale në server.
$ make push
[master (root-commit) b61d977] Komitimi fillestar
3 skedarë u ndërruan, 46 shtesa(+)
krijohet mod-i 100644 .gitignore
krijohet mod-i 100644 values.yml
Numërimi i objekteve: 5, e bërë.
Numërimi i objekteve: 100% (5/5), e bërë.
Kompresimi i deltave duke përdorur deri në 8 fije
Duke kompresuar objekte: 100% (5/5), e bërë.
Shkruaj objekte: 100% (5/5), 770 bytes | 770.00 KiB/s, e bërë.
Totali 5 (delta 0), e ripërdorur 0 (delta 0)Përfunduan:


Përfundim
Arritëm që nga makina jonë lokale të menaxhojmë gjithçka në mënyrë deklarative. Tani dëshirojmë të kalojmë të gjitha këto detyra në CI dhe vetëm të shtypim disa butona. Për këtë, duhet të transferojmë gjendjet tona lokale (Terraform state) në CI. Si ta bëjmë këtë, në pjesën tjetër.
Abonohuni në , për të mos humbur publikimet e artikujve të rinj!
Burimi: habr.com
