Polo ou ovo: dividir IaC

Polo ou ovo: dividir IaC
O que foi primeiro: a galiña ou o ovo? Un comezo bastante estraño para un artigo sobre Infraestrutura-como-Código, non é?

Que é un ovo?

Na maioría das veces, Infrastructure-as-Code (IaC) é unha forma declarativa de representar a infraestrutura. Nel describimos o estado que queremos acadar, empezando pola parte de hardware e rematando coa configuración do software. Polo tanto, IaC úsase para:

  1. Provisión de recursos. Estes son máquinas virtuales, S3, VPC, etc. Ferramentas básicas para o traballo: Terraform и CloudFormation.
  2. Configuración do software. Ferramentas básicas: Ansible, chef, etc.

Calquera código está nos repositorios git. E tarde ou cedo o líder do equipo decidirá que hai que poñerlles orde. E refactorizará. E creará algunha estrutura. E verá que isto é bo.

Tamén é bo que xa exista GitLab и GitHub-proveedor de Terraform (e isto é Configuración de software). Coa súa axuda, pode xestionar todo o proxecto: membros do equipo, CI/CD, git-flow, etc.

De onde veu o ovo?

Polo que pouco a pouco imos achegando a cuestión principal.

Primeiro de todo, cómpre comezar cun repositorio que describa a estrutura doutros depósitos, incluído vostede mesmo. E, por suposto, como parte de GitOps, cómpre engadir CI para que os cambios se executen automaticamente.

Se Git aínda non se creou?

  1. Como almacenalo en Git?
  2. Como instalar CI?
  3. Se tamén implementamos Gitlab usando IaC, e mesmo en Kubernetes?
  4. E GitLab Runner tamén en Kubernetes?
  5. Que pasa con Kubernetes no provedor de nube?

O que foi primeiro: o GitLab onde cargarei o meu código ou o código que describe que tipo de GitLab necesito?

Polo con ovos

«Oyakodon3 cun dinosauro" [src]

Tentemos cociñar un prato usando como provedor na nube Kubernetes Selectel xestionado.

TL, RD

É posible unirse a un equipo á vez?

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

Ingredientes:

  • Conta de my.selectel.ru;
  • Token de conta;
  • habilidades de Kubernetes;
  • Habilidades de timón;
  • Habilidades Terraform;
  • Gráfico de dirección GitLab;
  • Gráfico de timón GitLab Runner.

Receita:

  1. Obtén MY_SELECTEL_TOKEN do panel my.selectel.ru.
  2. Crea un clúster de Kubernetes transfiríndolle un token de conta.
  3. Obtén KUBECONFIG do clúster creado.
  4. Instala GitLab en Kubernetes.
  5. Obtén o token de GitLab de GitLab creado para o usuario raíz.
  6. Crea unha estrutura de proxecto en GitLab usando GitLab-token.
  7. Envía o código existente a GitLab.
  8. ?
  9. Beneficio!

Paso 1. O token pódese obter na sección Claves API.

Polo ou ovo: dividir IaCPaso 2. Preparamos o noso Terraform para "cocer" un grupo de 2 nodos. Se estás seguro de que tes recursos suficientes para todo, podes activar as cotas automáticas:

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

Engade un usuario ao proxecto:

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
}

Saída:

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
}

Imos lanzar:

$ 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

Polo ou ovo: dividir IaC
Paso 3. Temos a cubeconfig.

Para descargar KUBECONFIG mediante programación, debes obter un token de OpenStack:

openstack token issue -c id -f value > token

E con este token fai unha solicitude á API Managed Kubernetes Selectel. k8s_id problemas terraform:

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

Tamén se pode acceder a Cupconfig a través do panel.

Polo ou ovo: dividir IaC
Paso 4. Despois de que o racimo estea cocido e teñamos acceso a el, podemos engadir xaml por riba ao gusto.

Prefiro engadir:

  • espazo de nomes
  • clase de almacenamento
  • política de seguridade do pod, etc.

Clase de almacenamento para Selectel pódese tomar de repositorio oficial.

Xa que inicialmente seleccionei un clúster na zona ru-3a, entón necesito a clase de almacenamento desta zona.

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

Paso 5. Instalar un equilibrador de carga.

Usaremos o estándar para moitos nginx-ingress. Xa hai moitas instrucións para instalalo, así que non nos deteremos nel.

$ 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

Agardamos a que reciba unha IP externa durante uns 3-4 minutos:

Polo ou ovo: dividir IaC
IP externa recibida:

Polo ou ovo: dividir IaC
Paso 6. Instala 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"

De novo agardamos a que suban todas as vainas.

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

As vainas levantáronse:

Polo ou ovo: dividir IaC
Paso 7. Recibimos o token de GitLab.

Primeiro, descubra o contrasinal de inicio de sesión:

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

Agora imos iniciar sesión e obter un token:

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

Paso 8. Levar os repositorios de Git á xerarquía correcta usando o provedor de Gitlab.

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

Desafortunadamente, terraform GitLab provedor ten un flotante erro. Despois terás que eliminar os proxectos en conflito manualmente para que se corrixa tf.state. A continuación, volve executar o comando `$make all`

Paso 9. Transferimos repositorios locais ao servidor.

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

Feito:

Polo ou ovo: dividir IaC
Polo ou ovo: dividir IaC
Polo ou ovo: dividir IaC

Conclusión

Conseguimos que poidamos xestionar todo de forma declarativa desde a nosa máquina local. Agora quero transferir todas estas tarefas a CI e só premer os botóns. Para iso, necesitamos transferir os nosos estados locais (estado Terraform) a CI. Como facelo está na seguinte parte.

Subscríbete ao noso Blogpara non perderse o lanzamento de novos artigos!

Fonte: www.habr.com

Engadir un comentario