Hvad kom først - hønen eller ægget? En ret mærkelig start på en artikel om Infrastructure-as-Code, ikke?
Hvad er et æg?
Oftest er Infrastructure-as-Code (IaC) en deklarativ måde at repræsentere infrastruktur på. I den beskriver vi den tilstand, vi ønsker at opnå, startende fra hardwaredelen og slutter med softwarekonfigurationen. Derfor bruges IaC til:
- Tilvejebringelse af ressourcer. Disse er VM'er, S3, VPC osv. Grundlæggende værktøjer til arbejdet:
terraform иCloudFormation . Software Configuration . Grundlæggende værktøjer:Ansible , kok osv.
Enhver kode er i git repositories. Og før eller siden vil teamlederen beslutte, at de skal bringes i orden. Og han vil refaktorisere. Og det vil skabe noget struktur. Og han vil se, at det er godt.
Det er også godt, at det allerede findes
Hvor kom ægget fra?
Så vi nærmer os efterhånden hovedspørgsmålet.
Først og fremmest skal du starte med et depot, der beskriver strukturen af andre depoter, inklusive dig selv. Og selvfølgelig skal du som en del af GitOps tilføje CI, så ændringer udføres automatisk.
Hvis Git ikke er blevet oprettet endnu?
- Hvordan gemmer man det i Git?
- Hvordan installeres CI?
- Hvis vi også implementerer Gitlab ved hjælp af IaC, og endda i Kubernetes?
- Og GitLab Runner også i Kubernetes?
- Hvad med Kubernetes i cloud-udbyderen?
Hvad kom først: GitLab, hvor jeg uploader min kode, eller koden, der beskriver, hvilken slags GitLab jeg har brug for?
Kylling med æg
«Oyakodon 3 med en dinosaur" [src ]
Lad os prøve at tilberede en ret ved at bruge som en cloud-udbyder
TL; DR
Er det muligt at deltage i et hold på én gang?
$ export MY_SELECTEL_TOKEN=<token>
$ curl https://gitlab.com/chicken-or-egg/mks/make/-/snippets/2002106/raw | bash
Ingredienser:
- Konto fra my.selectel.ru;
- Konto token;
- Kubernetes færdigheder;
- Hjelmfærdigheder;
- Terraform færdigheder;
- Hjelmdiagram GitLab;
- Hjelmdiagram GitLab Runner.
opskrift:
- Hent MY_SELECTEL_TOKEN fra panelet my.selectel.ru.
- Opret en Kubernetes-klynge ved at overføre et kontotoken til den.
- Hent KUBECONFIG fra den oprettede klynge.
- Installer GitLab på Kubernetes.
- Få GitLab-token fra GitLab oprettet til bruger rod.
- Opret en projektstruktur i GitLab ved hjælp af GitLab-token.
- Skub eksisterende kode til GitLab.
- ???
- Profit!
Trin 1. Tokenet kan fås i afsnittet
Trin 2. Vi forbereder vores Terraform til at "bage" en klynge af 2 noder. Hvis du er sikker på, at du har nok ressourcer til alt, så 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",
}
}
Tilføj en bruger til projektet:
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
}
Produktion:
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 lancerer:
$ 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
Trin 3. Vi får cubeconfig.
For at downloade KUBECONFIG programmatisk skal du få et token fra OpenStack:
openstack token issue -c id -f value > token
Og med dette token lav en anmodning til Managed Kubernetes Selectel API. k8s_id problemer terra form:
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å tilgås via panelet.
Trin 4. Efter at klyngen er bagt, og vi har adgang til den, kan vi tilføje yaml på toppen efter smag.
Jeg foretrækker at tilføje:
- navneområde,
- opbevaringsklasse
- pod sikkerhedspolitik og så videre.
Siden jeg oprindeligt valgte en klynge i zonen ru-3a, så har jeg brug for Storage Class fra denne zone.
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
Trin 5. Installer en belastningsbalancer.
Vi vil bruge standarden til mange nginx-indtrængen. Der er allerede masser af instruktioner til at installere det, så vi vil ikke dvæle 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 modtager en ekstern IP i cirka 3-4 minutter:
Modtaget ekstern IP:
Trin 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"
Igen venter vi på, at alle bælgerne rejser sig.
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...
Bælgene steg:
Trin 7. Vi modtager GitLab-token.
Find først login-adgangskoden:
kubectl get secret -n gitlab gitlab-gitlab-initial-root-password -o jsonpath='{.data.password}' | base64 --decode
Lad os nu logge ind og få et token:
python3 get_gitlab_token.py root $GITLAB_PASSWORD http://gitlab.gitlab.$EXTERNAL_IP.nip.io
Trin 8. At bringe Git-lagre til det korrekte hierarki ved hjælp af Gitlab-udbyderen.
cd ../internal/gitlab/hierarchy && terraform apply -input=false -auto-approve planfile
Desværre har terraform GitLab-udbyderen en flydende
insekt . Så bliver du nødt til at slette de modstridende projekter manuelt, for at tf.state kan rettes. Kør derefter kommandoen `$make all` igen
Trin 9. Vi overfører lokale arkiver 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:
Konklusion
Vi har opnået, at vi kan styre alt deklarativt fra vores lokale maskine. Nu vil jeg overføre alle disse opgaver til CI og bare trykke på knapper. For at gøre dette skal vi overføre vores lokale stater (Terraform-staten) til CI. Hvordan man gør dette er i næste del.
Abonner på vores
blog for ikke at gå glip af udgivelsen af nye artikler!
Kilde: www.habr.com