Κοτόπουλο ή το αυγό: διαχωρισμός IaC

Κοτόπουλο ή το αυγό: διαχωρισμός IaC
Τι ήρθε πρώτο - το κοτόπουλο ή το αυγό; Πολύ περίεργο ξεκίνημα για ένα άρθρο σχετικά με το Infrastructure-as-Code, έτσι δεν είναι;

Τι είναι το αυγό;

Τις περισσότερες φορές, το Infrastructure-as-Code (IaC) είναι ένας δηλωτικός τρόπος αναπαράστασης της υποδομής. Σε αυτό περιγράφουμε την κατάσταση που θέλουμε να επιτύχουμε, ξεκινώντας από το τμήμα υλικού και τελειώνοντας με τη διαμόρφωση λογισμικού. Επομένως το IaC χρησιμοποιείται για:

  1. Παροχή πόρων. Αυτά είναι VM, S3, VPC κ.λπ. Βασικά εργαλεία για εργασία: Terraform и CloudFormation.
  2. Διαμόρφωση λογισμικού. Βασικά εργαλεία: Πιθανό, σεφ κ.λπ.

Οποιοσδήποτε κώδικας βρίσκεται στα αποθετήρια git. Και αργά ή γρήγορα ο αρχηγός της ομάδας θα αποφασίσει ότι πρέπει να τακτοποιηθούν. Και θα αναπαραστήσει. Και θα δημιουργήσει κάποια δομή. Και θα δει ότι αυτό είναι καλό.

Είναι επίσης καλό που υπάρχει ήδη GitLab и GitHub-παροχέας για Terraform (και αυτό είναι το Software Configuration). Με τη βοήθειά τους, μπορείτε να διαχειριστείτε ολόκληρο το έργο: μέλη της ομάδας, CI/CD, git-flow κ.λπ.

Από πού προήλθε το αυγό;

Άρα πλησιάζουμε σταδιακά στο βασικό ερώτημα.

Πρώτα απ 'όλα, πρέπει να ξεκινήσετε με ένα αποθετήριο που περιγράφει τη δομή άλλων αποθετηρίων, συμπεριλαμβανομένου του εαυτού σας. Και φυσικά, ως μέρος του GitOps, πρέπει να προσθέσετε CI ώστε οι αλλαγές να εκτελούνται αυτόματα.

Εάν το Git δεν έχει δημιουργηθεί ακόμα;

  1. Πώς να το αποθηκεύσετε στο Git;
  2. Πώς να εγκαταστήσετε το CI;
  3. Αν αναπτύξουμε επίσης το Gitlab χρησιμοποιώντας IaC, ακόμα και στο Kubernetes;
  4. Και το GitLab Runner επίσης στο Kubernetes;
  5. Τι γίνεται με το Kubernetes στον πάροχο cloud;

Τι ήρθε πρώτο: το GitLab όπου θα ανεβάσω τον κώδικά μου ή ο κώδικας που περιγράφει τι είδους GitLab χρειάζομαι;

Κοτόπουλο με αυγά

«Oyakodon3 με έναν δεινόσαυρο» [src]

Ας προσπαθήσουμε να μαγειρέψουμε ένα πιάτο χρησιμοποιώντας ως πάροχο cloud Διαχείριση Kubernetes Selectel.

TL? DR

Είναι δυνατόν να μπεις σε μία ομάδα ταυτόχρονα;

$ export MY_SELECTEL_TOKEN=<token>
$ curl https://gitlab.com/chicken-or-egg/mks/make/-/snippets/2002106/raw | bash

Συστατικά:

  • Λογαριασμός από το my.selectel.ru.
  • Διακριτικό λογαριασμού.
  • Δεξιότητες Kubernetes;
  • Helm Skills;
  • Terraform Skills;
  • Διάγραμμα τιμόνι GitLab;
  • Πίνακας τιμονιού GitLab Runner.

Συνταγή:

  1. Λήψη MY_SELECTEL_TOKEN από τον πίνακα my.selectel.ru.
  2. Δημιουργήστε ένα σύμπλεγμα Kubernetes μεταφέροντας ένα διακριτικό λογαριασμού σε αυτό.
  3. Λάβετε το KUBECONFIG από το δημιουργημένο σύμπλεγμα.
  4. Εγκαταστήστε το GitLab στο Kubernetes.
  5. Λάβετε το GitLab-token από το GitLab που δημιουργήθηκε για τον χρήστη ρίζα.
  6. Δημιουργήστε μια δομή έργου στο GitLab χρησιμοποιώντας το GitLab-token.
  7. Σπρώξτε τον υπάρχοντα κώδικα στο GitLab.
  8. ???
  9. Κέρδος!

Βήμα 1. Το διακριτικό μπορεί να ληφθεί στην ενότητα Κλειδιά API.

Κοτόπουλο ή το αυγό: διαχωρισμός IaCΒήμα 2. Ετοιμάζουμε το Terraform μας για το «ψήσιμο» ενός συμπλέγματος 2 κόμβων. Εάν είστε βέβαιοι ότι έχετε αρκετούς πόρους για τα πάντα, τότε μπορείτε να ενεργοποιήσετε τις αυτόματες ποσοστώσεις:

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",
 }
}

Προσθήκη χρήστη στο έργο:

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
}

Παραγωγή:

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
}

Ας ξεκινήσουμε:

$ 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

Κοτόπουλο ή το αυγό: διαχωρισμός IaC
Βήμα 3. Παίρνουμε το cubeconfig.

Για να πραγματοποιήσετε λήψη του KUBECONFIG μέσω προγραμματισμού, πρέπει να λάβετε ένα διακριτικό από το OpenStack:

openstack token issue -c id -f value > token

Και με αυτό το διακριτικό κάντε ένα αίτημα στο Managed Kubernetes Selectel API. k8s_id θέματα τεραφόρμα:

curl -XGET -H "x-auth-token: $(cat token)" "https://ru-3.mks.selcloud.ru/v1/clusters/$(cat k8s_id)/kubeconfig" -o kubeConfig.yaml

Το Cupconfig είναι επίσης προσβάσιμο μέσω του πίνακα.

Κοτόπουλο ή το αυγό: διαχωρισμός IaC
Βήμα 4. Αφού ψηθεί το σύμπλεγμα και έχουμε πρόσβαση σε αυτό, μπορούμε να προσθέσουμε γιαμλ από πάνω για γεύση.

Προτιμώ να προσθέσω:

  • χώρο ονομάτων
  • κατηγορία αποθήκευσης
  • πολιτική ασφαλείας pod και ούτω καθεξής.

Κατηγορία αποθήκευσης για Selectel μπορεί να ληφθεί από επίσημο αποθετήριο.

Αφού αρχικά επέλεξα ένα σύμπλεγμα στη ζώνη ru-3a, τότε χρειάζομαι την κλάση αποθήκευσης από αυτήν τη ζώνη.

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

Βήμα 5. Εγκαταστήστε έναν εξισορροπητή φορτίου.

Θα χρησιμοποιήσουμε το τυπικό για πολλούς nginx-ingress. Υπάρχουν ήδη πολλές οδηγίες για την εγκατάστασή του, οπότε δεν θα σταθούμε σε αυτό.

$ 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

Περιμένουμε να λάβει εξωτερική IP για περίπου 3-4 λεπτά:

Κοτόπουλο ή το αυγό: διαχωρισμός IaC
Λήψη εξωτερικής IP:

Κοτόπουλο ή το αυγό: διαχωρισμός IaC
Βήμα 6. Εγκαταστήστε το 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"

Και πάλι περιμένουμε να ανέβουν όλοι οι λοβοί.

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...

Οι λοβοί αυξήθηκαν:

Κοτόπουλο ή το αυγό: διαχωρισμός IaC
Βήμα 7. Λαμβάνουμε GitLab-token.

Πρώτα, μάθετε τον κωδικό πρόσβασης σύνδεσης:

kubectl get secret -n gitlab gitlab-gitlab-initial-root-password -o jsonpath='{.data.password}' | base64 --decode

Τώρα ας συνδεθούμε και ας λάβουμε ένα διακριτικό:

python3 get_gitlab_token.py root $GITLAB_PASSWORD http://gitlab.gitlab.$EXTERNAL_IP.nip.io

Βήμα 8. Φέρνοντας τα αποθετήρια Git στη σωστή ιεραρχία χρησιμοποιώντας τον πάροχο Gitlab.

cd ../internal/gitlab/hierarchy && terraform apply -input=false -auto-approve planfile

Δυστυχώς, ο πάροχος Terraform GitLab έχει μια αιωρούμενη έντομο. Στη συνέχεια, θα πρέπει να διαγράψετε τα έργα που βρίσκονται σε διένεξη με μη αυτόματο τρόπο, προκειμένου να επιδιορθωθεί το tf.state. Στη συνέχεια, εκτελέστε ξανά την εντολή "$ make all".

Βήμα 9. Μεταφέρουμε τοπικά αποθετήρια στον διακομιστή.

$ 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)

Τέλος:

Κοτόπουλο ή το αυγό: διαχωρισμός IaC
Κοτόπουλο ή το αυγό: διαχωρισμός IaC
Κοτόπουλο ή το αυγό: διαχωρισμός IaC

Συμπέρασμα

Έχουμε πετύχει ότι μπορούμε να διαχειριστούμε τα πάντα δηλωτικά από την τοπική μας μηχανή. Τώρα θέλω να μεταφέρω όλες αυτές τις εργασίες στο CI και απλά να πατήσω κουμπιά. Για να γίνει αυτό, πρέπει να μεταφέρουμε τις τοπικές πολιτείες μας (κατάσταση Terraform) στο CI. Πώς να το κάνετε αυτό είναι στο επόμενο μέρος.

Εγγραφείτε στο blogγια να μην χάσετε την κυκλοφορία νέων άρθρων!

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο