Manok o ang itlog: paghahati ng IaC

Manok o ang itlog: paghahati ng IaC
Ano ang nauna - ang manok o ang itlog? Isang kakaibang simula para sa isang artikulo tungkol sa Infrastructure-as-Code, hindi ba?

Ano ang isang itlog?

Kadalasan, ang Infrastructure-as-Code (IaC) ay isang deklaratibong paraan ng kumakatawan sa imprastraktura. Inilalarawan namin dito ang estado na gusto naming makamit, simula sa bahagi ng hardware at nagtatapos sa pagsasaayos ng software. Samakatuwid ang IaC ay ginagamit para sa:

  1. Paglalaan ng Mapagkukunan. Ito ay mga VM, S3, VPC, atbp. Mga pangunahing tool para sa trabaho: Terraform ΠΈ CloudFormation.
  2. Pag-configure ng Software. Mga pangunahing tool: Ansible, Chef, atbp.

Ang anumang code ay nasa git repository. At maya-maya ay magpapasya ang pinuno ng pangkat na kailangan nilang ayusin. At magre-refactor siya. At lilikha ito ng ilang istraktura. At makikita niya na ito ay mabuti.

Buti na lang meron na GitLab ΠΈ GitHub-provider para sa Terraform (at ito ay Software Configuration). Sa tulong nila, maaari mong pamahalaan ang buong proyekto: mga miyembro ng koponan, CI/CD, git-flow, atbp.

Saan nanggaling ang itlog?

Kaya't unti-unti tayong lumalapit sa pangunahing tanong.

Una sa lahat, kailangan mong magsimula sa isang repositoryo na naglalarawan sa istraktura ng iba pang mga repositoryo, kasama ang iyong sarili. At siyempre, bilang bahagi ng GitOps, kailangan mong magdagdag ng CI upang awtomatikong maisakatuparan ang mga pagbabago.

Kung hindi pa nagagawa ang Git?

  1. Paano ito iimbak sa Git?
  2. Paano mag-install ng CI?
  3. Kung i-deploy din natin ang Gitlab gamit ang IaC, at maging sa Kubernetes?
  4. At ang GitLab Runner din sa Kubernetes?
  5. Paano ang Kubernetes sa cloud provider?

Ano ang nauna: ang GitLab kung saan ko ia-upload ang aking code, o ang code na naglalarawan kung anong uri ng GitLab ang kailangan ko?

Manok na may itlog

Β«Oyakodon3 na may dinosaur" [SRC]

Subukan nating magluto ng ulam gamit ang cloud provider Pinamamahalaang Kubernetes Selectel.

Tl; DR

Posible bang sumali sa isang koponan nang sabay-sabay?

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

Mga Sangkap:

  • Account mula sa my.selectel.ru;
  • Token ng account;
  • Mga kasanayan sa Kubernetes;
  • Kasanayan sa Helm;
  • Mga Kasanayan sa Terraform;
  • Helm chart GitLab;
  • Helm chart GitLab Runner.

Recipe:

  1. Kunin ang MY_SELECTEL_TOKEN mula sa panel my.selectel.ru.
  2. Gumawa ng Kubernetes cluster sa pamamagitan ng paglilipat ng token ng account dito.
  3. Kunin ang KUBECONFIG mula sa ginawang cluster.
  4. I-install ang GitLab sa Kubernetes.
  5. Kumuha ng GitLab-token mula sa GitLab na ginawa para sa user ugat.
  6. Lumikha ng istraktura ng proyekto sa GitLab gamit ang GitLab-token.
  7. Itulak ang umiiral na code sa GitLab.
  8. ?
  9. Profit!

Hakbang 1. Ang token ay maaaring makuha sa seksyon Mga API Key.

Manok o ang itlog: paghahati ng IaCHakbang 2. Inihahanda namin ang aming Terraform para sa "pagbake" ng isang kumpol ng 2 node. Kung sigurado ka na mayroon kang sapat na mapagkukunan para sa lahat, maaari mong paganahin ang mga auto quota:

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

Magdagdag ng user sa proyekto:

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:

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
}

Ilunsad natin:

$ 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

Manok o ang itlog: paghahati ng IaC
Hakbang 3. Nakukuha namin ang cubeconfig.

Upang ma-program ang pag-download ng KUBECONFIG, kailangan mong makakuha ng token mula sa OpenStack:

openstack token issue -c id -f value > token

At gamit ang token na ito, humiling sa Managed Kubernetes Selectel API. k8s_id mga isyu terraform:

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

Maaari ding ma-access ang Cupconfig sa pamamagitan ng panel.

Manok o ang itlog: paghahati ng IaC
Hakbang 4. Pagkatapos maluto ang kumpol at magkaroon tayo ng access dito, maaari tayong magdagdag ng yaml sa ibabaw upang matikman.

Mas gusto kong idagdag:

  • namespace
  • klase ng imbakan
  • patakaran sa seguridad ng pod at iba pa.

Imbakan Class para sa Selectel ay maaaring kunin mula sa opisyal na imbakan.

Dahil sa una ay pumili ako ng isang kumpol sa zone ru-3a, pagkatapos ay kailangan ko ang Storage Class mula sa zone na ito.

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

Hakbang 5. Mag-install ng load balancer.

Gagamitin namin ang pamantayan para sa marami nginx-ingress. Marami nang mga tagubilin para sa pag-install nito, kaya hindi na namin ito pag-uusapan.

$ 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

Hinihintay namin itong makatanggap ng panlabas na IP sa loob ng mga 3-4 minuto:

Manok o ang itlog: paghahati ng IaC
Nakatanggap ng panlabas na IP:

Manok o ang itlog: paghahati ng IaC
Hakbang 6. I-install ang 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"

Muli, hinihintay namin na tumaas ang lahat ng mga pod.

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

Ang mga pods ay tumaas:

Manok o ang itlog: paghahati ng IaC
Hakbang 7. Nakatanggap kami ng GitLab-token.

Una, alamin ang password sa pag-login:

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

Ngayon, mag-log in tayo at kumuha ng token:

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

Hakbang 8. Ang pagdadala ng mga Git repository sa tamang hierarchy gamit ang Gitlab Provider.

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

Sa kasamaang palad, ang terraform GitLab provider ay may lumulutang surot. Pagkatapos ay kailangan mong tanggalin nang manu-mano ang mga magkasalungat na proyekto upang maayos ang tf.state. Pagkatapos ay muling patakbuhin ang command na `$make all`

Hakbang 9. Naglilipat kami ng mga lokal na repositoryo sa 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)

Tapos na:

Manok o ang itlog: paghahati ng IaC
Manok o ang itlog: paghahati ng IaC
Manok o ang itlog: paghahati ng IaC

Konklusyon

Nakamit namin na maaari naming pamahalaan ang lahat nang deklaratibo mula sa aming lokal na makina. Ngayon gusto kong ilipat ang lahat ng mga gawaing ito sa CI at pindutin lamang ang mga pindutan. Upang gawin ito, kailangan naming ilipat ang aming mga lokal na estado (estado ng Terraform) sa CI. Kung paano ito gagawin ay nasa susunod na bahagi.

Mag-subscribe sa aming blogupang hindi makaligtaan ang paglabas ng mga bagong artikulo!

Pinagmulan: www.habr.com

Magdagdag ng komento