ዶሮ ወይም እንቁላሉ፡ IaC መሰንጠቅ

ዶሮ ወይም እንቁላሉ፡ IaC መሰንጠቅ
መጀመሪያ ምን መጣ - ዶሮ ወይስ እንቁላል? ስለ መሠረተ ልማት-እንደ-ኮድ መጣጥፍ በጣም እንግዳ ጅምር ፣ አይደለም?

እንቁላል ምንድን ነው?

ብዙ ጊዜ፣ መሠረተ ልማት-እንደ-ኮድ (IaC) መሠረተ ልማትን የሚወክል ገላጭ መንገድ ነው። በእሱ ውስጥ ከሃርድዌር ክፍል ጀምሮ እና በሶፍትዌር ውቅር በማጠናቀቅ ማግኘት የምንፈልገውን ሁኔታ እንገልፃለን. ስለዚህ IaC ጥቅም ላይ የሚውለው ለ:

  1. የንብረት አቅርቦት. እነዚህ VMs፣ S3፣ VPC፣ ወዘተ ናቸው። ለስራ መሰረታዊ መሳሪያዎች; Terraform и CloudFormation.
  2. የሶፍትዌር ውቅር. መሰረታዊ መሳሪያዎች፡- የሚጠራ, ሼፍ, ወዘተ.

ማንኛውም ኮድ በgit ማከማቻዎች ውስጥ አለ። እና ፈጥኖም ሆነ ዘግይቶ የቡድን መሪው በቅደም ተከተል መቀመጥ እንዳለባቸው ይወስናል. እና እሱ እንደገና ይገለጻል። እና አንዳንድ መዋቅር ይፈጥራል. እና ይህ ጥሩ እንደሆነ ያያል.

አስቀድሞ መኖሩም ጥሩ ነው። GitLab и የፊልሙለቴራፎርም አቅራቢ (እና ይህ የሶፍትዌር ውቅር ነው)። በእነሱ እርዳታ ሙሉውን ፕሮጀክት ማስተዳደር ይችላሉ: የቡድን አባላት, CI/CD, git-flow, ወዘተ.

እንቁላሉ የመጣው ከየት ነው?

ስለዚህ ቀስ በቀስ ወደ ዋናው ጥያቄ እንቀርባለን.

በመጀመሪያ ደረጃ, እራስዎን ጨምሮ የሌሎች ማከማቻዎችን መዋቅር በሚገልጽ ማከማቻ መጀመር ያስፈልግዎታል. እና በእርግጥ፣ እንደ GitOps አካል፣ ለውጦች በራስ-ሰር እንዲከናወኑ CI ን ማከል ያስፈልግዎታል።

Git ገና ካልተፈጠረ?

  1. በ Git ውስጥ እንዴት ማከማቸት?
  2. CI እንዴት እንደሚጫን?
  3. IaCን በመጠቀም Gitlab ን ብናሰማራ እና በኩበርኔትስ ውስጥም ቢሆን?
  4. እና GitLab Runner ደግሞ በኩበርኔትስ ውስጥ?
  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;
  • መለያ ማስመሰያ;
  • የኩበርኔትስ ችሎታዎች;
  • Helm ችሎታዎች;
  • ቴራፎርም ችሎታዎች;
  • Helm ገበታ GitLab;
  • Helm ገበታ GitLab Runner.

መልመጃ

  1. MY_SELECTEL_TOKENን ከፓነል ያግኙ my.selectel.ru.
  2. የመለያ ቶከንን ወደ እሱ በማስተላለፍ የኩበርኔትስ ክላስተር ይፍጠሩ።
  3. KUBECONFIG ከተፈጠረው ዘለላ ያግኙ።
  4. በ Kubernetes ላይ GitLab ን ይጫኑ።
  5. ለተጠቃሚ የተፈጠረ GitLab-tokenን ከ GitLab ያግኙ ሥር.
  6. GitLab-tokenን በመጠቀም በ GitLab ውስጥ የፕሮጀክት መዋቅር ይፍጠሩ።
  7. ያለውን ኮድ ወደ GitLab ግፋ።
  8. ???
  9. ትርፍ!

1 ደረጃ. ማስመሰያው በክፍል ውስጥ ሊገኝ ይችላል የኤፒአይ ቁልፎች.

ዶሮ ወይም እንቁላሉ፡ 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_መታወቂያ ይሰጣል ቴራፎርም:

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

ለ3-4 ደቂቃ ያህል ውጫዊ አይፒን እስኪቀበል እንጠብቃለን።

ዶሮ ወይም እንቁላሉ፡ IaC መሰንጠቅ
የተቀበለው የውጭ አይፒ፡

ዶሮ ወይም እንቁላሉ፡ 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 ደረጃ. Gitlab አቅራቢን በመጠቀም የጂት ማከማቻዎችን ወደ ትክክለኛው ተዋረድ ማምጣት።

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

እንደ አለመታደል ሆኖ የቴራፎርም GitLab አቅራቢ ተንሳፋፊ አለው። ሳንካ. ከዚያ 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 ማስተላለፍ እፈልጋለሁ እና አዝራሮችን ብቻ ይጫኑ. ይህንን ለማድረግ የአካባቢያችንን ግዛቶች (ቴራፎርም ግዛት) ወደ CI ማስተላለፍ አለብን. ይህንን እንዴት ማድረግ እንደሚቻል በሚቀጥለው ክፍል ውስጥ ነው.

የእኛን ይመዝገቡ ጦማርአዳዲስ መጣጥፎችን እንዳያመልጥዎት!

ምንጭ: hab.com

አስተያየት ያክሉ