
Mis on enne tulnud — kana või muna? See on üsna veider algus artiklile Infrastructure-as-Code'ist, kas pole?
Mis on muna?
Lähitulevikus on Infrastructure-as-Code (IaC) deklareeriv viis infrastruktuuri esitlemiseks. Sellega kirjeldame olekut, mida soovime saavutada, alates riistvarast kuni tarkvara konfiguratsioonini. Seetõttu kasutatakse IaC-d järgmiseks:
- Ressursside hooldus. Need on VMs, S3, VPC jne. Peamised tööriistad on: ja .
- . Peamised tööriistad: , Chef jne.
Iga kood asub git-repositooriumides. Ja varem või hiljem otsustab tiimijuht, et neid tuleks korrastada. Ta peab neid refaktoreerima. Ja ta loob teatud struktuuri. Ja ta näeb, et see on hea.
Samuti on hea, et juba eksisteerib ja -teenus Terraformi jaoks (ja see on Tarkvara konfiguratsioon). Nende abil on võimalik hallata kogu projekti: meeskonna liikmeid, CI/CD, git-flow jne.
Kust tuli muna?
Siin me lähme järk-järgult põhiküsimuse juurde.
Esiteks tuleb alustada repositooriumist, mis kirjeldab teiste repositooriumide struktuuri, sealhulgas enda oma. Ja muidugi, GitOps'i raames tuleb lisada CI, et muudatused toimuksid automaatselt.
Mis siis, kui Git veel loodud ei ole?
- Kuidas seda Git'is hoida?
- Kuidas lisada CI?
- Kui me ka Gitlabi käivitame IaC abil ja veel Kuberneteses?
- Ja GitLab Runner ka Kuberneteses?
- Aga Kubernetes pilveteenuses?
Mis tuli enne: GitLab, millele ma oma koodi laadin, või kood, mis kirjeldab, milline GitLab mul vaja on?
Kana koos munadega
«3 koos dinosaurusega» []
Proovime valmistada rooga, kasutades pilveteenuse pakkujana .
TL;DR
Kas oleks võimalik, et kõik koos ühte käsu?
$ export MY_SELECTEL_TOKEN=
$ curl https://gitlab.com/chicken-or-egg/mks/make/-/snippets/2002106/raw | bashKoostisosad:
- Kontod my.selectel.ru-st;
- Kontotoken;
- Kubernetes oskused;
- Helm oskused;
- Terraform oskused;
- Helm chart GitLab;
- Helm chart GitLab Runner.
Retsept:
- Saada MY_SELECTEL_TOKEN juhtpaneelilt my.selectel.ru.
- Loo Kubernetes klaster, edastades sinna konto token.
- Saada KUBECONFIG loodud klastri abil.
- Paigaldage GitLab Kubernetesesse.
- Saada GitLab-token loodud GitLab'ilt kasutajale root.
- Loo projektide struktuur GitLab'is, kasutades GitLab-tokenit.
- Pushige olemasolev kood GitLab'i.
- ???
- Kasum!
Samm 1. Tokenit saab saada sektsioonis .
Samm 2. Valmistame oma Terraformi 2 sõlme klastrite "küpsetamiseks". Kui olete kindel, et teil on piisavalt ressursse, siis võite sisse lülitada automaatsed kvotid:
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",
}
}Lisame kasutaja projekti:
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
}Väljund:
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
}Käivitame:
$ 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 
Samm 3. Saame k8s konfi.
Et KUBECONFIGi programmeerimise teel alla laadida, tuleb OpenStackist token saada:
openstack token issue -c id -f value > tokenJa juba sellega teha päring Managed Kubernetes Selectel API-le. k8s_id tagastab terraform:
curl -XGET -H "x-auth-token: $(cat token)" "https://ru-3.mks.selcloud.ru/v1/clusters/$(cat k8s_id)/kubeconfig" -o kubeConfig.yamlKubeconfigi saab ka paneeli kaudu.

Samm 4. Pärast seda, kui klaster on loodud ja meil on sellele juurdepääs, saame lisada oma maitse järgi yaml.
Eelistaksin lisada:
- namespace,
- storage class,
- pod security policy ja muud.
Selecteli jaoks võib võtta .
Kuna alguses valisin klastrit tsoonis ru-3a, siis pean samuti Storage Class'i saama sellest tsoonist.
tüüp: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
nimi: fast.ru-3a
annotatsioonid:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: cinder.csi.openstack.org
parameetrid:
tüüp: fast.ru-3a
kättesaadavus: ru-3a
allowVolumeExpansion: trueSamm 5. Seame koormuse tasakaalustaja.
Kasutame paljude jaoks standardset nginx-ingress. Installimise juhiseid on juba piisavalt, nii et ei jää sellele pidama.
$ 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.ymlOotame, kuni see saab välist IP, umbes 3-4 minutit:

Sai väline IP:

Samm 6. Installime GitLabi.
$ 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"Ootame jälle, kuni kõik podid tõusevad.
kubectl get po -n gitlab
NIMI VALMIS STS TAASKÄIVITUSED VANUS
gitlab-gitaly-0 0/1 Ootejärjekord 0 0s
gitlab-gitlab-exporter-88f6cc8c4-fl52d 0/1 Ootejärjekord 0 0s
gitlab-gitlab-runner-6b6867c5cf-hd9dp 0/1 Ootejärjekord 0 0s
gitlab-gitlab-shell-55cb6ccdb-h5g8x 0/1 Algus:0/2 0 0s
gitlab-migrations.1-2cg6n 0/1 Ootejärjekord 0 0s
gitlab-minio-6dd7d96ddb-zd9j6 0/1 Ootejärjekord 0 0s
gitlab-minio-create-buckets.1-bncdp 0/1 Ootejärjekord 0 0s
gitlab-postgresql-0 0/2 Ootejärjekord 0 0s
gitlab-prometheus-server-6cfb57f575-v8k6j 0/2 Ootejärjekord 0 0s
gitlab-redis-master-0 0/2 Ootejärjekord 0 0s
gitlab-registry-6bd77b4b8c-pb9v9 0/1 Ootejärjekord 0 0s
gitlab-registry-6bd77b4b8c-zgb6r 0/1 Algus:0/2 0 0s
gitlab-shared-secrets.1-pc7-5jgq4 0/1 Täidetud 0 20s
gitlab-sidekiq-all-in-1-v1-54dbcf7f5f-qbq67 0/1 Ootejärjekord 0 0s
gitlab-task-runner-6fd6857db7-9x567 0/1 Ootejärjekord 0 0s
gitlab-webservice-d9d4fcff8-hp8wl 0/2 Ootejärjekord 0 0s
Ootame gitlab
./wait_gitlab.sh ../internal/gitlab/gitlab/.pods
ootame poodi...
ootame poodi...
ootame poodi...Podid on tõusnud:

Samm 7. Saame GitLab-tokeni.
Esmalt saame sisse logimise parooli:
kubectl get secret -n gitlab gitlab-gitlab-initial-root-password -o jsonpath='{.data.password}' | base64 --decodeNüüd autentime ja saame tokeni:
python3 get_gitlab_token.py root $GITLAB_PASSWORD http://gitlab.gitlab.$EXTERNAL_IP.nip.ioSamm 8. Asetame Git-reposid õigele hierarhiale Gitlab Provideriga.
cd ../internal/gitlab/hierarchy && terraform apply -input=false -auto-approve planfileKahjuks on terraform GitLab provideris probleemne . Siis tuleb eemaldada konfliktivad projektid käsitsi, et tf.state parandus toimuks. Seejärel käivitage käsk `$ make all`
Samm 9. Edastame kohalikke repo-serverisse.
$ make push
[master (root-commit) b61d977] Esmase kohustus
3 failide muudatust, 46 lisamisi(+)
loo režiim 100644 .gitignore
loo režiim 100644 values.yml
Objektide loendamine: 5, valmis.
Objektide loendamine: 100% (5/5), valmis.
Delta tihendamine kasutades kuni 8 niiti
Objektide tihendamine: 100% (5/5), valmis.
Objektide kirjutamine: 100% (5/5), 770 baiti | 770.00 KiB/s, valmis.
Kokku 5 (delta 0), taaskasutatud 0 (delta 0)Valmis:


Kokkuvõte
Oleme saavutanud, et saame oma kohalikust masinast deklaratiivselt kõike hallata. Nüüd tahaksime kõik need ülesanded CI-sse viia ja lihtsalt nuppe vajutada. Selleks tuleb meie kohalikud seisundid (Terraform state) CI-sse edastada. Kuidas seda teha, räägime järgmises osas.
Telli meie , et uusi artiklite väljalaskmisi mitte mööda lasta!
Allikas: habr.com
