Ayam atau telur: membelah IaC

Ayam atau telur: membelah IaC
Mana yang lebih dulu, ayam atau telur? Awal yang aneh untuk artikel tentang Infrastruktur sebagai Kode, bukan?

Apa itu telur?

Seringkali, Infrastruktur-sebagai-Kode (IaC) adalah cara deklaratif untuk merepresentasikan infrastruktur. Di dalamnya kami menjelaskan keadaan yang ingin kami capai, mulai dari bagian perangkat keras dan diakhiri dengan konfigurasi perangkat lunak. Oleh karena itu IaC digunakan untuk:

  1. Penyediaan Sumber Daya. Ini adalah VM, S3, VPC, dll. Alat dasar untuk bekerja: Terraform ΠΈ Formasi Awan.
  2. Konfigurasi Perangkat Lunak. Alat dasar: Mungkin, Koki, dll.

Kode apa pun ada di repositori git. Dan cepat atau lambat pemimpin tim akan memutuskan bahwa mereka perlu ditertibkan. Dan dia akan melakukan refaktorisasi. Dan itu akan menciptakan beberapa struktur. Dan dia akan melihat bahwa ini bagus.

Bagus juga kalau sudah ada GitLab ΠΈ GitHub-penyedia untuk Terraform (dan ini adalah Konfigurasi Perangkat Lunak). Dengan bantuan mereka, Anda dapat mengelola keseluruhan proyek: anggota tim, CI/CD, git-flow, dll.

Darimana telur itu berasal?

Jadi kita secara bertahap mendekati pertanyaan utama.

Pertama-tama, Anda harus memulai dengan repositori yang menjelaskan struktur repositori lain, termasuk Anda sendiri. Dan tentu saja, sebagai bagian dari GitOps, Anda perlu menambahkan CI agar perubahan dapat dijalankan secara otomatis.

Jika Git belum dibuat?

  1. Bagaimana cara menyimpannya di Git?
  2. Bagaimana cara menginstal CI?
  3. Jika kita juga menerapkan Gitlab menggunakan IaC, dan bahkan di Kubernetes?
  4. Dan GitLab Runner juga ada di Kubernetes?
  5. Bagaimana dengan Kubernetes di penyedia cloud?

Mana yang lebih dulu: GitLab tempat saya mengunggah kode, atau kode yang menjelaskan jenis GitLab yang saya perlukan?

Ayam dengan telur

Β«Oyakodon3 dengan dinosaurus" [src]

Mari kita coba memasak hidangan menggunakan penyedia cloud Kubernetes Selectel yang Dikelola.

TL; DR

Apakah bisa bergabung dalam satu tim sekaligus?

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

Bahan:

  • Akun dari my.selectel.ru;
  • Token akun;
  • keterampilan Kubernetes;
  • Keterampilan Helm;
  • Keterampilan Terraform;
  • Bagan helm GitLab;
  • Bagan helm GitLab Runner.

Resep:

  1. Dapatkan MY_SELECTEL_TOKEN dari panel saya.selectel.ru.
  2. Buat cluster Kubernetes dengan mentransfer token akun ke cluster tersebut.
  3. Dapatkan KUBECONFIG dari cluster yang dibuat.
  4. Instal GitLab di Kubernetes.
  5. Dapatkan token GitLab dari GitLab yang dibuat untuk pengguna akar.
  6. Buat struktur proyek di GitLab menggunakan GitLab-token.
  7. Dorong kode yang ada ke GitLab.
  8. ??
  9. Profit!

Langkah 1. Token dapat diperoleh di bagian tersebut Kunci API.

Ayam atau telur: membelah IaCLangkah 2. Kami menyiapkan Terraform untuk "memanggang" sekelompok 2 node. Jika Anda yakin memiliki sumber daya yang cukup untuk semuanya, Anda dapat mengaktifkan kuota otomatis:

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

Tambahkan pengguna ke proyek:

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
}

Keluaran:

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
}

Mari kita luncurkan:

$ 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

Ayam atau telur: membelah IaC
Langkah 3. Kami mendapatkan konfigurasi kubus.

Untuk mengunduh KUBECONFIG secara terprogram, Anda perlu mendapatkan token dari OpenStack:

openstack token issue -c id -f value > token

Dan dengan token ini buat permintaan ke Managed Kubernetes Selectel API. k8s_id memberikan 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 juga dapat diakses melalui panel.

Ayam atau telur: membelah IaC
Langkah 4. Setelah clusternya matang dan kita bisa mengaksesnya, kita bisa menambahkan yaml di atasnya sesuai selera.

Saya lebih suka menambahkan:

  • ruang nama,
  • kelas penyimpanan
  • kebijakan keamanan pod dan sebagainya.

Kelas Penyimpanan untuk Selectel dapat diambil dari repositori resmi.

Sejak awal saya memilih cluster di zona tersebut ru-3a, maka saya memerlukan Kelas Penyimpanan dari zona ini.

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

Langkah 5. Pasang penyeimbang beban.

Kami akan menggunakan yang standar untuk banyak orang nginx-ingress. Petunjuk untuk menginstalnya sudah banyak, jadi kami tidak akan memikirkannya.

$ 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

Kami menunggu hingga menerima IP eksternal sekitar 3-4 menit:

Ayam atau telur: membelah IaC
IP eksternal yang diterima:

Ayam atau telur: membelah IaC
Langkah 6. Instal 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"

Sekali lagi kita menunggu sampai semua polongnya naik.

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

Polongnya naik:

Ayam atau telur: membelah IaC
Langkah 7. Kami menerima token GitLab.

Pertama, cari tahu kata sandi login:

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

Sekarang mari masuk dan dapatkan token:

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

Langkah 8. Membawa repositori Git ke hierarki yang benar menggunakan Penyedia Gitlab.

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

Sayangnya, penyedia terraform GitLab memiliki floating serangga. Kemudian Anda harus menghapus proyek yang konflik secara manual agar tf.state dapat diperbaiki. Kemudian jalankan kembali perintah `$make all`

Langkah 9. Kami mentransfer repositori lokal ke server.

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

Selesai:

Ayam atau telur: membelah IaC
Ayam atau telur: membelah IaC
Ayam atau telur: membelah IaC

Kesimpulan

Kami telah mencapai bahwa kami dapat mengelola semuanya secara deklaratif dari mesin lokal kami. Sekarang saya ingin mentransfer semua tugas ini ke CI dan cukup tekan tombol. Untuk melakukan ini, kita perlu mentransfer negara bagian lokal kita (negara bagian Terraform) ke CI. Cara melakukannya ada di bagian selanjutnya.

Berlangganan kami blogagar tidak ketinggalan rilis artikel baru!

Sumber: www.habr.com

Tambah komentar