Mis oli enne – kana või muna? Üsna kummaline algus artiklile Infrastructure-as-Code, kas pole?
Mis on muna?
Enamasti on Infrastructure-as-Code (IaC) taristu deklaratiivne esitusviis. Selles kirjeldame olekut, mida soovime saavutada, alustades riistvaraosast ja lõpetades tarkvara konfiguratsiooniga. Seetõttu kasutatakse IaC-d:
- Ressursi pakkumine. Need on VM-id, S3, VPC jne. Põhilised töövahendid:
Terraform иPilve moodustumine . Tarkvara konfigureerimine . Põhilised tööriistad:Võimalik , kokk jne.
Iga kood on giti hoidlates. Ja varem või hiljem otsustab meeskonna juht, et need tuleb korda teha. Ja ta reageerib. Ja see loob mingi struktuuri. Ja ta näeb, et see on hea.
Hea on ka see, et see on juba olemas
Kust muna tuli?
Seega läheneme järk-järgult põhiküsimusele.
Kõigepealt peate alustama hoidlast, mis kirjeldab teiste hoidlate, sealhulgas teie enda struktuuri. Ja loomulikult peate GitOpsi osana lisama CI, et muudatused täidetaks automaatselt.
Kui Git pole veel loodud?
- Kuidas seda Gitis salvestada?
- Kuidas installida CI?
- Kui juurutame Gitlabi ka IaC-ga ja isegi Kubernetesis?
- Ja GitLab Runner ka Kubernetesis?
- Aga Kubernetes pilveteenuse pakkujas?
Mis oli enne: GitLab, kuhu ma oma koodi üles laadin, või kood, mis kirjeldab, millist GitLabi ma vajan?
Kana munaga
«Oyakodon 3 dinosaurusega" [src ]
Proovime valmistada roogi pilveteenuse pakkujana
TL; DR
Kas on võimalik ühe meeskonnaga korraga liituda?
$ export MY_SELECTEL_TOKEN=<token>
$ curl https://gitlab.com/chicken-or-egg/mks/make/-/snippets/2002106/raw | bash
Koostis:
- konto saidilt my.selectel.ru;
- konto tunnus;
- Kubernetese oskused;
- Helmi oskused;
- Terraformi oskused;
- Helm diagramm GitLab;
- Helmi diagramm GitLabi jooksja.
Retsept:
- Hankige paneelilt MY_SELECTEL_TOKEN my.selectel.ru.
- Looge Kubernetese klaster, teisaldades sellele konto märgi.
- Hankige loodud klastrist KUBECONFIG.
- Installige GitLab Kubernetesesse.
- Hankige kasutaja jaoks loodud GitLab-märk GitLabist juur.
- Looge GitLabis projekti struktuur GitLab-tokeni abil.
- Lükake olemasolev kood GitLabi.
- ?
- Kasum!
Samm 1. Märki saab sektsioonist
Samm 2. Valmistame oma Terraformi ette kahest sõlmest koosneva klastri “küpsetamiseks”. Kui olete kindel, et teil on kõige jaoks piisavalt ressursse, saate lubada automaatsed kvoodid:
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",
}
}
Lisage projekti kasutaja:
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=<token>
terraform plan -out planfile
$ terraform apply -input=false -auto-approve planfile
Samm 3. Saame cubeconfigi.
Rakenduse KUBECONFIG programmiliseks allalaadimiseks peate hankima OpenStackist loa:
openstack token issue -c id -f value > token
Ja selle märgiga esitage taotlus hallatud Kubernetes Selecteli API-le. k8s_id annab välja terra vorm:
curl -XGET -H "x-auth-token: $(cat token)" "https://ru-3.mks.selcloud.ru/v1/clusters/$(cat k8s_id)/kubeconfig" -o kubeConfig.yaml
Cupconfigile pääseb juurde ka paneeli kaudu.
Samm 4. Kui kobar on küpsetatud ja meil on sellele juurdepääs, võime maitse järgi lisada yamli.
Eelistan lisada:
- nimeruum
- ladustamisklass
- pod turvapoliitika ja nii edasi.
Kuna algselt valisin tsoonis klastri ru-3a, siis on mul vaja selle tsooni salvestusklassi.
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
Samm 5. Paigaldage koormuse tasakaalustaja.
Kasutame paljude jaoks standardset nginx-ingress. Selle installimiseks on juba palju juhiseid, nii et me ei peatu sellel.
$ 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
Ootame välise IP-aadressi saamist umbes 3-4 minutit:
Vastu võetud väline IP:
Samm 6. Installige 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"
Jällegi ootame, kuni kõik kaunad kerkivad.
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...
Kaunad tõusid:
Samm 7. Saame GitLab-tokeni.
Esmalt uurige sisselogimisparooli:
kubectl get secret -n gitlab gitlab-gitlab-initial-root-password -o jsonpath='{.data.password}' | base64 --decode
Nüüd logime sisse ja hankime märgi:
python3 get_gitlab_token.py root $GITLAB_PASSWORD http://gitlab.gitlab.$EXTERNAL_IP.nip.io
Samm 8. Git-hoidlate viimine õigesse hierarhiasse Gitlabi pakkuja abil.
cd ../internal/gitlab/hierarchy && terraform apply -input=false -auto-approve planfile
Kahjuks on terraform GitLabi pakkujal ujuv
viga . Seejärel peate faili tf.state parandamiseks konfliktsed projektid käsitsi kustutama. Seejärel käivitage käsk $make all uuesti
Samm 9. Edastame kohalikud hoidlad serverisse.
$ 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)
Valmis:
Järeldus
Oleme saavutanud selle, et saame kõike deklaratiivselt oma kohalikust masinast hallata. Nüüd tahan kõik need ülesanded CI-sse üle kanda ja lihtsalt vajutada nuppe. Selleks peame oma kohalikud osariigid (Terraform State) üle kandma CI-le. Kuidas seda teha, on järgmises osas.
Telli meie
blog et mitte ilma jääda uute artiklite ilmumisest!
Allikas: www.habr.com