เดšเดฟเด•เตเด•เตป เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฎเตเดŸเตเดŸ: เดตเดฟเดญเดœเดฟเด•เตเด•เตเดจเตเดจ IaC

เดšเดฟเด•เตเด•เตป เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฎเตเดŸเตเดŸ: เดตเดฟเดญเดœเดฟเด•เตเด•เตเดจเตเดจ IaC
เด†เดฆเตเดฏเด‚ เดตเดจเตเดจเดคเต เดŽเดจเตเดคเดพเดฃเต - เด•เต‹เดดเดฟเดฏเต‹ เดฎเตเดŸเตเดŸเดฏเต‹? เด‡เตปเดซเตเดฐเดพเดธเตเดŸเตเดฐเด•เตเดšเตผ-เด†เดธเต-เด•เต‹เดกเต เดŽเดจเตเดจ เดฒเต‡เด–เดจเดคเตเดคเดฟเดจเต เดคเดฟเด•เดšเตเดšเตเด‚ เดตเดฟเดšเดฟเดคเตเดฐเดฎเดพเดฏ เดคเตเดŸเด•เตเด•เด‚, เด…เดฒเตเดฒเต‡?

เด’เดฐเต เดฎเตเดŸเตเดŸ เดŽเดจเตเดคเดพเดฃเต?

เดฎเดฟเด•เตเด•เดชเตเดชเต‹เดดเตเด‚, เด‡เตปเดซเตเดฐเดพเดธเตเดŸเตเดฐเด•เตเดšเตผ-เด†เดธเต-เด•เต‹เดกเต (IaC) เดŽเดจเตเดจเดคเต เด‡เตปเดซเตเดฐเดพเดธเตเดŸเตเดฐเด•เตเดšเดฑเดฟเดจเต† เดชเตเดฐเดคเดฟเดจเดฟเดงเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เดชเตเดฐเด–เตเดฏเดพเดชเดจ เดฎเดพเตผเด—เดฎเดพเดฃเต. เด…เดคเดฟเตฝ เดนเดพเตผเดกเตโ€Œเดตเต†เดฏเตผ เดญเดพเด—เดคเตเดคเต เดจเดฟเดจเตเดจเต เด†เดฐเด‚เดญเดฟเดšเตเดšเต เดธเต‹เดซเตเดฑเตเดฑเตโ€Œเดตเต†เดฏเตผ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเดจเดฟเตฝ เด…เดตเดธเดพเดจเดฟเด•เตเด•เตเดจเตเดจ เด…เดตเดธเตเดฅเดฏเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดžเด™เตเด™เตพ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เด…เดคเดฟเดจเดพเตฝ IaC เด‡เดคเดฟเดจเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต:

  1. เดฑเดฟเดธเต‹เดดเตเดธเต เดชเตเดฐเตŠเดตเดฟเดทเตป. เด‡เดต VMs, S3, VPC เดฎเตเดคเดฒเดพเดฏเดตเดฏเดพเดฃเต. เดœเต‹เดฒเดฟเด•เตเด•เตเดณเตเดณ เด…เดŸเดฟเดธเตเดฅเดพเดจ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ: เดŸเต†เดฑเดซเต‹เด‚ ะธ เด•เตเดฒเต—เดกเต เดซเต‹เตผเดฎเต‡เดทเตป.
  2. เดธเต‹เดซเตเดฑเตเดฑเตเดตเต†เดฏเตผ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป. เด…เดŸเดฟเดธเตเดฅเดพเดจ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ: เด…เดธเดพเดงเตเดฏเด‚, เดทเต†เดซเต, เดฎเตเดคเดฒเดพเดฏเดต.

เดเดคเต เด•เต‹เดกเตเด‚ git เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเด•เดณเดฟเดฒเดพเดฃเต. เดคเดพเดฎเดธเดฟเดฏเดพเดคเต† เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดชเดฟเดจเตเดจเต€เดŸเต เดŸเต€เด‚ เดฒเต€เดกเตผ เด…เดตเดฐเต† เด•เตเดฐเดฎเดชเตเดชเต†เดŸเตเดคเตเดคเดฃเดฎเต†เดจเตเดจเต เดคเต€เดฐเตเดฎเดพเดจเดฟเด•เตเด•เตเด‚. เด…เดตเตป เดฑเต€เดซเดพเด•เตเดฑเตเดฑเตผ เดšเต†เดฏเตเดฏเตเด‚. เด…เดคเต เดšเดฟเดฒ เด˜เดŸเดจ เด‰เดฃเตเดŸเดพเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚. เด‡เดคเต เดจเดฒเตเดฒเดคเดพเดฃเต†เดจเตเดจเต เด…เดตเตป เด•เดพเดฃเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚.

เด…เดคเต เด‡เดคเดฟเดจเด•เด‚ เดจเดฟเดฒเดตเดฟเดฒเตเดฃเตเดŸเต เดŽเดจเตเดจเดคเตเด‚ เดจเดฒเตเดฒเดคเดพเดฃเต GitLab ะธ เดธเดพเดฎเต‚เดนเดฟเด•เด‚เดŸเต†เดฑเดพเดซเต‹เดฎเดฟเดจเดพเดฏเตเดณเตเดณ เดชเตเดฐเตŠเดตเตˆเดกเตผ (เด‡เดคเต เดธเต‹เดซเตเดฑเตเดฑเตโ€Œเดตเต†เดฏเตผ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเดจเดพเดฃเต). เด…เดตเดฐเตเดŸเต† เดธเดนเดพเดฏเดคเตเดคเต‹เดŸเต†, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฎเตเดดเตเดตเตป เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเตเด‚ เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเด•เตเด•เดพเดจเดพเด•เตเด‚: เดŸเต€เด‚ เด…เด‚เด—เด™เตเด™เตพ, CI/CD, git-flow เดฎเตเดคเดฒเดพเดฏเดต.

เดฎเตเดŸเตเดŸ เดŽเดตเดฟเดŸเต† เดจเดฟเดจเตเดจเต เดตเดจเตเดจเต?

เด…เดคเดฟเดจเดพเตฝ เดžเด™เตเด™เตพ เด•เตเดฐเดฎเต‡เดฃ เดชเตเดฐเดงเดพเดจ เดšเต‹เดฆเตเดฏเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เด…เดŸเตเด•เตเด•เตเดจเตเดจเต.

เด’เดจเตเดจเดพเดฎเดคเดพเดฏเดฟ, เดจเดฟเด™เตเด™เดณเตเตพเดชเตเดชเต†เดŸเต†เดฏเตเดณเตเดณ เดฎเดฑเตเดฑเต เดถเต‡เด–เดฐเดฃเด™เตเด™เดณเตเดŸเต† เด˜เดŸเดจ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดถเต‡เด–เดฐเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเดฟเด™เตเด™เตพ เด†เดฐเด‚เดญเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, GitOps-เดจเตเดฑเต† เดญเดพเด—เดฎเดพเดฏเดฟ, เดจเดฟเด™เตเด™เตพ CI เดšเต‡เตผเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต, เด…เดคเตเดตเดดเดฟ เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดธเตเดตเดฏเดฎเต‡เดต เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเด‚.

Git เด‡เดคเตเดตเดฐเต† เดธเตƒเดทเตเดŸเดฟเดšเตเดšเดฟเดŸเตเดŸเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ?

  1. เด‡เดคเต เดŽเด™เตเด™เดจเต† Git-เตฝ เดธเด‚เดญเดฐเดฟเด•เตเด•เดพเด‚?
  2. CI เดŽเด™เตเด™เดจเต† เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเด‚?
  3. IaC เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเตเด‚ เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดฟเดฒเตเด‚ เดชเต‹เดฒเตเด‚ เดจเดฎเตเดฎเตพ Gitlab เดตเดฟเดจเตเดฏเดธเดฟเดšเตเดšเดพเดฒเต‹?
  4. เด’เดชเตเดชเด‚ เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเดฟเดฒเตเด‚ GitLab เดฑเดฃเตเดฃเตผ?
  5. เด•เตเดฒเต—เดกเต เดชเตเดฐเตŠเดตเตˆเดกเดฑเดฟเดฒเต† เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดฟเดจเตเดฑเต† เด•เดพเดฐเตเดฏเดฎเต‹?

เด†เดฆเตเดฏเด‚ เดตเดจเตเดจเดคเต เดŽเดจเตเดคเดพเดฃเต: เดžเดพเตป เดŽเดจเตเดฑเต† เด•เต‹เดกเต เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจ GitLab เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดŽเดจเดฟเด•เตเด•เต เดเดคเต เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ GitLab เดตเต‡เดฃเดฎเต†เดจเตเดจเต เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจ เด•เต‹เดกเต?

เดฎเตเดŸเตเดŸเด•เดณเตเดณเตเดณ เดšเดฟเด•เตเด•เตป

ยซเด’เดฏเดพเด•เตเด•เต‹เดŸเตป3 เด’เดฐเต เดฆเดฟเดจเต‹เดธเดฑเดฟเดจเตŠเดชเตเดชเด‚" [เด‰เดฑเดตเดฟเดŸ]

เด’เดฐเต เด•เตเดฒเต—เดกเต เดชเตเดฐเตŠเดตเตˆเดกเดฑเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดตเดฟเดญเดตเด‚ เดชเดพเดšเด•เด‚ เดšเต†เดฏเตเดฏเดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เดพเด‚ เด•เตเดฌเต†เตผเดจเต†เดฑเตเดฑเดธเต เดธเต†เดฒเด•เตโ€ŒเดŸเต†เตฝ เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเดšเตเดšเต.

เด…เดšเตเดšเต เดกเดฟ.เด†เตผ.

เด’เดฐเต‡เดธเดฎเดฏเด‚ เด’เดฐเต เดŸเต€เดฎเดฟเตฝ เดšเต‡เดฐเดพเตป เด•เดดเดฟเดฏเตเดฎเต‹?

$ 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-token เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต GitLab-เตฝ เด’เดฐเต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เด˜เดŸเดจ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•.
  7. เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ เด•เต‹เดกเต GitLab-เดฒเต‡เด•เตเด•เต เดชเตเดทเต เดšเต†เดฏเตเดฏเตเด•.
  8. ???
  9. เดฒเดพเดญเด‚!

เด˜เดŸเตเดŸเด‚ เด•เตเดธเดจเตเดฎเตเด•เตเดธ. เดตเดฟเดญเดพเด—เดคเตเดคเดฟเตฝ เดŸเต‹เด•เตเด•เตบ เดฒเดญเดฟเด•เตเด•เตเด‚ API เด•เต€เด•เตพ.

เดšเดฟเด•เตเด•เตป เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฎเตเดŸเตเดŸ: เดตเดฟเดญเดœเดฟเด•เตเด•เตเดจเตเดจ IaCเด˜เดŸเตเดŸเด‚ เด•เตเดธเดจเตเดฎเตเด•เตเดธ. 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
เด˜เดŸเตเดŸเด‚ เด•เตเดธเดจเตเดฎเตเด•เตเดธ. เดจเดฎเตเด•เตเด•เต cubeconfig เดฒเดญเดฟเด•เตเด•เตเด‚.

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

Cupconfig เดชเดพเดจเดฒเดฟเดฒเต‚เดŸเต†เดฏเตเด‚ เด†เด•เตเดธเดธเต เดšเต†เดฏเตเดฏเดพเดตเตเดจเตเดจเดคเดพเดฃเต.

เดšเดฟเด•เตเด•เตป เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฎเตเดŸเตเดŸ: เดตเดฟเดญเดœเดฟเด•เตเด•เตเดจเตเดจ IaC
เด˜เดŸเตเดŸเด‚ เด•เตเดธเดจเตเดฎเตเด•เตเดธ. เด•เตเดฒเดธเตเดฑเตเดฑเตผ เดšเตเดŸเตเดŸเตเดชเดดเตเดคเตเดคเดคเดฟเดจเตเดถเต‡เดทเด‚ เด…เดคเดฟเดฒเต‡เด•เตเด•เต เดจเดฎเตเด•เตเด•เต เดชเตเดฐเดตเต‡เดถเดจเด‚ เดฒเดญเดฟเดšเตเดšเตเด•เดดเดฟเดžเตเดžเดพเตฝ, เดฐเตเดšเดฟเด•เตเด•เต เดฎเตเด•เดณเดฟเตฝ เดฏเดพเดฎเตฝ เดšเต‡เตผเด•เตเด•เดพเด‚.

เดžเดพเตป เดšเต‡เตผเด•เตเด•เดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต:

  • เดจเต†เดฏเดฟเด‚เดธเตเดชเต‡เดธเต
  • เดธเตเดฑเตเดฑเต‹เดฑเต‡เดœเต เด•เตเดฒเดพเดธเต
  • เดชเต‹เดกเต เดธเตเดฐเด•เตเดทเดพ เดจเดฏเดตเตเด‚ เดฎเดฑเตเดฑเตเด‚.

เดธเด‚เดญเดฐเดฃ โ€‹โ€‹เด•เตเดฒเดพเดธเต เดธเต†เดฒเด•เตเดŸเตฝ เดŽเดจเตเดจเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดŽเดŸเตเด•เตเด•เดพเด‚ เด”เดฆเตเดฏเต‹เด—เดฟเด• เดถเต‡เด–เดฐเด‚.

เด†เดฆเตเดฏเด‚ เดฎเตเดคเตฝ เดžเดพเตป เดธเต‹เดฃเดฟเตฝ เด’เดฐเต เด•เตเดฒเดธเตเดฑเตเดฑเตผ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเดคเตเดคเต 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

เด˜เดŸเตเดŸเด‚ เด•เตเดธเดจเตเดฎเตเด•เตเดธ. เด’เดฐเต เดฒเต‹เดกเต เดฌเดพเดฒเตปเดธเตผ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเด•.

เดชเดฒเตผเด•เตเด•เตเด‚ เดžเด™เตเด™เตพ เดธเตเดฑเตเดฑเดพเตปเดกเต‡เตผเดกเต เด’เดจเตเดจเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด‚ 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
เด˜เดŸเตเดŸเด‚ เด•เตเดธเดจเตเดฎเตเด•เตเดธ. 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
เด˜เดŸเตเดŸเด‚ เด•เตเดธเดจเตเดฎเตเด•เตเดธ. เดžเด™เตเด™เตพเด•เตเด•เต 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

เด˜เดŸเตเดŸเด‚ เด•เตเดธเดจเตเดฎเตเด•เตเดธ. Gitlab เดชเตเดฐเตŠเดตเตˆเดกเตผ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต Git เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเด•เตพ เดถเดฐเดฟเดฏเดพเดฏ เดถเตเดฐเต‡เดฃเดฟเดฏเดฟเดฒเต‡เด•เตเด•เต เด•เตŠเดฃเตเดŸเตเดตเดฐเตเดจเตเดจเต.

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

เดจเดฟเตผเดญเดพเด—เตเดฏเดตเดถเดพเตฝ, เดŸเต†เดฑเดพเดซเต‹เด‚ GitLab เดฆเดพเดคเดพเดตเดฟเดจเต เด’เดฐเต เดซเตเดฒเต‹เดŸเตเดŸเดฟเด‚เด—เต เด‰เดฃเตเดŸเต เดฌเด—เต. เดคเตเดŸเตผเดจเตเดจเต, tf.state เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดจเดฟเด™เตเด™เตพ เดตเตˆเดฐเตเดฆเตเดงเตเดฏเดฎเตเดณเตเดณ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเตเด•เตพ เดธเตเดตเดฎเต‡เดงเดฏเดพ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เดคเตเดŸเตผเดจเตเดจเต `$make all` เดŽเดจเตเดจ เด•เดฎเดพเตปเดกเต เดตเต€เดฃเตเดŸเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเด•

เด˜เดŸเตเดŸเด‚ เด•เตเดธเดจเตเดฎเตเด•เตเดธ. เดžเด™เตเด™เตพ เดชเตเดฐเดพเดฆเต‡เดถเดฟเด• เดถเต‡เด–เดฐเดฃเด™เตเด™เตพ เดธเต†เตผเดตเดฑเดฟเดฒเต‡เด•เตเด•เต เดฎเดพเดฑเตเดฑเตเดจเตเดจเต.

$ 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

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•