Тауық немесе жұмыртқа: IaC бөлу

Тауық немесе жұмыртқа: IaC бөлу
Алдымен не келді - тауық немесе жұмыртқа? Инфраструктура-код туралы мақала үшін өте таңқаларлық бастама, солай емес пе?

Жұмыртқа дегеніміз не?

Көбінесе Infrastructure-as-Code (IaC) инфрақұрылымды көрсетудің декларативті тәсілі болып табылады. Онда біз аппараттық бөліктен бастап бағдарламалық құрал конфигурациясына дейін қол жеткізгіміз келетін күйді сипаттаймыз. Сондықтан IaC мыналар үшін қолданылады:

  1. Ресурстық қамтамасыз ету. Бұл VM, S3, VPC және т.б. Жұмыстың негізгі құралдары: Terraform и CloudFormation.
  2. Бағдарламалық жасақтаманың конфигурациясы. Негізгі құралдар: Қажет, аспаз және т.б.

Кез келген код git репозиторийлерінде болады. Ал ерте ме, кеш пе, топ басшысы оларды ретке келтіру керек деп шешеді. Және ол рефактор болады. Және ол қандай да бір құрылымды жасайды. Және ол мұның жақсы екенін көреді.

Оның бұрыннан бар екені де жақсы GitLab и GitHub-Terraform провайдері (және бұл бағдарламалық құрал конфигурациясы). Олардың көмегімен сіз бүкіл жобаны басқара аласыз: топ мүшелері, CI/CD, git-flow және т.б.

Жұмыртқа қайдан пайда болды?

Сондықтан біз бірте-бірте негізгі сұраққа жақындаймыз.

Ең алдымен, басқа репозиторийлердің құрылымын сипаттайтын репозиторийден бастау керек, соның ішінде өзіңіз де. Әрине, GitOps бөлігі ретінде өзгертулер автоматты түрде орындалатындай етіп CI қосу керек.

Егер Git әлі жасалмаған болса?

  1. Оны Git-те қалай сақтауға болады?
  2. CI қалай орнатуға болады?
  3. Егер біз Gitlab-ті IaC арқылы, тіпті Kubernetes-те де қолдансақ?
  4. Сондай-ақ GitLab Runner Kubernetes-те ме?
  5. Бұлттық провайдердегі Kubernetes туралы не деуге болады?

Алдымен не болды: кодты жүктеп салатын GitLab немесе маған қандай GitLab қажет екенін сипаттайтын код?

Жұмыртқа қосылған тауық еті

«Оякодон3 динозаврмен» [SRC]

Бұлт провайдері ретінде тағамды пісіріп көрейік Басқарылатын Kubernetes Selectel.

TL; DR

Бір командаға бірден қосылуға бола ма?

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

Құрамы:

  • my.selectel.ru сайтындағы аккаунт;
  • Тіркелгі белгісі;
  • Кубернет дағдылары;
  • Рульдік дағдылар;
  • Терраформа дағдылары;
  • GitLab руль диаграммасы;
  • GitLab Runner руль диаграммасы.

Рецептер:

  1. Панельден MY_SELECTEL_TOKEN алыңыз my.selectel.ru.
  2. Тіркелгі белгісін тасымалдау арқылы Kubernetes кластерін жасаңыз.
  3. Жасалған кластерден KUBECONFIG алыңыз.
  4. Kubernetes жүйесіне GitLab орнатыңыз.
  5. Пайдаланушы үшін жасалған GitLab жүйесінен GitLab токенін алыңыз түбір.
  6. GitLab-токенді пайдаланып GitLab жүйесінде жоба құрылымын жасаңыз.
  7. Бар кодты GitLab жүйесіне итеріңіз.
  8. ???
  9. Пайда!

қадам 1. Токенді бөлімде алуға болады API кілттері.

Тауық немесе жұмыртқа: IaC бөлуқадам 2. Біз Terraform-ты 2 түйіннен тұратын кластерді «пісіруге» дайындаймыз. Егер сізде барлығына жеткілікті ресурстар бар екеніне сенімді болсаңыз, автоматты квоталарды қосуға болады:

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

Жобаға пайдаланушы қосыңыз:

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

Іске кірісейік:

$ 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

Тауық немесе жұмыртқа: IaC бөлу
қадам 3. Біз куб конфигурациясын аламыз.

KUBECONFIG бағдарламасын бағдарламалық түрде жүктеп алу үшін сізге OpenStack токенін алу керек:

openstack token issue -c id -f value > token

Осы таңбалауышпен басқарылатын Kubernetes Selectel API-ге сұрау жасаңыз. k8s_id мәселелер терраформ:

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

Cupconfig-ге панель арқылы да қол жеткізуге болады.

Тауық немесе жұмыртқа: IaC бөлу
қадам 4. Кластер пісірілгеннен кейін және біз оған қол жеткізе аламыз, біз дәміне қарай ямл қосуға болады.

Мен қосқым келеді:

  • аттар кеңістігі
  • сақтау класы
  • қауіпсіздік саясаты және т.б.

Сақтау класы Selectel үшін мына жерден алуға болады ресми репозиторий.

Бастапқыда мен аймақта кластерді таңдадым ru-3a, содан кейін маған осы аймақтан Сақтау класы қажет.

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

қадам 5. Жүктеме балансын орнатыңыз.

Біз көптеген адамдар үшін стандартты қолданамыз nginx-кіру. Оны орнату бойынша көптеген нұсқаулар бар, сондықтан біз оған тоқталмаймыз.

$ 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

Біз оның сыртқы IP алуын шамамен 3-4 минут күтеміз:

Тауық немесе жұмыртқа: IaC бөлу
Алынған сыртқы IP:

Тауық немесе жұмыртқа: IaC бөлу
қадам 6. 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"

Тағы да біз барлық бұршақтардың көтерілуін күтеміз.

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

Бүршіктер көтерілді:

Тауық немесе жұмыртқа: IaC бөлу
қадам 7. Біз GitLab токенін аламыз.

Алдымен кіру паролін табыңыз:

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

Енді жүйеге кіріп, белгіні алайық:

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

қадам 8. Git репозиторийлерін Gitlab провайдері арқылы дұрыс иерархияға келтіру.

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

Өкінішке орай, terraform GitLab провайдерінде қалқымалы бар қате. Содан кейін tf.state түзетілуі үшін қайшылықты жобаларды қолмен жоюға тура келеді. Содан кейін «$барлығын жасау» пәрменін қайта іске қосыңыз

қадам 9. Біз жергілікті репозиторийлерді серверге тасымалдаймыз.

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

Аяқталған:

Тауық немесе жұмыртқа: IaC бөлу
Тауық немесе жұмыртқа: IaC бөлу
Тауық немесе жұмыртқа: IaC бөлу

қорытынды

Біз жергілікті құрылғыдан барлығын декларациялық түрде басқара алатынымызға қол жеткіздік. Енді мен осы тапсырмалардың барлығын CI-ге ауыстырғым келеді және жай ғана түймелерді басыңыз. Ол үшін жергілікті штаттарымызды (Terraform штаты) CI-ге ауыстыруымыз керек. Мұны қалай істеу керектігі келесі бөлімде.

Біздің жазылым блогжаңа мақалалардың шығуын жіберіп алмау үшін!

Ақпарат көзі: www.habr.com

пікір қалдыру