
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:
- Peruntukan Sumber. Ini ialah VM, S3, VPC, dsb. Alat asas untuk kerja: и .
- . Alat asas: , 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 и -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?
- Bagaimana untuk menyimpannya dalam Git?
- Bagaimana untuk memasang CI?
- Jika kita juga menggunakan Gitlab menggunakan IaC, dan juga dalam Kubernetes?
- Dan GitLab Runner juga dalam Kubernetes?
- 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
«3 dengan dinosaur" []
Mari cuba memasak hidangan menggunakan sebagai pembekal awan .
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 | bashBahan-bahan:
- Akaun daripada my.selectel.ru;
- Token akaun;
- Kemahiran Kubernetes;
- Kemahiran Helm;
- Kemahiran Terraform;
- Carta helm GitLab;
- Carta helm GitLab Runner.
Resipi:
- Dapatkan MY_SELECTEL_TOKEN daripada panel my.selectel.ru.
- Buat gugusan Kubernetes dengan memindahkan token akaun kepadanya.
- Dapatkan KUBECONFIG daripada kluster yang dibuat.
- Pasang GitLab pada Kubernetes.
- Dapatkan GitLab-token daripada GitLab yang dibuat untuk pengguna akar.
- Buat struktur projek dalam GitLab menggunakan GitLab-token.
- Tolak kod sedia ada ke GitLab.
- ?
- Keuntungan!
Langkah 1. Token boleh didapati di bahagian .
Langkah 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 
Langkah 3. Kami mendapat cubeconfig.
Untuk memuat turun KUBECONFIG secara pemrograman, anda perlu mendapatkan token daripada OpenStack:
openstack token issue -c id -f value > tokenDan 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.yamlCupconfig juga boleh diakses melalui panel.

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.
untuk Selectel boleh diambil daripada .
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: trueLangkah 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.ymlKami menunggu untuk menerima IP luaran selama kira-kira 3-4 minit:

Menerima IP luaran:

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:

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 --decodeSekarang mari log 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 betul menggunakan Penyedia Gitlab.
cd ../internal/gitlab/hierarchy && terraform apply -input=false -auto-approve planfileMalangnya, penyedia GitLab terraform mempunyai terapung . 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:


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 supaya tidak terlepas keluaran artikel baru!
Sumber: www.habr.com
