рдЪрд┐рдХрди рдХрд┐рдВрд╡рд╛ рдЕрдВрдбреА: рд╕реНрдкреНрд▓рд┐рдЯрд┐рдВрдЧ IaC

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

рдЕрдВрдбреА рдореНрд╣рдгрдЬреЗ рдХрд╛рдп?

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

  1. рд╕рдВрд╕рд╛рдзрди рддрд░рддреВрдж. рд╣реЗ VM, S3, VPC рдЗ. рдХрд╛рдорд╛рд╕рд╛рдареА рдореВрд▓рднреВрдд рд╕рд╛рдзрдиреЗ: рдЯреЗрд░рд╛рдлреЙрд░реНрдо ╨╕ рдХреНрд▓рд╛рдЙрдбрдлреЙрд░реНрдореЗрд╢рди.
  2. рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди. рдореВрд▓рднреВрдд рд╕рд╛рдзрдиреЗ: рдЙрддреНрддрд░ рджреНрдпрд╛, рд╢реЗрдл рдЗ.

рдХреЛрдгрддрд╛рд╣реА рдХреЛрдб рдЧрд┐рдЯ рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдЬрдордзреНрдпреЗ рдЕрд╕рддреЛ. рдЖрдгрд┐ рд▓рд╡рдХрд░рдЪ рдХрд┐рдВрд╡рд╛ рдирдВрддрд░ рдЯреАрдо рд▓реАрдбрд░ рдард░рд╡реЗрд▓ рдХреА рддреНрдпрд╛рдВрдирд╛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдареЗрд╡рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ. рдЖрдгрд┐ рддреЛ рд░рд┐рдлреЕрдХреНрдЯрд░ рдХрд░реЗрд▓. рдЖрдгрд┐ рддреНрдпрд╛рддреВрди рдХрд╛рд╣реА рд░рдЪрдирд╛ рддрдпрд╛рд░ рд╣реЛрдИрд▓. рдЖрдгрд┐ рддреЛ рдкрд╛рд╣реАрд▓ рдХреА рд╣реЗ рдЪрд╛рдВрдЧрд▓реЗ рдЖрд╣реЗ.

рддреЗ рдЖрдзреАрдЪ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЖрд╣реЗ рд╣реЗ рджреЗрдЦреАрд▓ рдЪрд╛рдВрдЧрд▓реЗ рдЖрд╣реЗ рдЧрд┐рдЯреЕрдм ╨╕ GitHub- рдЯреЗрд░рд╛рдлреЙрд░реНрдорд╕рд╛рдареА рдкреНрд░рджрд╛рддрд╛ (рдЖрдгрд┐ рд╣реЗ рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЖрд╣реЗ). рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдорджрддреАрдиреЗ, рддреБрдореНрд╣реА рд╕рдВрдкреВрд░реНрдг рдкреНрд░рдХрд▓реНрдк рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд░реВ рд╢рдХрддрд╛: рдЯреАрдо рд╕рджрд╕реНрдп, CI/CD, git-flow, рдЗ.

рдЕрдВрдбреА рдХреБрдареВрди рдЖрд▓реА?

рддреНрдпрд╛рдореБрд│реЗ рдЖрдкрдг рд╣рд│реВрд╣рд│реВ рдореБрдЦреНрдп рдкреНрд░рд╢реНрдирд╛рдХрдбреЗ рдЬрд╛рдд рдЖрд╣реЛрдд.

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

Git рдЕрдЬреВрди рддрдпрд╛рд░ рдЭрд╛рд▓реЗ рдирд╕реЗрд▓ рддрд░?

  1. рддреЗ Git рдордзреНрдпреЗ рдХрд╕реЗ рд╕рд╛рдард╡рд╛рдпрдЪреЗ?
  2. рд╕реАрдЖрдп рдХрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛рд╡реЗ?
  3. рдЬрд░ рдЖрдореНрд╣реА IaC рд╡рд╛рдкрд░реВрди рдЧрд┐рдЯрд▓реЕрдм рддреИрдирд╛рдд рдХреЗрд▓реЗ рддрд░ рдЖрдгрд┐ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рдордзреНрдпреЗ рджреЗрдЦреАрд▓?
  4. рдЖрдгрд┐ GitLab рд░рдирд░ рджреЗрдЦреАрд▓ Kubernetes рдордзреНрдпреЗ?
  5. рдХреНрд▓рд╛рдЙрдб рдкреНрд░рджрд╛рддреНрдпрд╛рдордзреАрд▓ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рдЪреЗ рдХрд╛рдп?

рдкреНрд░рдердо рдХрд╛рдп рдЖрд▓реЗ: 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 рд╡рд░реВрди рдЦрд╛рддреЗ;
  • рдЦрд╛рддреЗ рдЯреЛрдХрди;
  • рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдХреМрд╢рд▓реНрдпреЗ;
  • рд╣реЗрд▓реНрдо рдХреМрд╢рд▓реНрдпреЗ;
  • рдЯреЗрд░рд╛рдлреЙрд░реНрдо рдХреМрд╢рд▓реНрдпреЗ;
  • рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯ 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 рдХреА.

рдЪрд┐рдХрди рдХрд┐рдВрд╡рд╛ рдЕрдВрдбреА: рд╕реНрдкреНрд▓рд┐рдЯрд┐рдВрдЧ 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

рдЖрдгрд┐ рдпрд╛ рдЯреЛрдХрдирд╕рд╣ рдореЕрдиреЗрдЬреНрдб рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рд╕рд┐рд▓реЗрдХреНрдЯрд▓ API рд▓рд╛ рд╡рд┐рдирдВрддреА рдХрд░рд╛. k8s_id рдмрд╛рд╣реЗрд░ рджреЗрддреЗ рдЫрдд:

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 рдкрд╛рдКрд▓. рдХреНрд▓рд╕реНрдЯрд░ рдмреЗрдХ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ рдЖрдгрд┐ рдЖрдореНрд╣рд╛рд▓рд╛ рддреНрдпрд╛рдд рдкреНрд░рд╡реЗрд╢ рдорд┐рд│рд╛рд▓реНрдпрд╛рдирдВрддрд░, рдЖрдореНрд╣реА рдЪрд╡реАрдиреБрд╕рд╛рд░ рд╡рд░ рдпрд╛рдорд▓ рдШрд╛рд▓реВ рд╢рдХрддреЛ.

рдореА рдЬреЛрдбрдгреНрдпрд╛рд╕ рдкреНрд░рд╛рдзрд╛рдиреНрдп рджреЗрддреЛ:

  • рдиреЗрдорд╕реНрдкреЗрд╕
  • рд╕реНрдЯреЛрд░реЗрдЬ рд╡рд░реНрдЧ
  • рдкреЙрдб рд╕реБрд░рдХреНрд╖рд╛ рдзреЛрд░рдг рдЖрдгрд┐ рдпрд╛рдкреНрд░рдорд╛рдгреЗ.

рд╕реНрдЯреЛрд░реЗрдЬ рд╡рд░реНрдЧ рд╕рд╛рдареА 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 рдорд┐рдирд┐рдЯреЗ рдмрд╛рд╣реНрдп 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

рджреБрд░реНрджреИрд╡рд╛рдиреЗ, рдЯреЗрд░рд╛рдлреЙрд░реНрдо рдЧрд┐рдЯрд▓реЕрдм рдкреНрд░рджрд╛рддреНрдпрд╛рдХрдбреЗ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдЖрд╣реЗ рдХрд┐рдбрд╛. рдирдВрддрд░ 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 рд╡рд░ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рд╛рдпрдЪреА рдЖрд╣реЗрдд рдЖрдгрд┐ рдлрдХреНрдд рдмрдЯрдгреЗ рджрд╛рдмрд╛рдпрдЪреА рдЖрд╣реЗрдд. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрдордЪреА рд╕реНрдерд╛рдирд┐рдХ рд░рд╛рдЬреНрдпреЗ (рдЯреЗрд░рд╛рдлреЙрд░реНрдо рд╕реНрдЯреЗрдЯ) рд╕реАрдЖрдпрдХрдбреЗ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╣реЗ рдХрд╕реЗ рдХрд░рд╛рдпрдЪреЗ рддреЗ рдкреБрдвреАрд▓ рднрд╛рдЧрд╛рдд рдЖрд╣реЗ.

рдЖрдордЪреНрдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рдШреНрдпрд╛ рдмреНрд▓реЙрдЧрдирд╡реАрди рд▓реЗрдЦрд╛рдВрдЪреЗ рдкреНрд░рдХрд╛рд╢рди рдЪреБрдХрд╡реВ рдирдпреЗ рдореНрд╣рдгреВрди!

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛