
Zer izan zen lehen - oilaskoa ala arrautza? Nahiko hasiera bitxia Infrastructure-as-Code-ri buruzko artikulu batentzat, ezta?
Zer da arrautza?
Gehienetan, Infrastructure-as-Code (IaC) azpiegiturak irudikatzeko modu deklaratiboa da. Bertan lortu nahi dugun egoera deskribatzen dugu, hardware zatitik hasi eta software konfigurazioarekin amaituz. Beraz, IaC hauetarako erabiltzen da:
- Baliabideen hornidura. Hauek VM, S3, VPC, etab. Lanerako oinarrizko tresnak: и .
- . Oinarrizko tresnak: , sukaldaria, etab.
Edozein kodea git biltegietan dago. Eta lehenago edo beranduago taldeburuak erabakiko du ordenatu behar direla. Eta birfaktorea egingo du. Eta egituraren bat sortuko du. Eta hori ona dela ikusiko du.
Dagoeneko existitzea ere ona da и -Terraform-en hornitzailea (eta hau Software Konfigurazioa da). Haien laguntzarekin, proiektu osoa kudeatu dezakezu: taldekideak, CI/CD, git-flow, etab.
Nondik atera zen arrautza?
Beraz, pixkanaka galdera nagusira hurbiltzen ari gara.
Lehenik eta behin, beste biltegi batzuen egitura deskribatzen duen biltegi batekin hasi behar duzu, zuk zeuk barne. Eta noski, GitOps-en zati gisa, CI gehitu behar duzu aldaketak automatikoki exekutatu daitezen.
Git oraindik sortu ez bada?
- Nola gorde Git-en?
- Nola instalatu CI?
- Gitlab ere zabaltzen badugu IaC erabiliz, eta baita Kubernetes-en ere?
- Eta GitLab Runner-ek Kubernetesen ere?
- Zer gertatzen da Kubernetes hodeiko hornitzailean?
Zer izan zen lehenik: nire kodea igoko dudan GitLab-a, edo zer nolako GitLab behar dudan deskribatzen duen kodea?
Oilaskoa arrautzekin
«3 dinosauro batekin" []
Saia gaitezen plater bat prestatzen hodeiko hornitzaile gisa erabiliz .
TL; DR
Posible al da talde batean aldi berean sartzea?
$ export MY_SELECTEL_TOKEN=<token>
$ curl https://gitlab.com/chicken-or-egg/mks/make/-/snippets/2002106/raw | bashOsagaiak:
- my.selectel.ru-ko kontua;
- Kontuaren tokena;
- Kubernetes gaitasunak;
- Helmuga Trebetasunak;
- Terraform Trebetasunak;
- Helm taula GitLab;
- Helm taula GitLab Runner.
errezeta:
- Lortu MY_SELECTEL_TOKEN paneletik my.selectel.ru.
- Sortu Kubernetes kluster bat hari kontu-token bat transferituz.
- Lortu KUBECONFIG sortutako klusteretik.
- Instalatu GitLab Kubernetes-en.
- Eskuratu erabiltzailearentzako sortutako GitLab-etik GitLab-tokena root.
- Sortu proiektuaren egitura GitLab-en GitLab-token erabiliz.
- Bidali lehendik dagoen kodea GitLab-era.
- ?
- Irabazi asmorik!
Urratsera 1. Tokena atalean lor daiteke .
Urratsera 2. Gure Terraform 2 nodo multzo bat "labean" egiteko prestatzen dugu. Ziur bazaude guztietarako nahikoa baliabide dituzula, orduan automatikoki kuotak gaitu ditzakezu:
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",
}
}Gehitu erabiltzaile bat proiektuan:
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
}Irteera:
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
}Abiarazi dezagun:
$ 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 
Urratsera 3. cubeconfig lortuko dugu.
KUBECONFIG programatikoki deskargatzeko, OpenStack-etik token bat lortu behar duzu:
openstack token issue -c id -f value > tokenEta token honekin eskaera bat egin Kubernetes Selectel API kudeatzaileari. k8s_id gaiak terraform:
curl -XGET -H "x-auth-token: $(cat token)" "https://ru-3.mks.selcloud.ru/v1/clusters/$(cat k8s_id)/kubeconfig" -o kubeConfig.yamlCupconfig panelaren bidez ere sar daiteke.

Urratsera 4. Klusterra labean jarri eta horretarako sarbidea izan ondoren, gainean yaml gehitu dezakegu dastatzeko.
Nahiago dut gehitu:
- izen-espazioa
- biltegiratze klasea
- pod segurtasun politika eta abar.
for Selectel-etik har daiteke .
Hasieran eremuan kluster bat hautatu nuenetik ru-3a, orduan eremu honetako Biltegiratze Klasea behar dut.
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: trueUrratsera 5. Instalatu karga-orekatzailea.
Askorentzat estandarra erabiliko dugu nginx-sarrera. Dagoeneko instalatzeko argibide ugari daude, beraz, ez gara horretan geldituko.
$ 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.ymlKanpoko IP bat jaso arte itxarongo dugu 3-4 minutu inguru:

Jasotako kanpoko IPa:

Urratsera 6. Instalatu 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"Berriz ere leka guztiak igo arte itxarongo dugu.
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...Lekak altxatu ziren:

Urratsera 7. GitLab-tokena jasotzen dugu.
Lehenik eta behin, bilatu saioa hasteko pasahitza:
kubectl get secret -n gitlab gitlab-gitlab-initial-root-password -o jsonpath='{.data.password}' | base64 --decodeOrain saioa egin dezagun eta lortu token bat:
python3 get_gitlab_token.py root $GITLAB_PASSWORD http://gitlab.gitlab.$EXTERNAL_IP.nip.ioUrratsera 8. Git biltegiak hierarkia egokira ekartzea Gitlab hornitzailea erabiliz.
cd ../internal/gitlab/hierarchy && terraform apply -input=false -auto-approve planfileZoritxarrez, terraform GitLab hornitzaileak flotagarria du . Orduan gatazkan dauden proiektuak eskuz ezabatu beharko dituzu tf.state konpondu ahal izateko. Ondoren, berriro exekutatu `$make all` komandoa
Urratsera 9. Tokiko biltegiak zerbitzarira transferitzen ditugu.
$ 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)Amaitu:


Ondorioa
Gure tokiko makinatik dena modu deklaratiboan kudeatu ahal izatea lortu dugu. Orain zeregin horiek guztiak CIra transferitu nahi ditut eta botoiak sakatu besterik ez dut. Horretarako, gure tokiko estatuak (Terraform estatua) CIra transferitu behar ditugu. Nola egin hurrengo zatian dago.
Harpidetu gure artikulu berrien kaleratzea ez galtzeko!
Iturria: www.habr.com
