
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:
- Penyediaan Sumber Daya. Ini adalah VM, S3, VPC, dll. Alat dasar untuk bekerja: и .
- . Alat dasar: , 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 и -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?
- Bagaimana cara menyimpannya di Git?
- Bagaimana cara menginstal CI?
- Jika kita juga menerapkan Gitlab menggunakan IaC, dan bahkan di Kubernetes?
- Dan GitLab Runner juga ada di Kubernetes?
- 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
«3 dengan dinosaurus" []
Mari kita coba memasak hidangan menggunakan penyedia cloud .
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 | bashBahan:
- Akun dari my.selectel.ru;
- Token akun;
- keterampilan Kubernetes;
- Keterampilan Helm;
- Keterampilan Terraform;
- Bagan helm GitLab;
- Bagan helm GitLab Runner.
Resep:
- Dapatkan MY_SELECTEL_TOKEN dari panel saya.selectel.ru.
- Buat cluster Kubernetes dengan mentransfer token akun ke cluster tersebut.
- Dapatkan KUBECONFIG dari cluster yang dibuat.
- Instal GitLab di Kubernetes.
- Dapatkan token GitLab dari GitLab yang dibuat untuk pengguna akar.
- Buat struktur proyek di GitLab menggunakan GitLab-token.
- Dorong kode yang ada ke GitLab.
- ??
- Profit!
Langkah 1. Token dapat diperoleh di bagian tersebut .
Langkah 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 
Langkah 3. Kami mendapatkan konfigurasi kubus.
Untuk mengunduh KUBECONFIG secara terprogram, Anda perlu mendapatkan token dari OpenStack:
openstack token issue -c id -f value > tokenDan 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.yamlCupconfig juga dapat diakses melalui panel.

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.
untuk Selectel dapat diambil dari .
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: trueLangkah 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.ymlKami menunggu hingga menerima IP eksternal sekitar 3-4 menit:

IP eksternal yang diterima:

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:

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 --decodeSekarang mari masuk dan dapatkan token:
python3 get_gitlab_token.py root $GITLAB_PASSWORD http://gitlab.gitlab.$EXTERNAL_IP.nip.ioLangkah 8. Membawa repositori Git ke hierarki yang benar menggunakan Penyedia Gitlab.
cd ../internal/gitlab/hierarchy && terraform apply -input=false -auto-approve planfileSayangnya, penyedia terraform GitLab memiliki floating . 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:


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 agar tidak ketinggalan rilis artikel baru!
Sumber: www.habr.com
