చికెన్ లేదా గుడ్డు: IaCని విభజించడం

చికెన్ లేదా గుడ్డు: IaCని విభజించడం
మొదట ఏది వచ్చింది - కోడి లేదా గుడ్డు? ఇన్‌ఫ్రాస్ట్రక్చర్-యాజ్-కోడ్ గురించి కథనానికి చాలా విచిత్రమైన ప్రారంభం, కాదా?

గుడ్డు అంటే ఏమిటి?

చాలా తరచుగా, ఇన్‌ఫ్రాస్ట్రక్చర్-యాజ్-కోడ్ (IaC) అనేది ఇన్‌ఫ్రాస్ట్రక్చర్‌ను సూచించే డిక్లరేటివ్ మార్గం. అందులో హార్డ్‌వేర్ భాగం నుండి ప్రారంభించి సాఫ్ట్‌వేర్ కాన్ఫిగరేషన్‌తో మనం సాధించాలనుకుంటున్న స్థితిని వివరిస్తాము. కాబట్టి IaC దీని కోసం ఉపయోగించబడుతుంది:

  1. వనరుల కేటాయింపు. ఇవి VMలు, S3, VPC, మొదలైనవి. పని కోసం ప్రాథమిక సాధనాలు: Terraform и క్లౌడ్ ఫార్మేషన్.
  2. సాఫ్ట్‌వేర్ కాన్ఫిగరేషన్. ప్రాథమిక సాధనాలు: చేసాడు, చెఫ్, మొదలైనవి.

ఏదైనా కోడ్ git రిపోజిటరీలలో ఉంటుంది. మరియు ముందుగానే లేదా తరువాత జట్టు నాయకుడు వాటిని క్రమంలో ఉంచాల్సిన అవసరం ఉందని నిర్ణయిస్తారు. మరియు అతను రీఫాక్టర్ చేస్తాడు. మరియు ఇది కొంత నిర్మాణాన్ని సృష్టిస్తుంది. మరియు ఇది మంచిదని అతను చూస్తాడు.

ఇది ఇప్పటికే ఉనికిలో ఉండటం కూడా మంచిది GitLab и గ్యాలరీలుటెర్రాఫార్మ్ కోసం ప్రొవైడర్ (మరియు ఇది సాఫ్ట్‌వేర్ కాన్ఫిగరేషన్). వారి సహాయంతో, మీరు మొత్తం ప్రాజెక్ట్‌ను నిర్వహించవచ్చు: బృంద సభ్యులు, CI/CD, git-flow మొదలైనవి.

గుడ్డు ఎక్కడ నుండి వచ్చింది?

కాబట్టి మేము క్రమంగా ప్రధాన ప్రశ్నకు చేరుకుంటున్నాము.

అన్నింటిలో మొదటిది, మీరు మీతో సహా ఇతర రిపోజిటరీల నిర్మాణాన్ని వివరించే రిపోజిటరీతో ప్రారంభించాలి. మరియు వాస్తవానికి, GitOpsలో భాగంగా, మీరు CIని జోడించాలి, తద్వారా మార్పులు స్వయంచాలకంగా అమలు చేయబడతాయి.

Git ఇంకా సృష్టించబడకపోతే?

  1. దీన్ని Gitలో ఎలా నిల్వ చేయాలి?
  2. CIని ఎలా ఇన్‌స్టాల్ చేయాలి?
  3. మేము IaCని ఉపయోగించి మరియు కుబెర్నెట్స్‌లో కూడా Gitlabని అమలు చేస్తే?
  4. మరియు కుబెర్నెట్స్‌లో కూడా గిట్‌ల్యాబ్ రన్నర్?
  5. క్లౌడ్ ప్రొవైడర్‌లోని కుబెర్నెట్స్ గురించి ఏమిటి?

మొదట ఏమి వచ్చింది: నేను నా కోడ్‌ని అప్‌లోడ్ చేసే 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 రన్నర్.

రెసిపీ:

  1. ప్యానెల్ నుండి MY_SELECTEL_TOKEN పొందండి my.selectel.ru.
  2. ఖాతా టోకెన్‌ని బదిలీ చేయడం ద్వారా కుబెర్నెట్స్ క్లస్టర్‌ను సృష్టించండి.
  3. సృష్టించిన క్లస్టర్ నుండి KUBECONFIGని పొందండి.
  4. Kubernetesలో GitLabని ఇన్‌స్టాల్ చేయండి.
  5. వినియోగదారు కోసం సృష్టించబడిన GitLab నుండి GitLab-టోకెన్‌ను పొందండి రూట్.
  6. GitLab-టోకెన్‌ని ఉపయోగించి GitLabలో ప్రాజెక్ట్ నిర్మాణాన్ని సృష్టించండి.
  7. ఇప్పటికే ఉన్న కోడ్‌ని GitLabకి పుష్ చేయండి.
  8. ???
  9. లాభం!

1 అడుగు. విభాగంలో టోకెన్ పొందవచ్చు API కీలు.

చికెన్ లేదా గుడ్డు: IaCని విభజించడం2 అడుగు. మేము 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

మరియు ఈ టోకెన్‌తో నిర్వహించబడే కుబెర్నెట్స్ సెలెక్టెల్ APIకి అభ్యర్థన చేయండి. k8s_id ఇస్తుంది terraform:

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 నుండి తీసుకోవచ్చు అధికారిక రిపోజిటరీ.

మొదట్లో నేను జోన్‌లో ఒక క్లస్టర్‌ని ఎంచుకున్నాను en-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

ఇది దాదాపు 3-4 నిమిషాల పాటు బాహ్య IPని అందుకోవడానికి మేము వేచి ఉన్నాము:

చికెన్ లేదా గుడ్డు: 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 అడుగు. Gitlab ప్రొవైడర్‌ని ఉపయోగించి Git రిపోజిటరీలను సరైన సోపానక్రమానికి తీసుకురావడం.

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కి బదిలీ చేయాలి. దీన్ని ఎలా చేయాలో తదుపరి భాగంలో ఉంది.

మా సబ్స్క్రయిబ్ బ్లాగ్కొత్త కథనాల విడుదలను కోల్పోకుండా ఉండేందుకు!

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి