
ĂfarĂ« u krijua mĂ« parĂ« â pula apo veza? NjĂ« fillim mjaft i çuditshĂ«m pĂ«r njĂ« artikull rreth Infrastructure-as-Code, apo jo?
ĂfarĂ« Ă«shtĂ« vezĂ«?
Më shpesh, Infrastructure-as-Code (IaC) është një mënyrë deklarative për të përshkruar infrastrukturën. Ne e përshkruajmë gjendjen që duam të arrijmë, duke filluar nga pjesa harduerore dhe duke përfunduar me konfigurimin e softuerit. Prandaj IaC përdoret për:
- Furnizimin 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 herĂ«t a vonĂ«, lideri i ekipit do tĂ« vendosĂ« se Ă«shtĂ« koha pĂ«r t'i bĂ«rĂ« ato nĂ« rregull. Ai do ta riorganizojĂ«. Ai do tĂ« krijojĂ« njĂ« strukturĂ«. Ai do tĂ« kuptojĂ« se kjo Ă«shtĂ« shumĂ« mirĂ«.
Po ashtu, është mirë që tashmë ekziston dhe - një ofrues për Terraform (dhe kjo është Konfigurimi i Softuerit). Me ndihmën e tyre mund të menaxhoni të gjithë projektin: anëtarët e ekipit, CI/CD, git-flow etj.
Nga erdhi veze?
Këtu po i afrohemi gradualisht pyetjes kryesore.
Së pari, duhet të filloni me depozitat që përshkruajnë strukturën e depozitave të tjera, duke përfshirë edhe veten. Dhe natyrisht, brenda GitOps duhët të shtoni CI, në mënyrë që ndryshimet të ekzekutohen automatikisht.
Nëse Git ende nuk është krijuar?
- Si ta ruaj në Git?
- Si ta lidhem me CI?
- Nëse ne gjithashtu e zhvillojmë GitLab me ndihmën e IaC, dhe po ashtu në Kubernetes?
- Dhe GitLab Runner gjithashtu në Kubernetes?
- Dhe Kubernetes te ofruesi i qasjes?
ĂfarĂ« erdhi mĂ« parĂ«: GitLab ku do tĂ« ngarkoj kodin tim, apo kodi qĂ« pĂ«rshkruan se cilin GitLab mĂ« nevojitet?
Pula me vezë
«3 me dinosaurin» []
Le të përpiqemi të përgatisim një pjatë duke përdorur si ofrues qasje .
TL;DR
A është e mundur që menjëherë dhe 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 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.
- Shtyni kodin ekzistues në GitLab.
- ???
- Fitim!
Hapi 1. Tokeni mund të merret në seksionin .
Hapi 2. Po përgatisim Terraform tonë për "pjekjen" e klasterit me 2 nodë. Nëse jeni të sigurt se keni mjaft burime për gjithçka, atëherë mund të aktivizoni kufizimet automatikisht:
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ërdorues 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
}Të dhënat 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
}Nisim:
$ 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. Marrim kubkonfig.
Për të shkarkuar KUBECONFIG në mënyrë programore, duhet të merrni një token nga OpenStack:
openstack token issue -c id -f value > tokenDhe me këtë token bëni një kërkesë në API-në e 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.yamlKubkonfigun mund ta merrni gjithashtu përmes panelit.

Hapi 4. Pasi klasteri është ngritur dhe kemi qasje në të, mund të shtojmë sipër një yaml sipas dëshirës.
Unë preferoj të shtoj:
- namespace,
- klasën e ruajtjes,
- politikat e sigurisë së pod-it dhe më shumë.
Për Selectel mund të merren nga .
Duke qenë se fillimisht zgjodha klasterin në zonën ru-3a, atëherë edhe Klasën e Ruajtjes e kam nevojë nga kjo zonë.
lloji: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
emri: fast.ru-3a
annotime:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: cinder.csi.openstack.org
parametra:
tipi: fast.ru-3a
disponibiliteti: ru-3a
lejoftoVolumeExpansion: trueHapi 5. Vendosim balancuesin e ngarkesës.
Do të përdorim standardin për shumë nginx-ingress. Ka mjaft udhëzime për instalimin e tij, kështu që nuk do të qëndrojmë te kjo.
$ 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.ymlPritim derisa të marrë IP-të e jashtme, rreth 3-4 minuta:

Mora IP-në e jashtme:

Hapi 6. Instalojmë 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 derisa të ngrihen të gjitha pod-ët.
kubectl get po -n gitlab
EMRI GATI STATUS RINGTUR MOSHA
gitlab-gitaly-0 0/1 Prishtë 0 0s
gitlab-gitlab-exporter-88f6cc8c4-fl52d 0/1 Prishtë 0 0s
gitlab-gitlab-runner-6b6867c5cf-hd9dp 0/1 Prishtë 0 0s
gitlab-gitlab-shell-55cb6ccdb-h5g8x 0/1 Inic:0/2 0 0s
gitlab-migrations.1-2cg6n 0/1 Prishtë 0 0s
gitlab-minio-6dd7d96ddb-zd9j6 0/1 Prishtë 0 0s
gitlab-minio-create-buckets.1-bncdp 0/1 Prishtë 0 0s
gitlab-postgresql-0 0/2 Prishtë 0 0s
gitlab-prometheus-server-6cfb57f575-v8k6j 0/2 Prishtë 0 0s
gitlab-redis-master-0 0/2 Prishtë 0 0s
gitlab-registry-6bd77b4b8c-pb9v9 0/1 Prishtë 0 0s
gitlab-registry-6bd77b4b8c-zgb6r 0/1 Inic: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 Prishtë 0 0s
gitlab-task-runner-6fd6857db7-9x567 0/1 Prishtë 0 0s
gitlab-webservice-d9d4fcff8-hp8wl 0/2 Prishtë 0 0s
Prit a gitlab
./wait_gitlab.sh ../internal/gitlab/gitlab/.pods
po presim pod...
po presim pod...
po presim pod...Pod-ët janë ngritur:

Hapi 7. Merrni GitLab-token.
Së pari, le të zbulojmë fjalëkalimin për qasje:
kubectl get secret -n gitlab gitlab-gitlab-initial-root-password -o jsonpath='{.data.password}' | base64 --decodeTani autorizohemi dhe marrim token-in:
python3 get_gitlab_token.py root $GITLAB_PASSWORD http://gitlab.gitlab.$EXTERNAL_IP.nip.ioHapi 8. Shtyjmë 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ë konflikt . Ndryshe, do të duhet të fshijmë projektet konfliktuale manualisht, në mënyrë që tf.state të riparohet. Pastaj rihapni komandën "$ make all"
Hapi 9. Transferojmë repo-t lokale në server.
$ make push
[master (root-commit) b61d977] Komitimi fillestar
3 skeduj të ndryshuar, 46 futje(+)
krijo modalitet 100644 .gitignore
krijo modalitet 100644 values.yml
Enumerimi i objekteve: 5, e bërë.
Numërimi i objekteve: 100% (5/5), e bërë.
Kompresimi i deltat në përdorim deri në 8 thread
Kompresimi i objekteve: 100% (5/5), e bërë.
Shkrimi i objekteve: 100% (5/5), 770 bajta | 770.00 KiB/s, e bërë.
Total 5 (delta 0), përsëritur 0 (delta 0)Gati:


Përfundimi
Ne kemi arritur që nga kompjuteri ynë lokal të menaxhojmë gjithçka në mënyrë deklarative. Tani dëshirojmë t'i transferojmë të gjitha këto detyra në CI dhe të klikojmë vetëm butonat. Për këtë, duhet të kalojmë gjendjet tona lokale (Terraform state) në CI. Si ta bëjmë këtë, në pjesën tjetër.
Regjistrohuni në kanalin tonë , për të mos humbur publikimet e reja të artikujve!
Burimi: habr.com
