Kas bija pirmais - vista vai ola? Diezgan dīvains sākums rakstam par Infrastructure-as-Code, vai ne?
Kas ir ola?
Visbiežāk Infrastruktūra kā kods (IaC) ir deklaratīvs infrastruktūras attēlošanas veids. Tajā mēs aprakstām stāvokli, kuru vēlamies sasniegt, sākot no aparatūras daļas un beidzot ar programmatūras konfigurāciju. Tāpēc IaC izmanto:
- Resursu nodrošināšana. Tie ir virtuālās mašīnas, S3, VPC utt. Pamatrīki darbam:
Terraform иMākoņu veidošanās . Programmatūras konfigurācija . Pamatrīki:Iespējams , šefpavārs utt.
Jebkurš kods atrodas git krātuvēs. Un agri vai vēlu komandas vadītājs nolems, ka tie ir jāsaved kārtībā. Un viņš reaģēs. Un tas radīs kādu struktūru. Un viņš redzēs, ka tas ir labi.
Ir arī labi, ka tas jau pastāv
No kurienes radās ola?
Tātad mēs pamazām tuvojamies galvenajam jautājumam.
Pirmkārt, jums ir jāsāk ar repozitoriju, kas apraksta citu repozitoriju struktūru, tostarp jūs pašu. Un, protams, kā daļa no GitOps jums ir jāpievieno CI, lai izmaiņas tiktu izpildītas automātiski.
Ja Git vēl nav izveidots?
- Kā to uzglabāt Git?
- Kā instalēt CI?
- Ja mēs arī izvietosim Gitlab, izmantojot IaC un pat Kubernetes?
- Un GitLab Runner arī Kubernetes?
- Kā ar Kubernetes mākoņpakalpojumā?
Kas bija pirmais: GitLab, kurā es augšupielādēšu savu kodu, vai kods, kas apraksta, kāda veida GitLab man ir nepieciešams?
Vistas gaļa ar olām
«Oyakodon 3 ar dinozauru" [src ]
Mēģināsim pagatavot ēdienu, izmantojot mākoņa pakalpojumu sniedzēju
TL; DR
Vai ir iespējams iekļauties vienā komandā uzreiz?
$ export MY_SELECTEL_TOKEN=<token>
$ curl https://gitlab.com/chicken-or-egg/mks/make/-/snippets/2002106/raw | bash
Sastāvdaļas:
- Konts no my.selectel.ru;
- Konta marķieris;
- Kubernetes prasmes;
- Stūres prasmes;
- Terraform prasmes;
- Stūres diagramma GitLab;
- Stūres diagramma GitLab Runner.
recepte:
- Iegūstiet MY_SELECTEL_TOKEN no paneļa my.selectel.ru.
- Izveidojiet Kubernetes klasteru, pārsūtot uz to konta pilnvaru.
- Iegūstiet KUBECONFIG no izveidotā klastera.
- Instalējiet GitLab vietnē Kubernetes.
- Iegūstiet lietotājam izveidoto GitLab marķieri no GitLab sakne.
- Izveidojiet projekta struktūru GitLab, izmantojot GitLab marķieri.
- Nosūtiet esošo kodu GitLab.
- ?
- Peļņa!
Solis 1. Žetonu var iegūt sadaļā
Solis 2. Mēs sagatavojam savu Terraform 2 mezglu kopas “izcepšanai”. Ja esat pārliecināts, ka jums ir pietiekami daudz resursu visam, varat iespējot automātiskās 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",
}
}
Pievienojiet projektam lietotāju:
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
}
Izvade:
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
}
Mēs uzsākam:
$ 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
Solis 3. Mēs iegūstam cubeconfig.
Lai programmatiski lejupielādētu KUBECONFIG, jums ir jāsaņem marķieris no OpenStack:
openstack token issue -c id -f value > token
Un ar šo pilnvaru iesniedziet pieprasījumu pārvaldītajai Kubernetes Selectel API. k8s_id izdala terraform:
curl -XGET -H "x-auth-token: $(cat token)" "https://ru-3.mks.selcloud.ru/v1/clusters/$(cat k8s_id)/kubeconfig" -o kubeConfig.yaml
Cupconfig var piekļūt arī caur paneli.
Solis 4. Pēc tam, kad ķekars ir izcepts un mums tas ir pieejams, mēs varam pievienot yaml virsū pēc garšas.
Es gribētu pievienot:
- nosaukumvieta
- uzglabāšanas klase
- pod drošības politika un tā tālāk.
Tā kā sākotnēji es izvēlējos kopu zonā lv-3a, tad man ir nepieciešama krātuves klase no šīs zonas.
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
Solis 5. Uzstādiet slodzes balansētāju.
Mēs daudziem izmantosim standarta nginx-ingress. Tā instalēšanai jau ir daudz instrukciju, tāpēc mēs pie tā nekavēsimies.
$ 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
Mēs gaidām, līdz tas saņems ārēju IP aptuveni 3-4 minūtes:
Saņemtais ārējais IP:
Solis 6. Instalējiet 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"
Atkal mēs gaidām, kad visas pākstis pacelsies.
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...
Pākstis pieauga:
Solis 7. Mēs saņemam GitLab marķieri.
Vispirms noskaidrojiet pieteikšanās paroli:
kubectl get secret -n gitlab gitlab-gitlab-initial-root-password -o jsonpath='{.data.password}' | base64 --decode
Tagad pieteiksimies un saņemsim marķieri:
python3 get_gitlab_token.py root $GITLAB_PASSWORD http://gitlab.gitlab.$EXTERNAL_IP.nip.io
Solis 8. Git krātuvju ievietošana pareizajā hierarhijā, izmantojot Gitlab nodrošinātāju.
cd ../internal/gitlab/hierarchy && terraform apply -input=false -auto-approve planfile
Diemžēl terraform GitLab nodrošinātājam ir peldošs
kļūda . Pēc tam konfliktējošie projekti būs manuāli jāizdzēš, lai tf.state tiktu labots. Pēc tam atkārtoti palaidiet komandu $make all
Solis 9. Mēs pārsūtām lokālās krātuves uz serveri.
$ 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)
Gatavs:
Secinājums
Esam panākuši, ka visu varam deklaratīvi pārvaldīt no mūsu vietējās mašīnas. Tagad es vēlos pārsūtīt visus šos uzdevumus uz CI un vienkārši nospiediet pogas. Lai to izdarītu, mūsu vietējie štati (Terraforma štats) ir jāpārnes uz CI. Kā to izdarīt, ir nākamajā daļā.
Abonējiet mūsu
blog lai nepalaistu garām jaunu rakstu iznākšanu!
Avots: www.habr.com