рдореБрд░реНрдЧреА рдпрд╛ рдЕрдВрдбрд╛: IaC рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛

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

рдЕрдВрдбрд╛ рдХреНрдпрд╛ рд╣реИ?

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

  1. рд╕рдВрд╕рд╛рдзрди рдкреНрд░рд╛рд╡рдзрд╛рди. рдпреЗ рд╡реАрдПрдо, рдПрд╕3, рд╡реАрдкреАрд╕реА рдЖрджрд┐ рд╣реИрдВред рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рдЙрдкрдХрд░рдг: terraform ╨╕ рдмрд╛рджрд▓ рдирд┐рд░реНрдорд╛рдг.
  2. рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╡рд┐рдиреНрдпрд╛рд╕. рдмреБрдирд┐рдпрд╛рджреА рдЙрдкрдХрд░рдг: Ansible, рдмрд╛рд╡рд░реНрдЪреА, рдЖрджрд┐ред

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

рдпрд╣ рднреА рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореМрдЬреВрдж рд╣реИ GitLab ╨╕ GitHub-рдЯреЗрд░рд╛рдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рддрд╛ (рдФрд░ рдпрд╣ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИ)ред рдЙрдирдХреА рдорджрдж рд╕реЗ, рдЖрдк рдкреВрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдп, рд╕реАрдЖрдИ/рд╕реАрдбреА, рдЧрд┐рдЯ-рдлреНрд▓реЛ, рдЖрджрд┐ред

рдЕрдВрдбрд╛ рдХрд╣рд╛рдВ рд╕реЗ рдЖрдпрд╛?

рдЗрд╕рд▓рд┐рдП рд╣рдо рдзреАрд░реЗ-рдзреАрд░реЗ рдореБрдЦреНрдп рдкреНрд░рд╢реНрди рдкрд░ рдкрд╣реБрдБрдЪ рд░рд╣реЗ рд╣реИрдВред

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

рдпрджрд┐ Git рдЕрднреА рддрдХ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ?

  1. рдЗрд╕реЗ Git рдореЗрдВ рдХреИрд╕реЗ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ?
  2. рд╕реАрдЖрдИ рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ?
  3. рдпрджрд┐ рд╣рдо IaC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ Kubernetes рдореЗрдВ рднреА Gitlab рдХреЛ рддреИрдирд╛рдд рдХрд░реЗрдВ?
  4. рдФрд░ рдЧрд┐рдЯрд▓реИрдм рд░рдирд░ рднреА рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ?
  5. рдХреНрд▓рд╛рдЙрдб рдкреНрд░рджрд╛рддрд╛ рдореЗрдВ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдХреНрдпрд╛ рдЖрдпрд╛: GitLab рдЬрд╣рд╛рдВ рдореИрдВ рдЕрдкрдирд╛ рдХреЛрдб рдЕрдкрд▓реЛрдб рдХрд░реВрдВрдЧрд╛, рдпрд╛ рд╡рд╣ рдХреЛрдб рдЬреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ GitLab рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рдЕрдВрдбреЗ рдХреЗ рд╕рд╛рде рдЪрд┐рдХрди

┬лрдУрдпрд╛рдХреЛрдбреЛрди3 рдПрдХ рдбрд╛рдпрдирд╛рд╕реЛрд░ рдХреЗ рд╕рд╛рде" ["]

рдЖрдЗрдП рдХреНрд▓рд╛рдЙрдб рдкреНрд░рджрд╛рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╡реНрдпрдВрдЬрди рдкрдХрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдкреНрд░рдмрдВрдзрд┐рдд рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рд╕реЗрд▓реЗрдХреНрдЯреЗрд▓.

TL, рдбреЙ

рдХреНрдпрд╛ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдПрдХ рдЯреАрдо рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рд╕рдВрднрд╡ рд╣реИ?

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

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

  • My.selectel.ru рд╕реЗ рдЦрд╛рддрд╛;
  • рдЦрд╛рддрд╛ рдЯреЛрдХрди;
  • рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреМрд╢рд▓;
  • рд╣реЗрд▓реНрдо рдХреМрд╢рд▓;
  • рдЯреЗрд░рд╛рдлрд╝реЙрд░реНрдо рдХреМрд╢рд▓;
  • рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯ рдЧрд┐рдЯрд▓реИрдм;
  • рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯ рдЧрд┐рдЯрд▓реИрдм рд░рдирд░ред

рдкрдХрд╛рдиреЗ рдХреА рд╡рд┐рдзрд┐:

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

1 рдХрджрдо. рдЯреЛрдХрди рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдПрдкреАрдЖрдИ рдХреБрдВрдЬреА.

рдореБрд░реНрдЧреА рдпрд╛ рдЕрдВрдбрд╛: 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 рдХрджрдо. рд╣рдореЗрдВ рдХреНрдпреВрдмрдХреЙрдиреНрдлрд┐рдЧ рдорд┐рд▓рддрд╛ рд╣реИред

KUBECONFIG рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдУрдкрдирд╕реНрдЯреИрдХ рд╕реЗ рдПрдХ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

openstack token issue -c id -f value > token

рдФрд░ рдЗрд╕ рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рдкреНрд░рдмрдВрдзрд┐рдд рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рд╕реЗрд▓реЗрдХреНрдЯреЗрд▓ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВред 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 рдХрджрдо. рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдкрдХ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрд╕ рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рд╕реНрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдКрдкрд░ рд╕реЗ рд░рддрд╛рд▓реВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рдЬреЛрдбрд╝рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ:

  • рдирд╛рдо рд╕реНрдерд╛рди,
  • рднрдВрдбрд╛рд░рдг рд╡рд░реНрдЧ
  • рдкреЙрдб рд╕реБрд░рдХреНрд╖рд╛ рдиреАрддрд┐ рдЗрддреНрдпрд╛рджрд┐ред

рднрдВрдбрд╛рд░рдг рдХрдХреНрд╖рд╛ рд╕реЗрд▓реЗрдХреНрдЯреЗрд▓ рдХреЗ рд▓рд┐рдП рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рднрдВрдбрд╛рд░.

рдЪреВрдБрдХрд┐ рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ рдореИрдВрдиреЗ рдЬрд╝реЛрди рдореЗрдВ рдПрдХ рдХреНрд▓рд╕реНрдЯрд░ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдерд╛ рдЖрд░рдпреВ-3рдП, рддреЛ рдореБрдЭреЗ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рд╕реНрдЯреЛрд░реЗрдЬ рдХреНрд▓рд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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 рдХрджрдо. рдЧрд┐рдЯрд▓реИрдм рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ.

$ 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

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЯреЗрд░рд╛рдлреЙрд░реНрдо рдЧрд┐рдЯрд▓реИрдм рдкреНрд░рджрд╛рддрд╛ рдХреЗ рдкрд╛рд╕ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рд╣реИ рдмрдЧ. рдлрд┐рд░ рдЖрдкрдХреЛ tf.state рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╣рдЯрд╛рдирд╛ рд╣реЛрдЧрд╛ред рдлрд┐рд░ рдХрдорд╛рдВрдб `$рдореЗрдХ рдСрд▓` рдХреЛ рджреЛрдмрд╛рд░рд╛ рдЪрд▓рд╛рдПрдБ

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 рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛

рдирд┐рд╖реНрдХрд░реНрд╖

рд╣рдордиреЗ рдпрд╣ рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреА рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рд╕реЗ рд╣рд░ рдЪреАрдЬрд╝ рдХреЛ рдШреЛрд╖рдгрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдм рдореИрдВ рдЗрди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реАрдЖрдИ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдмрд╕ рдмрдЯрди рджрдмрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп рд░рд╛рдЬреНрдпреЛрдВ (рдЯреЗрд░рд╛рдлреЙрд░реНрдо рд░рд╛рдЬреНрдп) рдХреЛ рд╕реАрдЖрдИ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдХреИрд╕реЗ рдХрд░реЗрдВ рдпрд╣ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╣реИред

рд╣рдорд╛рд░реА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВ рдмреНрд▓реЙрдЧрддрд╛рдХрд┐ рдирдП рд▓реЗрдЦреЛрдВ рдХреЗ рд╡рд┐рдореЛрдЪрди рд╕реЗ рди рдЪреВрдХреЗрдВ!

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ