рдХреБрдЦреБрд░рд╛ рд╡рд╛ рдЕрдгреНрдбрд╛: рд╡рд┐рднрд╛рдЬрди IaC

рдХреБрдЦреБрд░рд╛ рд╡рд╛ рдЕрдгреНрдбрд╛: рд╡рд┐рднрд╛рдЬрди IaC
рдкрд╣рд┐рд▓реЗ рдХреЗ рдЖрдпреЛ - рдХреБрдЦреБрд░рд╛ рд╡рд╛ рдЕрдгреНрдбрд╛? рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░-рдПрдЬ-рдХреЛрдбрдХреЛ рдмрд╛рд░реЗрдорд╛ рд▓реЗрдЦрдХреЛ рд▓рд╛рдЧрд┐ рдПрдХрджрдореИ рдЕрдиреМрдареЛ рд╕реБрд░реБрд╡рд╛рдд, рд╣реИрди?

рдЕрдгреНрдбрд╛ рдХреЗ рд╣реЛ?

рдкреНрд░рд╛рдпрдГ, рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░-рдПрдЬ-рдХреЛрдб (IaC) рдкреВрд░реНрд╡рд╛рдзрд╛рд░рдХреЛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрдиреЗ рдШреЛрд╖рдгрд╛рддреНрдордХ рддрд░рд┐рдХрд╛ рд╣реЛред рдпрд╕рдорд╛ рд╣рд╛рдореАрд▓реЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рднрд╛рдЧрдмрд╛рдЯ рд╕реБрд░реБ рдЧрд░реА рд╕рдлреНрдЯрд╡реЗрдпрд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдорд╛ рд╕рдорд╛рдкреНрдд рд╣реБрдиреЗ рдЕрд╡рд╕реНрдерд╛рдХреЛ рд╡рд░реНрдгрди рдЧрд░реНрдЫреМрдВред рддреНрдпрд╕реИрд▓реЗ IaC рдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ:

  1. рд╕реНрд░реЛрдд рдкреНрд░рд╛рд╡рдзрд╛рдиред рдпреА VMs, S3, VPC, рдЖрджрд┐ рд╣реБрдиреНред рдХрд╛рдордХреЛ рд▓рд╛рдЧрд┐ рдЖрдзрд╛рд░рднреВрдд рдЙрдкрдХрд░рдгрд╣рд░реВ: рдЯреНрд░рд╛рдлрд░реНрдо ╨╕ CloudFormation.
  2. рд╕рдлреНрдЯрд╡реЗрдпрд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдиред рдЖрдзрд╛рд░рднреВрдд рдЙрдкрдХрд░рдгрд╣рд░реВ: рдЕрдЬреНрдЮрд╛рдд, рд╢реЗрдл, рдЖрджрд┐ред

рдХреБрдиреИ рдкрдирд┐ рдХреЛрдб git рднрдгреНрдбрд╛рд░рд╣рд░реВрдорд╛ рдЫред рд░ рдврд┐рд▓реЛ рд╡рд╛ рдкрдЫрд┐ рдЯреЛрд▓реА рдиреЗрддрд╛рд▓реЗ рдирд┐рд░реНрдгрдп рдЧрд░реНрдиреЗрдЫ рдХрд┐ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдХреНрд░рдордмрджреНрдз рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рд░ рдЙрд╕рд▓реЗ рд░рд┐рдлреНрдпрд╛рдХреНрдЯрд░ рдЧрд░реНрдиреЗрдЫред рд░ рдпрд╕рд▓реЗ рдХреЗрд╣реА рд╕рдВрд░рдЪрдирд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗрдЫред рд░ рдЙрд╕рд▓реЗ рджреЗрдЦреНрдиреЗрдЫ рдХрд┐ рдпреЛ рд░рд╛рдореНрд░реЛ рдЫред

рдпреЛ рдкрдирд┐ рд░рд╛рдореНрд░реЛ рдЫ рдХрд┐ рдпреЛ рдкрд╣рд┐рд▓реЗ рдиреИ рдЕрд╡рд╕реНрдерд┐рдд рдЫ GitLab ╨╕ GitHubTerraform рдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рджрд╛рдпрдХ (рд░ рдпреЛ рд╕рдлреНрдЯрд╡реЗрдпрд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд╣реЛ)ред рддрд┐рдиреАрд╣рд░реВрдХреЛ рдорджреНрджрддрд▓реЗ, рддрдкрд╛рдИрдВрд▓реЗ рд╕рдореНрдкреВрд░реНрдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ: рдЯреЛрд▓реА рд╕рджрд╕реНрдпрд╣рд░реВ, CI/CD, git-flow, рдЖрджрд┐ред

рдЕрдгреНрдбрд╛ рдХрд╣рд╛рдБрдмрд╛рдЯ рдЖрдпреЛ ?

рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореА рдмрд┐рд╕реНрддрд╛рд░реИ рдореБрдЦреНрдп рдкреНрд░рд╢реНрдирдорд╛ рдкреБрдЧреНрджреИрдЫреМрдВред

рд╕рдмреИ рднрдиреНрджрд╛ рдкрд╣рд┐рд▓реЗ, рддрдкрд╛рдЗрдБ рдПрдХ рднрдгреНрдбрд╛рд░ рд╕рдВрдЧ рд╕реБрд░реБ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рдЬреБрди рддрдкрд╛рдЗрдБ рд╕рд╣рд┐рдд рдЕрдиреНрдп рднрдгреНрдбрд╛рд░ рдХреЛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╡рд░реНрдгрди рдЧрд░реНрджрдЫред рд░ рдЕрд╡рд╢реНрдп рдкрдирд┐, GitOps рдХреЛ рднрд╛рдЧрдХреЛ рд░реВрдкрдорд╛, рддрдкрд╛рдИрдВрд▓реЗ CI рдердкреНрдиреБ рдкрд░реНрдЫ рддрд╛рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реБрдиреНрдЫрдиреНред

рдпрджрд┐ Git рдЕрдЭреИ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдЫреИрди?

  1. рдпрд╕рд▓рд╛рдИ Git рдорд╛ рдХрд╕рд░реА рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрдиреЗ?
  2. CI рдХрд╕рд░реА рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреЗ?
  3. рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ Gitlab рд▓рд╛рдИ IaC рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░, рд░ Kubernetes рдорд╛ рдкрдирд┐ рддреИрдирд╛рдд рдЧрд░реНрдЫреМрдВ рднрдиреЗ?
  4. рд░ GitLab рдзрд╛рд╡рдХ рдкрдирд┐ Kubernetes рдорд╛?
  5. рдХреНрд▓рд╛рдЙрдб рдкреНрд░рджрд╛рдпрдХрдорд╛ Kubernetes рдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреЗ рд╣реЛ?

рдкрд╣рд┐рд▓реЗ рдХреЗ рдЖрдпреЛ: GitLab рдЬрд╣рд╛рдБ рдореИрд▓реЗ рдореЗрд░реЛ рдХреЛрдб рдЕрдкрд▓реЛрдб рдЧрд░реНрдиреЗрдЫреБ, рд╡рд╛ рдорд▓рд╛рдИ рдХрд╕реНрддреЛ рдкреНрд░рдХрд╛рд░рдХреЛ GitLab рдЪрд╛рд╣рд┐рдиреНрдЫ рднрдиреЗрд░ рд╡рд░реНрдгрди рдЧрд░реНрдиреЗ рдХреЛрдб?

рдЕрдгреНрдбрд╛ рд╕рдВрдЧ рдЪрд┐рдХрди

┬лрдУрдпрд╛рдХреЛрдбреЛрди3 рдбрд╛рдпрдирд╛рд╕реЛрд░ рд╕рдВрдЧ" [src]

рдХреНрд▓рд╛рдЙрдб рдкреНрд░рджрд╛рдпрдХрдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдбрд┐рд╢ рдкрдХрд╛рдЙрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВ Kubernetes Selectel рд╡реНрдпрд╡рд╕реНрдерд┐рдд.

TL; рдб

рдХреЗ рдпреЛ рдПрдХреИ рдкрдЯрдХ рдПрдХ рдЯреЛрд▓реАрдорд╛ рд╕рд╛рдореЗрд▓ рд╣реБрди рд╕рдореНрднрд╡ рдЫ?

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

рд╕рд╛рдордЧреНрд░реАрд╣рд░реВ:

  • my.selectel.ru рдмрд╛рдЯ рдЦрд╛рддрд╛;
  • рдЦрд╛рддрд╛ рдЯреЛрдХрди;
  • Kubernetes рдХреМрд╢рд▓;
  • рд╣реЗрд▓реНрдо рдХреМрд╢рд▓;
  • рдЯреЗрд░рд╛рдлрд╛рд░реНрдо рдХреМрд╢рд▓;
  • рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯ GitLab;
  • рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯ GitLab рдзрд╛рд╡рдХред

рдкрдХрд╛рдЙрдиреБрд╣реЛрд╕реН:

  1. рдкреНрдпрд╛рдирд▓рдмрд╛рдЯ MY_SELECTEL_TOKEN рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН my.selectel.ru.
  2. рдпрд╕рдорд╛ рдЦрд╛рддрд╛ рдЯреЛрдХрди рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реЗрд░ Kubernetes рдХреНрд▓рд╕реНрдЯрд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реНред
  3. рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдХреНрд▓рд╕реНрдЯрд░рдмрд╛рдЯ KUBECONFIG рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реНред
  4. Kubernetes рдорд╛ GitLab рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реНред
  5. рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ GitLab рдмрд╛рдЯ GitLab-рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН рдореВрд▓.
  6. GitLab-рдЯреЛрдХрди рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ GitLab рдорд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд░рдЪрдирд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реНред
  7. GitLab рдорд╛ рдЕрд╡рд╕реНрдерд┐рдд рдХреЛрдб рдкреБрд╢ рдЧрд░реНрдиреБрд╣реЛрд╕реНред
  8. ???
  9. рд▓рд╛рдн!

1 рдХрджрдоред рдЯреЛрдХрди рдЦрдгреНрдбрдорд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ API рдХреБрдЮреНрдЬреАрд╣рд░реВ.

рдХреБрдЦреБрд░рд╛ рд╡рд╛ рдЕрдгреНрдбрд╛: рд╡рд┐рднрд╛рдЬрди IaC2 рдХрджрдоред рд╣рд╛рдореА 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 рдХрджрдоред рд╣рд╛рдореАрд▓реЗ рдХреНрдпреВрдм рдХрдиреНрдлрд┐рдЧрд┐рдЩ рдкрд╛рдЙрдБрдЫреМрдВред

рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдкрдорд╛ KUBECONFIG рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрди, рддрдкрд╛рдИрдВрд▓реЗ OpenStack рдмрд╛рдЯ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ:

openstack token issue -c id -f value > token

рд░ рдпрд╕ рдЯреЛрдХрдирдХреЛ рд╕рд╛рде рд╡реНрдпрд╡рд╕реНрдерд┐рдд Kubernetes Selectel 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

рдХрдк рдХрдиреНрдлрд┐рдЧ рдкреНрдпрд╛рдирд▓ рдорд╛рд░реНрдлрдд рдкрдирд┐ рдкрд╣реБрдБрдЪ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред

рдХреБрдЦреБрд░рд╛ рд╡рд╛ рдЕрдгреНрдбрд╛: рд╡рд┐рднрд╛рдЬрди IaC
4 рдХрджрдоред рдХреНрд▓рд╕реНрдЯрд░ рдмреЗрдХ рдЧрд░рд┐рд╕рдХреЗрдкрдЫрд┐ рд░ рд╣рд╛рдореАрд╕рдБрдЧ рдпрд╕рдорд╛ рдкрд╣реБрдБрдЪ рдЫ, рд╣рд╛рдореА рд╕реНрд╡рд╛рджрдХреЛ рд▓рд╛рдЧрд┐ рдорд╛рдерд┐ yaml рдердкреНрди рд╕рдХреНрдЫреМрдВред

рдо рдердкреНрди рд░реБрдЪрд╛рдЙрдБрдЫреБ:

  • рдирд╛рдо рд╕реНрдерд╛рди
  • рднрдгреНрдбрд╛рд░рдг рд╡рд░реНрдЧ
  • рдкреЛрдб рд╕реБрд░рдХреНрд╖рд╛ рдиреАрддрд┐ рд░ рдпрд╕реНрддреИред

рднрдгреНрдбрд╛рд░рдг рдХрдХреНрд╖рд╛ 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 - рдкреНрд░рд╡реЗрд╢ред рдпрд╕рд▓рд╛рдИ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рдкрд╣рд┐рд▓реЗ рдиреИ рдзреЗрд░реИ рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВ рдЫрдиреН, рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореА рдпрд╕рдорд╛ рдмрд╕реНрдиреЗ рдЫреИрдиреМрдВред

$ 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-рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдЫреМрдВред

рдкрд╣рд┐рд▓реЗ, рд▓рдЧрдЗрди рдкрд╛рд╕рд╡рд░реНрдб рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрдиреБрд╣реЛрд╕реН:

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди