
Kas buvo pirma – višta ar kiaušinis? Gana keista straipsnio apie infrastruktūrą kaip kodą pradžia, ar ne?
Kas yra kiaušinis?
Dažniausiai Infrastruktūra kaip kodas (IaC) yra deklaratyvus infrastruktūros vaizdavimo būdas. Jame aprašome būseną, kurią norime pasiekti, pradedant nuo aparatinės dalies ir baigiant programinės įrangos konfigūracija. Todėl IaC naudojamas:
- Išteklių aprūpinimas. Tai VM, S3, VPC ir kt. Pagrindinės darbo priemonės: и .
- . Pagrindiniai įrankiai: , virėjas ir kt.
Bet koks kodas yra git saugyklose. Ir anksčiau ar vėliau komandos vadovas nuspręs, kad juos reikia sutvarkyti. Ir jis reaguos. Ir tai sukurs tam tikrą struktūrą. Ir jis pamatys, kad tai yra gerai.
Taip pat gerai, kad jis jau egzistuoja и -Terraform teikėjas (ir tai yra programinės įrangos konfigūracija). Jų pagalba galite valdyti visą projektą: komandos narius, CI/CD, git-flow ir kt.
Iš kur atsirado kiaušinis?
Taigi pamažu artėjame prie pagrindinio klausimo.
Visų pirma, reikia pradėti nuo saugyklos, kuri aprašo kitų saugyklų, įskaitant save, struktūrą. Ir, žinoma, kaip „GitOps“ dalį turite pridėti CI, kad pakeitimai būtų vykdomi automatiškai.
Jei Git dar nebuvo sukurtas?
- Kaip jį laikyti Git?
- Kaip įdiegti CI?
- Jei taip pat įdiegsime „Gitlab“ naudodami IaC ir net „Kubernetes“?
- Ir „GitLab Runner“ taip pat yra „Kubernetes“?
- O kaip su „Kubernetes“ debesies paslaugų teikėju?
Kas įvyko pirmiausia: „GitLab“, kur įkelsiu savo kodą, ar kodas, apibūdinantis, kokios „GitLab“ man reikia?
Vištiena su kiaušiniais
«3 su dinozauru“ []
Pabandykime paruošti patiekalą naudodamiesi debesų paslaugų teikėju .
Lt; DR
Ar galima vienu metu prisijungti prie vienos komandos?
$ export MY_SELECTEL_TOKEN=<token>
$ curl https://gitlab.com/chicken-or-egg/mks/make/-/snippets/2002106/raw | bashSudėtis:
- Paskyra iš my.selectel.ru;
- Paskyros žetonas;
- Kubernetes įgūdžiai;
- vairo įgūdžiai;
- Terraforminiai įgūdžiai;
- „GitLab“ vairo diagrama;
- „GitLab Runner“ vairo diagrama.
Receptas:
- Gaukite MY_SELECTEL_TOKEN iš skydelio my.selectel.ru.
- Sukurkite Kubernetes klasterį perkeldami į jį paskyros prieigos raktą.
- Gaukite KUBECONFIG iš sukurto klasterio.
- Įdiekite „GitLab“ „Kubernetes“.
- Gaukite „GitLab“ prieigos raktą iš „GitLab“, sukurtą vartotojui šaknis.
- Sukurkite projekto struktūrą „GitLab“ naudodami „GitLab“ raktą.
- Perkelkite esamą kodą į „GitLab“.
- ???
- Pelnas!
Žingsnis 1. Žetoną galite gauti skyriuje .
Žingsnis 2. Paruošiame savo Terraform 2 mazgų klasteriui „kepti“. Jei esate tikri, kad turite pakankamai išteklių viskam, galite įjungti automatines kvotas:
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",
}
}Pridėkite vartotoją prie projekto:
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
}Išvestis:
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
}Paleidžiame:
$ 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 
Žingsnis 3. Gauname kubo konfigūraciją.
Norėdami programiškai atsisiųsti KUBECONFIG, turite gauti prieigos raktą iš OpenStack:
openstack token issue -c id -f value > tokenIr naudodami šį prieigos raktą pateikite užklausą valdomai „Kubernetes Selectel“ API. k8s_id Problemos terraformas:
curl -XGET -H "x-auth-token: $(cat token)" "https://ru-3.mks.selcloud.ru/v1/clusters/$(cat k8s_id)/kubeconfig" -o kubeConfig.yaml„Cupconfig“ taip pat galima pasiekti per skydelį.

Žingsnis 4. Po to, kai kekė iškepa ir turėsime prieigą prie jo, ant viršaus galime uždėti yaml pagal skonį.
Man labiau patinka pridėti:
- vardų erdvė
- saugojimo klasė
- pod saugumo politika ir pan.
už Selectel galima paimti iš .
Kadangi iš pradžių pasirinkau klasterį zonoje ru-3a, tada man reikia saugyklos klasės iš šios zonos.
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Žingsnis 5. Įdiekite apkrovos balansavimo įtaisą.
Daugeliui naudosime standartinį nginx-ingress. Jau yra daug instrukcijų, kaip jį įdiegti, todėl mes apie tai nesigilinsime.
$ 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.ymlLaukiame, kol jis gaus išorinį IP apie 3–4 minutes:

Gautas išorinis IP:

Žingsnis 6. Įdiekite „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"Vėl laukiame, kol visos ankštys pakils.
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...Ankštys pakilo:

Žingsnis 7. Mes gauname GitLab-žetoną.
Pirmiausia sužinokite prisijungimo slaptažodį:
kubectl get secret -n gitlab gitlab-gitlab-initial-root-password -o jsonpath='{.data.password}' | base64 --decodeDabar prisijunkime ir gaukime žetoną:
python3 get_gitlab_token.py root $GITLAB_PASSWORD http://gitlab.gitlab.$EXTERNAL_IP.nip.ioŽingsnis 8. „Git“ saugyklų perkėlimas į tinkamą hierarchiją naudojant „Gitlab“ teikėją.
cd ../internal/gitlab/hierarchy && terraform apply -input=false -auto-approve planfileDeja, „Terraform GitLab“ teikėjas turi plūduriuojančią funkciją . Tada turėsite rankiniu būdu ištrinti nesuderinamus projektus, kad būtų ištaisyta tf.state. Tada iš naujo paleiskite komandą „$make all“.
Žingsnis 9. Vietines saugyklas perkeliame į serverį.
$ 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)Atlikta:


išvada
Pasiekėme, kad viską galime tvarkyti deklaratyviai iš savo vietinės mašinos. Dabar noriu perkelti visas šias užduotis į CI ir tiesiog paspauskite mygtukus. Norėdami tai padaryti, turime perkelti savo vietines valstijas (Terraformos būseną) į CI. Kaip tai padaryti – kitoje dalyje.
Užsiprenumeruokite mūsų kad nepraleistumėte naujų straipsnių!
Šaltinis: www.habr.com
