แƒฅแƒแƒ—แƒแƒ›แƒ˜ แƒแƒœ แƒ™แƒ•แƒ”แƒ แƒชแƒฎแƒ˜: IaC-แƒ˜แƒก แƒ’แƒแƒงแƒแƒคแƒ

แƒฅแƒแƒ—แƒแƒ›แƒ˜ แƒแƒœ แƒ™แƒ•แƒ”แƒ แƒชแƒฎแƒ˜: IaC-แƒ˜แƒก แƒ’แƒแƒงแƒแƒคแƒ
แƒ แƒ แƒ˜แƒงแƒ แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ - แƒฅแƒแƒ—แƒแƒ›แƒ˜ แƒ—แƒฃ แƒ™แƒ•แƒ”แƒ แƒชแƒฎแƒ˜? แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒฃแƒชแƒœแƒแƒฃแƒ แƒ˜ แƒ“แƒแƒกแƒแƒฌแƒงแƒ˜แƒกแƒ˜แƒ แƒกแƒขแƒแƒขแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก Infrastructure-as-Code-แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘, แƒแƒ แƒ?

แƒ แƒ แƒแƒ แƒ˜แƒก แƒ™แƒ•แƒ”แƒ แƒชแƒฎแƒ˜?

แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒฎแƒจแƒ˜แƒ แƒแƒ“, แƒ˜แƒœแƒคแƒ แƒแƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ-แƒ แƒแƒ’แƒแƒ แƒช แƒ™แƒแƒ“แƒ˜ (IaC) แƒแƒ แƒ˜แƒก แƒ˜แƒœแƒคแƒ แƒแƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ˜แƒก แƒฌแƒแƒ แƒ›แƒแƒ“แƒ’แƒ”แƒœแƒ˜แƒก แƒ“แƒ”แƒ™แƒšแƒแƒ แƒแƒชแƒ˜แƒฃแƒšแƒ˜ แƒ’แƒ–แƒ. แƒ›แƒแƒกแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒแƒฆแƒ•แƒฌแƒ”แƒ แƒ— แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒแƒก, แƒ แƒแƒ›แƒšแƒ˜แƒก แƒ›แƒ˜แƒฆแƒฌแƒ”แƒ•แƒแƒช แƒ’แƒ•แƒ˜แƒœแƒ“แƒ, แƒ“แƒแƒฌแƒงแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒขแƒ”แƒฅแƒœแƒ˜แƒ™แƒ˜แƒก แƒœแƒแƒฌแƒ˜แƒšแƒ˜แƒ“แƒแƒœ แƒ“แƒ แƒ“แƒแƒ›แƒ—แƒแƒ•แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒฃแƒšแƒ˜ แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒ˜แƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒ—. แƒแƒ›แƒ˜แƒขแƒแƒ› IaC แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ:

  1. แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒ˜แƒก แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒ. แƒ”แƒก แƒแƒ แƒ˜แƒก VMs, S3, VPC แƒ“แƒ แƒ.แƒจ. แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒก แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜: Terraform ะธ CloudFormation.
  2. แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒฃแƒšแƒ˜ แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒ˜แƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ. แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜: แƒจแƒ”แƒฃแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ, แƒจแƒ”แƒค แƒ“แƒ แƒ.แƒจ.

แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒ™แƒแƒ“แƒ˜ แƒแƒ แƒ˜แƒก git แƒกแƒแƒชแƒแƒ•แƒ”แƒ‘แƒจแƒ˜. แƒ“แƒ แƒแƒ“แƒ แƒ” แƒ—แƒฃ แƒ’แƒ•แƒ˜แƒแƒœ แƒ’แƒฃแƒœแƒ“แƒ˜แƒก แƒšแƒ˜แƒ“แƒ”แƒ แƒ˜ แƒ’แƒแƒ“แƒแƒฌแƒงแƒ•แƒ”แƒขแƒก, แƒ แƒแƒ› แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒฃแƒœแƒ“แƒ แƒ›แƒแƒฌแƒ”แƒกแƒ แƒ˜แƒ’แƒ“แƒœแƒ”แƒœ. แƒ“แƒ แƒ˜แƒก แƒ’แƒแƒœแƒแƒแƒฎแƒšแƒ”แƒ‘แƒก. แƒ“แƒ แƒ”แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒก แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒš แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒแƒก. แƒ“แƒ แƒ˜แƒก แƒ“แƒแƒ˜แƒœแƒแƒฎแƒแƒ•แƒก, โ€‹โ€‹แƒ แƒแƒ› แƒ”แƒก แƒ™แƒแƒ แƒ’แƒ˜แƒ.

แƒแƒกแƒ”แƒ•แƒ” แƒ™แƒแƒ แƒ’แƒ˜แƒ, แƒ แƒแƒ› แƒ˜แƒก แƒฃแƒ™แƒ•แƒ” แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒ’แƒ˜แƒขแƒšแƒแƒ‘แƒ˜ ะธ GitHub-แƒžแƒ แƒแƒ•แƒแƒ˜แƒ“แƒ”แƒ แƒ˜ Terraform-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก (แƒ“แƒ แƒ”แƒก แƒแƒ แƒ˜แƒก แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒฃแƒšแƒ˜ แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒ˜แƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ). แƒ›แƒแƒ—แƒ˜ แƒ“แƒแƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ˜แƒ— แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ›แƒแƒ แƒ—แƒแƒ— แƒ›แƒ—แƒ”แƒšแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜: แƒ’แƒฃแƒœแƒ“แƒ˜แƒก แƒฌแƒ”แƒ•แƒ แƒ”แƒ‘แƒ˜, CI/CD, git-flow แƒ“แƒ แƒ.แƒจ.

แƒกแƒแƒ˜แƒ“แƒแƒœ แƒ’แƒแƒฉแƒœแƒ“แƒ แƒ™แƒ•แƒ”แƒ แƒชแƒฎแƒ˜?

แƒแƒกแƒ” แƒ แƒแƒ›, แƒฉแƒ•แƒ”แƒœ แƒ—แƒแƒœแƒ“แƒแƒ—แƒแƒœ แƒ•แƒฃแƒแƒฎแƒšแƒแƒ•แƒ“แƒ”แƒ‘แƒ˜แƒ— แƒ›แƒ—แƒแƒ•แƒแƒ  แƒ™แƒ˜แƒ—แƒฎแƒ•แƒแƒก.

แƒฃแƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ”แƒก แƒงแƒแƒ•แƒšแƒ˜แƒกแƒ, แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒ˜แƒฌแƒงแƒแƒ— แƒกแƒแƒชแƒแƒ•แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒฆแƒฌแƒ”แƒ แƒก แƒกแƒฎแƒ•แƒ แƒกแƒแƒชแƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒแƒก, แƒ›แƒแƒ— แƒจแƒแƒ แƒ˜แƒก แƒกแƒแƒ™แƒฃแƒ—แƒแƒ  แƒ—แƒแƒ•แƒก. แƒ“แƒ แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒ แƒแƒ’แƒแƒ แƒช GitOps-แƒ˜แƒก แƒœแƒแƒฌแƒ˜แƒšแƒ˜, แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒแƒ›แƒแƒขแƒแƒ— CI, แƒ แƒแƒ—แƒ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒฃแƒ แƒแƒ“ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ“แƒ”แƒก.

แƒ—แƒฃ Git แƒฏแƒ”แƒ  แƒแƒ  แƒแƒ แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒšแƒ˜?

  1. แƒ แƒแƒ’แƒแƒ  แƒจแƒ”แƒ•แƒ˜แƒœแƒแƒฎแƒแƒ— แƒ˜แƒก Git-แƒจแƒ˜?
  2. แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒ•แƒแƒงแƒ”แƒœแƒแƒ— CI?
  3. แƒ—แƒฃ แƒฉแƒ•แƒ”แƒœ แƒแƒกแƒ”แƒ•แƒ” แƒ’แƒแƒœแƒ•แƒแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒ— Gitlab-แƒก IaC-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— แƒ“แƒ แƒ—แƒฃแƒœแƒ“แƒแƒช Kubernetes-แƒจแƒ˜?
  4. แƒ“แƒ GitLab Runner แƒแƒกแƒ”แƒ•แƒ” Kubernetes-แƒจแƒ˜?
  5. แƒ แƒแƒช แƒจแƒ”แƒ”แƒฎแƒ”แƒ‘แƒ Kubernetes-แƒก แƒฆแƒ แƒฃแƒ‘แƒšแƒแƒ•แƒแƒœ แƒžแƒ แƒแƒ•แƒแƒ˜แƒ“แƒ”แƒ แƒจแƒ˜?

แƒ แƒ แƒ˜แƒงแƒ แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜: GitLab, แƒกแƒแƒ“แƒแƒช แƒ›แƒ” แƒแƒ•แƒขแƒ•แƒ˜แƒ แƒ—แƒแƒ• แƒฉแƒ”แƒ›แƒก แƒ™แƒแƒ“แƒก, แƒแƒœ แƒ™แƒแƒ“แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒฆแƒฌแƒ”แƒ แƒก, แƒ แƒแƒ’แƒแƒ แƒ˜ GitLab แƒ›แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ?

แƒฅแƒแƒ—แƒแƒ›แƒ˜ แƒ™แƒ•แƒ”แƒ แƒชแƒฎแƒ—แƒแƒœ แƒ”แƒ แƒ—แƒแƒ“

ยซแƒแƒ˜แƒแƒ™แƒแƒ“แƒแƒœแƒ˜3 แƒ“แƒ˜แƒœแƒแƒ–แƒแƒ•แƒ แƒ˜แƒ—" [src]

แƒจแƒ”แƒ•แƒ”แƒชแƒแƒ“แƒแƒ— แƒ›แƒแƒ•แƒแƒ›แƒ–แƒแƒ“แƒแƒ— แƒ™แƒ”แƒ แƒซแƒ˜ แƒฆแƒ แƒฃแƒ‘แƒšแƒ˜แƒก แƒžแƒ แƒแƒ•แƒแƒ˜แƒ“แƒ”แƒ แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— แƒ›แƒแƒ แƒ—แƒแƒ•แƒ“แƒ Kubernetes Selectel.

TL; DR

แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ—แƒฃ แƒแƒ แƒ แƒ”แƒ แƒ— แƒ’แƒฃแƒœแƒ“แƒจแƒ˜ แƒ”แƒ แƒ—แƒ“แƒ แƒแƒฃแƒšแƒแƒ“ แƒ’แƒแƒฌแƒ”แƒ•แƒ แƒ˜แƒแƒœแƒ”แƒ‘แƒ?

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

แƒจแƒ”แƒ›แƒแƒ“แƒ’แƒ”แƒœแƒšแƒแƒ‘แƒ:

  • แƒแƒœแƒ’แƒแƒ แƒ˜แƒจแƒ˜ my.selectel.ru-แƒ“แƒแƒœ;
  • แƒแƒœแƒ’แƒแƒ แƒ˜แƒจแƒ˜แƒก แƒŸแƒ”แƒขแƒแƒœแƒ˜;
  • แƒ™แƒฃแƒ‘แƒ”แƒ แƒœแƒ”แƒขแƒ˜แƒก แƒฃแƒœแƒแƒ แƒ”แƒ‘แƒ˜;
  • Helm Skills;
  • แƒขแƒ”แƒ แƒแƒคแƒแƒ แƒ›แƒฃแƒšแƒ˜ แƒฃแƒœแƒแƒ แƒ”แƒ‘แƒ˜;
  • แƒฉแƒแƒคแƒฎแƒฃแƒขแƒ˜แƒก แƒกแƒฅแƒ”แƒ›แƒ GitLab;
  • Helm chart GitLab Runner.

Recipe:

  1. แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ— MY_SELECTEL_TOKEN แƒžแƒแƒœแƒ”แƒšแƒ˜แƒ“แƒแƒœ my.selectel.ru.
  2. แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— Kubernetes แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ˜ แƒ›แƒแƒกแƒจแƒ˜ แƒแƒœแƒ’แƒแƒ แƒ˜แƒจแƒ˜แƒก แƒขแƒแƒ™แƒ”แƒœแƒ˜แƒก แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒ—.
  3. แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ— KUBECONFIG แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒšแƒ˜ แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ˜แƒ“แƒแƒœ.
  4. แƒ“แƒแƒแƒ˜แƒœแƒกแƒขแƒแƒšแƒ˜แƒ แƒ”แƒ— GitLab Kubernetes-แƒ–แƒ”.
  5. แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ— GitLab-token แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒšแƒ˜ GitLab-แƒ˜แƒกแƒ’แƒแƒœ root.
  6. แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ GitLab-แƒจแƒ˜ GitLab-token-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—.
  7. แƒ’แƒแƒ“แƒแƒ˜แƒขแƒแƒœแƒ”แƒ— แƒแƒ แƒกแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ™แƒแƒ“แƒ˜ GitLab-แƒจแƒ˜.
  8. ?
  9. แƒ›แƒแƒ’แƒ”แƒ‘แƒ

แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ 1. แƒŸแƒ”แƒขแƒแƒœแƒ˜แƒก แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒแƒจแƒ˜ API แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ”แƒ‘แƒ˜.

แƒฅแƒแƒ—แƒแƒ›แƒ˜ แƒแƒœ แƒ™แƒ•แƒ”แƒ แƒชแƒฎแƒ˜: IaC-แƒ˜แƒก แƒ’แƒแƒงแƒแƒคแƒแƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ 2. แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ›แƒ–แƒแƒ“แƒ”แƒ‘แƒ— แƒฉแƒ•แƒ”แƒœแƒก Terraform-แƒก 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. แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— cubeconfig.

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

Cupconfig-แƒ–แƒ” แƒฌแƒ•แƒ“แƒแƒ›แƒ แƒแƒกแƒ”แƒ•แƒ” แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒžแƒแƒœแƒ”แƒšแƒ˜แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ˜แƒ—.

แƒฅแƒแƒ—แƒแƒ›แƒ˜ แƒแƒœ แƒ™แƒ•แƒ”แƒ แƒชแƒฎแƒ˜: IaC-แƒ˜แƒก แƒ’แƒแƒงแƒแƒคแƒ
แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ 4. แƒ›แƒแƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒ แƒแƒช แƒ›แƒขแƒ”แƒ•แƒแƒœแƒ˜ แƒ’แƒแƒ›แƒแƒ›แƒชแƒฎแƒ•แƒแƒ แƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ“แƒ แƒ›แƒแƒกแƒ–แƒ” แƒฌแƒ•แƒ“แƒแƒ›แƒ แƒ’แƒ•แƒ”แƒฅแƒœแƒ”แƒ‘แƒ, แƒ–แƒ”แƒ›แƒแƒ“แƒแƒœ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒ“แƒแƒ•แƒแƒ›แƒแƒขแƒแƒ— แƒ˜แƒแƒ›แƒšแƒ˜ แƒ’แƒ”แƒ›แƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒ—.

แƒ›แƒ˜แƒ แƒฉแƒ”แƒ•แƒœแƒ˜แƒ แƒ“แƒแƒ•แƒแƒ›แƒแƒขแƒ:

  • แƒกแƒแƒฎแƒ”แƒšแƒ—แƒ แƒกแƒ˜แƒ•แƒ แƒชแƒ”
  • แƒจแƒ”แƒœแƒแƒฎแƒ•แƒ˜แƒก แƒ™แƒšแƒแƒกแƒ˜
  • pod แƒฃแƒกแƒแƒคแƒ แƒ—แƒฎแƒแƒ”แƒ‘แƒ˜แƒก แƒžแƒแƒšแƒ˜แƒขแƒ˜แƒ™แƒ แƒ“แƒ แƒแƒกแƒ” แƒจแƒ”แƒ›แƒ“แƒ”แƒ’.

แƒจแƒ”แƒœแƒแƒฎแƒ•แƒ˜แƒก แƒ™แƒšแƒแƒกแƒ˜ 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-ingress. แƒฃแƒ™แƒ•แƒ” แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒฃแƒแƒ›แƒ แƒแƒ•แƒ˜ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ แƒ›แƒ˜แƒกแƒ˜ แƒ˜แƒœแƒกแƒขแƒแƒšแƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒแƒกแƒ” แƒ แƒแƒ› แƒฉแƒ•แƒ”แƒœ แƒ›แƒแƒกแƒ–แƒ” แƒแƒ  แƒ•แƒ˜แƒกแƒแƒฃแƒ‘แƒ แƒ”แƒ‘แƒ—.

$ 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

แƒฉแƒ•แƒ”แƒœ แƒ•แƒ”แƒšแƒแƒ“แƒ”แƒ‘แƒ˜แƒ— แƒ’แƒแƒ แƒ” IP-แƒก แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒแƒก แƒ“แƒแƒแƒฎแƒšแƒแƒ”แƒ‘แƒ˜แƒ— 3-4 แƒฌแƒฃแƒ—แƒ˜แƒก แƒ’แƒแƒœแƒ›แƒแƒ•แƒšแƒแƒ‘แƒแƒจแƒ˜:

แƒฅแƒแƒ—แƒแƒ›แƒ˜ แƒแƒœ แƒ™แƒ•แƒ”แƒ แƒชแƒฎแƒ˜: 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-token-แƒก.

แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ แƒ˜แƒ’แƒจแƒ˜, แƒ’แƒแƒ˜แƒ’แƒ”แƒ— แƒจแƒ”แƒกแƒ•แƒšแƒ˜แƒก แƒžแƒแƒ แƒแƒšแƒ˜:

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. Git แƒกแƒแƒชแƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒกแƒฌแƒแƒ  แƒ˜แƒ”แƒ แƒแƒ แƒฅแƒ˜แƒแƒจแƒ˜ แƒ›แƒ˜แƒขแƒแƒœแƒ Gitlab แƒžแƒ แƒแƒ•แƒแƒ˜แƒ“แƒ”แƒ แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—.

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

แƒกแƒแƒ›แƒฌแƒฃแƒฎแƒแƒ แƒแƒ“, terraform 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-แƒ–แƒ” แƒ“แƒ แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒ“แƒแƒแƒญแƒ˜แƒ แƒ”แƒ— แƒฆแƒ˜แƒšแƒแƒ™แƒ”แƒ‘แƒก. แƒแƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก แƒฉแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ“แƒแƒ•แƒ˜แƒขแƒแƒœแƒแƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒแƒ“แƒ’แƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ•แƒ˜ แƒจแƒขแƒแƒขแƒ”แƒ‘แƒ˜ (Terraform State) CI-แƒจแƒ˜. แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒ•แƒแƒ™แƒ”แƒ—แƒแƒ— แƒ”แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒœแƒแƒฌแƒ˜แƒšแƒจแƒ˜.

แƒ’แƒแƒ›แƒแƒ˜แƒฌแƒ”แƒ แƒ”แƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒฌแƒแƒ™แƒ˜แƒ—แƒฎแƒ•แƒแƒ แƒแƒ—แƒ แƒแƒ  แƒ’แƒแƒ›แƒแƒขแƒแƒ•แƒแƒ— แƒแƒฎแƒแƒšแƒ˜ แƒกแƒขแƒแƒขแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒจแƒ•แƒ”แƒ‘แƒ!

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ