Ayam atau telur: membelah IaC

Ayam atau telur: membelah IaC
Apa yang didahulukan - ayam atau telur? Permulaan yang agak pelik untuk artikel tentang Infrastructure-as-Code, bukan?

Apa itu telur?

Selalunya, Infrastructure-as-Code (IaC) ialah cara deklaratif untuk mewakili infrastruktur. Di dalamnya kami menerangkan keadaan yang ingin kami capai, bermula dari bahagian perkakasan dan berakhir dengan konfigurasi perisian. Oleh itu IaC digunakan untuk:

  1. Peruntukan Sumber. Ini ialah VM, S3, VPC, dsb. Alat asas untuk kerja: Terraform ΠΈ CloudFormation.
  2. Konfigurasi Perisian. Alat asas: Ansible, Chef, dsb.

Sebarang kod berada dalam repositori git. Dan lambat laun ketua pasukan akan memutuskan bahawa mereka perlu diatur. Dan dia akan refactor. Dan ia akan mewujudkan beberapa struktur. Dan dia akan melihat bahawa ini adalah baik.

Bagus juga ia sudah wujud GitLab ΠΈ GitHub-penyedia untuk Terraform (dan ini ialah Konfigurasi Perisian). Dengan bantuan mereka, anda boleh menguruskan keseluruhan projek: ahli pasukan, CI/CD, git-flow, dsb.

Dari mana datangnya telur itu?

Jadi kita secara beransur-ansur menghampiri soalan utama.

Pertama sekali, anda perlu bermula dengan repositori yang menerangkan struktur repositori lain, termasuk anda sendiri. Dan sudah tentu, sebagai sebahagian daripada GitOps, anda perlu menambah CI supaya perubahan dilaksanakan secara automatik.

Jika Git belum dibuat lagi?

  1. Bagaimana untuk menyimpannya dalam Git?
  2. Bagaimana untuk memasang CI?
  3. Jika kita juga menggunakan Gitlab menggunakan IaC, dan juga dalam Kubernetes?
  4. Dan GitLab Runner juga dalam Kubernetes?
  5. Bagaimana pula dengan Kubernetes dalam pembekal awan?

Apa yang datang dahulu: GitLab tempat saya akan memuat naik kod saya, atau kod yang menerangkan jenis GitLab yang saya perlukan?

Ayam dengan telur

Β«Oyakodon3 dengan dinosaur" [src]

Mari cuba memasak hidangan menggunakan sebagai pembekal awan Terurus Kubernetes Selectel.

TL; DR

Adakah mungkin untuk menyertai satu pasukan sekaligus?

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

Bahan-bahan:

  • Akaun daripada my.selectel.ru;
  • Token akaun;
  • Kemahiran Kubernetes;
  • Kemahiran Helm;
  • Kemahiran Terraform;
  • Carta helm GitLab;
  • Carta helm GitLab Runner.

Resipi:

  1. Dapatkan MY_SELECTEL_TOKEN daripada panel my.selectel.ru.
  2. Buat gugusan Kubernetes dengan memindahkan token akaun kepadanya.
  3. Dapatkan KUBECONFIG daripada kluster yang dibuat.
  4. Pasang GitLab pada Kubernetes.
  5. Dapatkan GitLab-token daripada GitLab yang dibuat untuk pengguna akar.
  6. Buat struktur projek dalam GitLab menggunakan GitLab-token.
  7. Tolak kod sedia ada ke GitLab.
  8. ?
  9. Keuntungan!

Langkah 1. Token boleh didapati di bahagian Kunci API.

Ayam atau telur: membelah IaCLangkah 2. Kami menyediakan Terraform kami untuk "membakar" kelompok 2 nod. Jika anda pasti bahawa anda mempunyai sumber yang mencukupi untuk segala-galanya, maka anda boleh mendayakan kuota automatik:

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 pada projek:

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
}

Pengeluaran:

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 lancarkan:

$ 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 mendapat cubeconfig.

Untuk memuat turun KUBECONFIG secara pemrograman, anda perlu mendapatkan token daripada OpenStack:

openstack token issue -c id -f value > token

Dan dengan token ini buat permintaan kepada API Terurus Kubernetes Selectel. k8s_id memberi keluar 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 boleh diakses melalui panel.

Ayam atau telur: membelah IaC
Langkah 4. Selepas kluster dibakar dan kita mempunyai akses kepadanya, kita boleh menambah yaml di atas secukup rasa.

Saya lebih suka menambah:

  • ruang nama,
  • kelas simpanan
  • dasar keselamatan pod dan sebagainya.

Kelas Penyimpanan untuk Selectel boleh diambil daripada repositori rasmi.

Sejak mulanya saya memilih kluster dalam zon ru-3a, maka saya memerlukan Kelas Penyimpanan dari zon 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 pengimbang beban.

Kami akan menggunakan yang standard untuk ramai nginx-ingress. Sudah terdapat banyak arahan untuk memasangnya, 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 untuk menerima IP luaran selama kira-kira 3-4 minit:

Ayam atau telur: membelah IaC
Menerima IP luaran:

Ayam atau telur: membelah IaC
Langkah 6. Pasang 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 tunggu sehingga semua buah bangkit.

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

Buahnya naik:

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

Pertama, ketahui kata laluan log masuk:

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

Sekarang mari log 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 betul menggunakan Penyedia Gitlab.

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

Malangnya, penyedia GitLab terraform mempunyai terapung pepijat. Kemudian anda perlu memadamkan projek yang bercanggah secara manual agar tf.state dapat diperbaiki. Kemudian jalankan semula arahan `$make all`

Langkah 9. Kami memindahkan repositori tempatan ke pelayan.

$ 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 bahawa kami boleh menguruskan segala-galanya secara deklaratif daripada mesin tempatan kami. Sekarang saya mahu memindahkan semua tugas ini ke CI dan hanya tekan butang. Untuk melakukan ini, kami perlu memindahkan negeri tempatan kami (negeri Terraform) kepada CI. Bagaimana untuk melakukan ini adalah di bahagian seterusnya.

Langgan kami blogsupaya tidak terlepas keluaran artikel baru!

Sumber: www.habr.com

Tambah komen