Kana tai muna: IaC:n halkaisu

Kana tai muna: IaC:n halkaisu
Mikä oli ensin - kana vai muna? Aika outo alku Infrastructure-as-Codea käsittelevälle artikkelille, eikö niin?

Mikä on muna?

Useimmiten Infrastructure-as-Code (IaC) on deklaratiivinen tapa esittää infrastruktuuria. Siinä kuvaamme tilaa, jonka haluamme saavuttaa, alkaen laitteisto-osasta ja päättyen ohjelmiston konfigurointiin. Siksi IaC:tä käytetään:

  1. Resurssien tarjonta. Nämä ovat VM:t, S3, VPC jne. Perustyökalut työhön: terraform и Pilvenmuodostus.
  2. Ohjelmistotuotteen. Perustyökalut: Ansible, kokki jne.

Mikä tahansa koodi on git-varastoissa. Ja ennemmin tai myöhemmin ryhmänjohtaja päättää, että ne on saatettava järjestykseen. Ja hän reagoi. Ja se luo jonkinlaisen rakenteen. Ja hän näkee, että tämä on hyvä.

On myös hyvä, että se on jo olemassa GitLab и GitHub-tarjoaja Terraformille (ja tämä on Software Configuration). Heidän avullaan voit hallita koko projektia: tiimin jäsenet, CI/CD, git-flow jne.

Mistä muna tuli?

Olemme siis vähitellen lähestymässä pääkysymystä.

Ensinnäkin sinun on aloitettava arkistosta, joka kuvaa muiden arkiston rakenteen, mukaan lukien itsesi. Ja tietysti osana GitOpsia sinun on lisättävä CI, jotta muutokset suoritetaan automaattisesti.

Jos Gitiä ei ole vielä luotu?

  1. Kuinka säilyttää se Gitissä?
  2. Kuinka asentaa CI?
  3. Jos otamme käyttöön myös Gitlabin IaC:n avulla ja jopa Kubernetesissa?
  4. Ja GitLab Runner myös Kubernetesissa?
  5. Entä Kubernetes pilvipalvelussa?

Mikä tuli ensin: GitLab, johon lataan koodini, vai koodi, joka kuvaa millaisen GitLabin tarvitsen?

Kana munien kanssa

«Oyakodon3 dinosauruksen kanssa" [src]

Yritetään valmistaa ruoka pilvipalveluntarjoajana Hallittu Kubernetes Selectel.

TL; DR

Onko mahdollista liittyä yhteen joukkueeseen kerralla?

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

Ainekset:

  • Tili osoitteesta my.selectel.ru;
  • Tilin tunnus;
  • Kubernetes-taidot;
  • Helm Skills;
  • Terraformin taidot;
  • Ruorikaavio GitLab;
  • Ruorikaavio GitLab Runner.

resepti:

  1. Hanki MY_SELECTEL_TOKEN paneelista my.selectel.ru.
  2. Luo Kubernetes-klusteri siirtämällä siihen tilitunnus.
  3. Hanki KUBECONFIG luodusta klusterista.
  4. Asenna GitLab Kubernetesiin.
  5. Hanki GitLab-tunnus GitLabista, joka on luotu käyttäjälle juuri.
  6. Luo projektirakenne GitLabissa käyttämällä GitLab-tunnusta.
  7. Lähetä olemassa oleva koodi GitLabiin.
  8. ?
  9. Voitto!

Vaihe 1. Tokenin saa osiosta API-avaimet.

Kana tai muna: IaC:n halkaisuVaihe 2. Valmistamme Terraformimme kahden solmun klusterin "leivomiseen". Jos olet varma, että sinulla on tarpeeksi resursseja kaikkeen, voit ottaa automaattiset kiintiöt käyttöön:

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

Lisää käyttäjä projektiin:

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
}

Lähtö:

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
}

Aloitetaan:

$ 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

Kana tai muna: IaC:n halkaisu
Vaihe 3. Saamme cubeconfigin.

Jotta voit ladata KUBECONFIGin ohjelmallisesti, sinun on hankittava token OpenStackista:

openstack token issue -c id -f value > token

Tee tällä tunnuksella pyyntö Managed Kubernetes Selectel -sovellusliittymälle. k8s_id antaa ulos terraformi:

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

Cupconfigiin pääsee myös paneelin kautta.

Kana tai muna: IaC:n halkaisu
Vaihe 4. Kun klusteri on paistettu ja meillä on pääsy siihen, voimme lisätä päälle yamlia maun mukaan.

Lisään mieluummin:

  • nimiavaruus,
  • varastointiluokka
  • pod-turvapolitiikka ja niin edelleen.

Varastointiluokka varten Selectel voidaan ottaa virallinen arkisto.

Koska alun perin valitsin vyöhykkeeltä klusterin ru-3a, tarvitsen tallennusluokan tältä vyöhykkeeltä.

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

Vaihe 5. Asenna kuormantasauslaite.

Käytämme monille tavallista nginx-ingressio. Ohjeita sen asentamiseen on jo runsaasti, joten emme jää siihen kiinni.

$ 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

Odotamme sen saavan ulkoisen IP-osoitteen noin 3-4 minuuttia:

Kana tai muna: IaC:n halkaisu
Vastaanotettu ulkoinen IP:

Kana tai muna: IaC:n halkaisu
Vaihe 6. Asenna 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"

Odotamme jälleen, että kaikki palot nousevat.

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

Palkot nousivat:

Kana tai muna: IaC:n halkaisu
Vaihe 7. Saamme GitLab-tunnuksen.

Selvitä ensin kirjautumissalasana:

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

Nyt kirjaudutaan sisään ja hankitaan tunnus:

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

Vaihe 8. Git-tietovarastojen tuominen oikeaan hierarkiaan Gitlab Provider -palvelun avulla.

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

Valitettavasti terraform GitLab -palveluntarjoajalla on kelluva vika. Sitten sinun on poistettava ristiriitaiset projektit manuaalisesti, jotta tf.state voidaan korjata. Suorita sitten komento "$make all" uudelleen

Vaihe 9. Siirrämme paikalliset tietovarastot palvelimelle.

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

viimeistely:

Kana tai muna: IaC:n halkaisu
Kana tai muna: IaC:n halkaisu
Kana tai muna: IaC:n halkaisu

Johtopäätös

Olemme saavuttaneet sen, että voimme hallita kaikkea deklaratiivisesti paikalliselta koneeltamme. Nyt haluan siirtää kaikki nämä tehtävät CI:hen ja painaa vain painikkeita. Tätä varten meidän on siirrettävä paikalliset osavaltiot (Terraform State) CI:lle. Kuinka tämä tehdään, kerrotaan seuraavassa osassa.

Tilaa meidän blogijotta et jää paitsi uusien artikkeleiden julkaisemisesta!

Lähde: will.com

Lisää kommentti