Hva kom først - kyllingen eller egget? En ganske merkelig start på en artikkel om Infrastructure-as-Code, ikke sant?
Hva er et egg?
Oftest er Infrastructure-as-Code (IaC) en deklarativ måte å representere infrastruktur på. I den beskriver vi tilstanden vi ønsker å oppnå, fra maskinvaredelen og slutter med programvarekonfigurasjonen. Derfor brukes IaC til:
- Ressursavsetning. Dette er VM-er, S3, VPC, etc. Grunnleggende verktøy for arbeid:
terra иCloudFormation . Programvarekonfigurasjon . Grunnleggende verktøy:Ansible , kokk, etc.
Enhver kode er i git-repositories. Og før eller siden vil teamlederen bestemme at de må settes i stand. Og han vil refaktorere. Og det vil skape litt struktur. Og han vil se at dette er bra.
Det er også bra at det allerede finnes
Hvor kom egget fra?
Så vi nærmer oss etter hvert hovedspørsmålet.
Først av alt må du starte med et depot som beskriver strukturen til andre depoter, inkludert deg selv. Og selvfølgelig, som en del av GitOps, må du legge til CI slik at endringer utføres automatisk.
Hvis Git ikke er opprettet ennå?
- Hvordan lagrer jeg det i Git?
- Hvordan installerer jeg CI?
- Hvis vi også distribuerer Gitlab ved hjelp av IaC, og til og med i Kubernetes?
- Og GitLab Runner også i Kubernetes?
- Hva med Kubernetes i skyleverandøren?
Hva kom først: GitLab hvor jeg skal laste opp koden min, eller koden som beskriver hva slags GitLab jeg trenger?
Kylling med egg
«Oyakodon 3 med en dinosaur" [src ]
La oss prøve å lage en rett ved å bruke som en skyleverandør
TL; DR
Er det mulig å bli med i ett lag samtidig?
$ export MY_SELECTEL_TOKEN=<token>
$ curl https://gitlab.com/chicken-or-egg/mks/make/-/snippets/2002106/raw | bash
Ingredienser:
- Konto fra my.selectel.ru;
- Kontotoken;
- Kubernetes ferdigheter;
- Rorferdigheter;
- Terraform ferdigheter;
- Hjelmdiagram GitLab;
- Hjelmdiagram GitLab Runner.
oppskrift:
- Få MY_SELECTEL_TOKEN fra panelet my.selectel.ru.
- Opprett en Kubernetes-klynge ved å overføre et kontotoken til den.
- Få KUBECONFIG fra den opprettede klyngen.
- Installer GitLab på Kubernetes.
- Få GitLab-token fra GitLab laget for bruker root.
- Lag en prosjektstruktur i GitLab ved hjelp av GitLab-token.
- Skyv eksisterende kode til GitLab.
- ?
- Fortjeneste!
Trinn 1. Tokenet kan fås i seksjonen
Trinn 2. Vi forbereder vår Terraform for å "bake" en klynge med 2 noder. Hvis du er sikker på at du har nok ressurser til alt, kan du aktivere automatiske kvoter:
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",
}
}
Legg til en bruker i prosjektet:
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
}
Produksjon:
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
}
Vi lanserer:
$ 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
Trinn 3. Vi får cubeconfig.
For å laste ned KUBECONFIG programmatisk, må du få et token fra OpenStack:
openstack token issue -c id -f value > token
Og med dette tokenet, send en forespørsel til Managed Kubernetes Selectel API. k8s_id gir ut terra:
curl -XGET -H "x-auth-token: $(cat token)" "https://ru-3.mks.selcloud.ru/v1/clusters/$(cat k8s_id)/kubeconfig" -o kubeConfig.yaml
Cupconfig kan også nås gjennom panelet.
Trinn 4. Etter at klyngen er bakt og vi har tilgang til den, kan vi tilsette yaml på toppen etter smak.
Jeg foretrekker å legge til:
- navneområde,
- lagringsklasse
- pod sikkerhetspolitikk og så videre.
Siden jeg først valgte en klynge i sonen ru-3a, så trenger jeg lagringsklassen fra denne sonen.
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
Trinn 5. Installer en lastbalanser.
Vi vil bruke standarden for mange nginx-inngang. Det er allerede mange instruksjoner for å installere det, så vi vil ikke dvele ved det.
$ 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
Vi venter på at den skal motta en ekstern IP i omtrent 3-4 minutter:
Mottatt ekstern IP:
Trinn 6. Installer 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"
Igjen venter vi på at alle belgene skal reise seg.
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...
Belgene steg:
Trinn 7. Vi mottar GitLab-token.
Først, finn ut påloggingspassordet:
kubectl get secret -n gitlab gitlab-gitlab-initial-root-password -o jsonpath='{.data.password}' | base64 --decode
La oss nå logge på og få et token:
python3 get_gitlab_token.py root $GITLAB_PASSWORD http://gitlab.gitlab.$EXTERNAL_IP.nip.io
Trinn 8. Bringe Git-depoter til det riktige hierarkiet ved å bruke Gitlab-leverandøren.
cd ../internal/gitlab/hierarchy && terraform apply -input=false -auto-approve planfile
Dessverre har terraform GitLab-leverandøren en flytende
feil . Deretter må du slette de motstridende prosjektene manuelt for at tf.state skal fikses. Kjør deretter kommandoen `$make all` på nytt
Trinn 9. Vi overfører lokale depoter til serveren.
$ 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)
Finish:
Konklusjon
Vi har oppnådd at vi kan administrere alt deklarativt fra vår lokale maskin. Nå vil jeg overføre alle disse oppgavene til CI og bare trykke på knapper. For å gjøre dette, må vi overføre våre lokale stater (Terraform state) til CI. Hvordan du gjør dette er i neste del.
Abonner på vår
blogg for ikke å gå glipp av utgivelsen av nye artikler!
Kilde: www.habr.com