Հավի միս կամ ձու՝ բաժանելով IaC

Հավի միս կամ ձու՝ բաժանելով IaC
Ի՞նչն առաջացավ՝ հավը, թե՞ ձուն: Բավականին տարօրինակ սկիզբ է Ենթակառուցվածք-որպես կոդ հոդվածի համար, այնպես չէ՞:

Ի՞նչ է ձուն:

Ամենից հաճախ Ենթակառուցվածքը որպես կոդ (IaC) ենթակառուցվածքի ներկայացման հռչակագրային եղանակ է: Դրանում մենք նկարագրում ենք այն վիճակը, որին ցանկանում ենք հասնել՝ սկսած ապարատային մասից և վերջացրած ծրագրային կազմաձևով։ Հետևաբար IaC-ն օգտագործվում է հետևյալի համար.

  1. Ռեսուրսների ապահովում. Սրանք VM-ներ, S3, VPC և այլն: Աշխատանքի հիմնական գործիքները. Terraform и CloudFormation.
  2. Softwareրագրակազմի կազմաձևում. Հիմնական գործիքներ. Հղիություն, խոհարար և այլն:

Ցանկացած ծածկագիր գտնվում է git պահեստներում: Իսկ թիմի ղեկավարը վաղ թե ուշ կորոշի, որ դրանք պետք է կարգի բերել։ Եվ նա կվերափոխի: Եվ դա որոշակի կառուցվածք կստեղծի։ Եվ նա կտեսնի, որ սա լավ է։

Նաև լավ է, որ այն արդեն կա Գիտլաբը и 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-ից;
  • Հաշվի նշան;
  • Kubernetes հմտություններ;
  • Սաղավարտի հմտություններ;
  • Terraform Skills;
  • Սաղավարտի աղյուսակը GitLab;
  • Սաղավարտի աղյուսակը GitLab Runner.

Recipe:

  1. Ստացեք MY_SELECTEL_TOKEN վահանակից my.selectel.ru.
  2. Ստեղծեք Kubernetes կլաստեր՝ դրան փոխանցելով հաշվի նշան:
  3. Ստացեք KUBECONFIG ստեղծված կլաստերից:
  4. Տեղադրեք GitLab-ը Kubernetes-ում:
  5. Ստացեք GitLab-token-ը օգտատիրոջ համար ստեղծված GitLab-ից արմատ.
  6. Ստեղծեք նախագծի կառուցվածք GitLab-ում՝ օգտագործելով GitLab-token-ը:
  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. Մենք ստանում ենք cubeconfig:

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. Այն բանից հետո, երբ կլաստերը թխվի և մեզ հասանելի լինի, կարող ենք վրան ավելացնել յամլ՝ ըստ ճաշակի։

Նախընտրում եմ ավելացնել.

  • անվանատարածք
  • պահեստավորման դաս
  • pod անվտանգության քաղաքականություն և այլն:

Պահպանման դաս Selectel-ի համար կարելի է վերցնել պաշտոնական պահոց.

Քանի որ ի սկզբանե ես ընտրեցի կլաստեր գոտում ru-3a, ապա ինձ պետք է Storage Class այս գոտուց:

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-ingress. Այն տեղադրելու համար արդեն շատ հրահանգներ կան, ուստի մենք չենք անդրադառնա դրա վրա:

$ 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-token:

Նախ, պարզեք մուտքի գաղտնաբառը.

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 մատակարարն ունի լողացող bug. Այնուհետև դուք պետք է ձեռքով ջնջեք հակասող նախագծերը, որպեսզի tf.state-ը շտկվի: Այնուհետև նորից գործարկեք «$ make all» հրամանը

Քայլ 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 State) տեղափոխենք CI: Ինչպես դա անել՝ հաջորդ մասում:

Բաժանորդագրվեք մեր Օրագիրորպեսզի բաց չթողնեք նոր հոդվածների թողարկումը:

Source: www.habr.com

Добавить комментарий