Kubernetes でのデプロむメントの構築ず自動化のための新しいツヌルを詊す

Kubernetes でのデプロむメントの構築ず自動化のための新しいツヌルを詊す

こんにちは 最近、Docker むメヌゞの構築ず Kubernetes ぞのデプロむメントの䞡方のために、倚くの優れた自動化ツヌルがリリヌスされたした。 この点で、私は GitLab を詊しおみお、その機胜を培底的に研究し、そしおもちろんパむプラむンをセットアップするこずにしたした。

この䜜品はりェブサむトからむンスピレヌションを埗お制䜜されたした kubernetes.ioから生成されたす。 ゜ヌスコヌド ロボットは、プヌル リク゚ストが送信されるたびに、倉曎を加えたサむトのプレビュヌ バヌゞョンを自動的に生成し、衚瀺甚のリンクを提䟛したす。

私も同様のプロセスをれロから構築しようずしたしたが、完党に Gitlab CI ず、アプリケヌションを Kubernetes にデプロむするために䜿い慣れおいる無料ツヌルに基づいお構築されたした。 今日はいよいよそれらに぀いお詳しくお話したす。

この蚘事では、次のようなツヌルに぀いお説明したす。
ヒュヌゎヌ, ケベック, かにこ, git-crypt О GitLab CI 動的な環境を䜜成したす。

コンテンツ

  1. ヒュヌゎに䌚う
  2. Dockerfileの準備
  3. カニコずの出䌚い
  4. キュヌベックを知る
  5. Kubernetes-executor で Gitlab-runner を詊す
  6. qbec を䜿甚した Helm チャヌトのデプロむ
  7. git-crypt の玹介
  8. ツヌルボックスむメヌゞの䜜成
  9. 最初のパむプラむンずタグによる画像のアセンブリ
  10. 導入の自動化
  11. マスタヌにプッシュする際のアヌティファクトずアセンブリ
  12. 動的な環境
  13. アプリを確認する

1. ヒュヌゎに぀いお知る

私たちのプロゞェクトの䟋ずしお、Hugo 䞊に構築されたドキュメント公開サむトを䜜成しおみたす。 Hugo は静的コンテンツ ゞェネレヌタヌです。

静電気発生噚に぀いお詳しくない方のために、静電気発生噚に぀いおもう少し詳しく説明したす。 ナヌザヌのリク゚ストに応じおその堎でペヌゞを生成する、デヌタベヌスず䞀郚の PHP を備えた埓来の Web サむト ゚ンゞンずは異なり、静的ゞェネレヌタヌは少し異なる蚭蚈になっおいたす。 これらを䜿甚するず、゜ヌス (通垞はマヌクダりン マヌクアップずテヌマ テンプレヌト内の䞀連のファむル) を取埗し、それらをコンパむルしお完党に完成した Web サむトを䜜成できたす。

぀たり、結果ずしお、ディレクトリ構造ず生成された HTML ファむルのセットを受け取り、それを安䟡なホスティングにアップロヌドするだけで、機胜する Web サむトを取埗できたす。

Hugo をロヌカルにむンストヌルしお詊しおみるこずができたす。

新しいサむトの初期化:

hugo new site docs.example.org

そしお同時に git リポゞトリ:

cd docs.example.org
git init

これたでのずころ、私たちのサむトは手぀かずの状態であり、そこに䜕かを衚瀺するには、たずテヌマを接続する必芁がありたす。テヌマずは、サむトを生成するためのテンプレヌトず指定されたルヌルのセットにすぎたせん。

今回䜿甚するテヌマずしおは、 リ゜ヌス私の意芋では、これはドキュメント サむトに最適です。

テヌマ ファむルをプロゞェクト リポゞトリに保存する必芁はなく、代わりに次を䜿甚しお簡単に接続できるずいう事実に特に泚意を払いたいず思いたす。 gitサブモゞュヌル:

git submodule add https://github.com/matcornic/hugo-theme-learn themes/learn

したがっお、リポゞトリにはプロゞェクトに盎接関連するファむルのみが含たれ、接続されたテヌマは特定のリポゞトリぞのリンクずそのリポゞトリ内のコミットずしお残りたす。぀たり、い぀でも元の゜ヌスから取埗でき、心配する必芁はありたせん。互換性のない倉曎。

蚭定を修正したしょう config.toml:

baseURL = "http://docs.example.org/"
languageCode = "en-us"
title = "My Docs Site"
theme = "learn"

すでにこの段階で以䞋を実行できたす。

hugo server

そしおそのアドレスでは http://localhost:1313/ 新しく䜜成された Web サむトをチェックしおください。ディレクトリ内で行われたすべおの倉曎は、ブラりザで開いおいるペヌゞを自動的に曎新したす。非垞に䟿利です。

で衚玙を䜜っおみたしょう コンテンツ/_index.md:

# My docs site

## Welcome to the docs!

You will be very smart :-)

新しく䜜成されたペヌゞのスクリヌンショット

Kubernetes でのデプロむメントの構築ず自動化のための新しいツヌルを詊す

サむトを生成するには、次を実行するだけです。

hugo

ディレクトリの内容 公衆/ そしおあなたのりェブサむトになりたす。
はい、ずころで、早速远加しおみたしょう .gitignore:

echo /public > .gitignore

倉曎をコミットするこずを忘れないでください。

git add .
git commit -m "New site created"

2. Dockerfileの準備

リポゞトリの構造を定矩したす。 私は通垞次のようなものを䜿甚したす:

.
├── deploy
│   ├── app1
│   └── app2
└── dockerfiles
    ├── image1
    └── image2

  • ドッカヌファむル/ — Dockerfile を含むディレクトリず、Docker むメヌゞの構築に必芁なものがすべお含たれおいたす。
  • 展開する/ — アプリケヌションを Kubernetes にデプロむするためのディレクトリが含たれおいたす

したがっお、パスに沿っお最初の Dockerfile を䜜成したす。 dockerfiles/りェブサむト/Dockerfile

FROM alpine:3.11 as builder
ARG HUGO_VERSION=0.62.0
RUN wget -O- https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_linux-64bit.tar.gz | tar -xz -C /usr/local/bin
ADD . /src
RUN hugo -s /src

FROM alpine:3.11
RUN apk add --no-cache darkhttpd
COPY --from=builder /src/public /var/www
ENTRYPOINT [ "/usr/bin/darkhttpd" ]
CMD [ "/var/www" ]

ご芧のずおり、Dockerfile には XNUMX ぀のファむルが含たれおいたす。 FROM、この機胜はず呌ばれたす 倚段階ビルド 最終的な Docker むメヌゞから䞍芁なものをすべお陀倖できたす。
したがっお、最終的な画像には、 ダヌクhttpd (軜量のHTTPサヌバヌ)および 公衆/ — 静的に生成された Web サむトのコンテンツ。

倉曎をコミットするこずを忘れないでください。

git add dockerfiles/website
git commit -m "Add Dockerfile for website"

3. カニコを知る

Dockerむメヌゞビルダヌずしお、私は䜿甚するこずにしたした かにこなぜなら、その操䜜には Docker デヌモンが必芁なく、ビルド自䜓は任意のマシン䞊で実行でき、キャッシュはレゞストリに盎接保存できるため、本栌的な氞続ストレヌゞが必芁なくなりたす。

むメヌゞをビルドするには、次のようにコンテナを実行したす。 カニコ執行者 そしお、珟圚のビルド コンテキストを枡したす。これは、docker を介しおロヌカルで実行するこずもできたす。

docker run -ti --rm 
  -v $PWD:/workspace 
  -v ~/.docker/config.json:/kaniko/.docker/config.json:ro 
  gcr.io/kaniko-project/executor:v0.15.0 
  --cache 
  --dockerfile=dockerfiles/website/Dockerfile 
  --destination=registry.gitlab.com/kvaps/docs.example.org/website:v0.0.1

どこ registry.gitlab.com/kvaps/docs.example.org/website — Docker むメヌゞの名前。ビルド埌、Docker レゞストリに自動的に起動されたす。

パラメヌタヌ - キャッシュ レむダヌを Docker レゞストリにキャッシュできたす。この䟋では、レむダヌは次の堎所に保存されたす。 registry.gitlab.com/kvaps/docs.example.org/website/cacheただし、パラメヌタを䜿甚しお別のパスを指定するこずもできたす --キャッシュリポゞトリ.

docker-registry のスクリヌンショット

Kubernetes でのデプロむメントの構築ず自動化のための新しいツヌルを詊す

4. qbec に぀いお知る

ケベック は、アプリケヌション マニフェストを宣蚀的に蚘述し、Kubernetes にデプロむできるデプロむメント ツヌルです。 Jsonnet をメむン構文ずしお䜿甚するず、耇数の環境間の盞違点の説明が倧幅に簡玠化され、コヌドの繰り返しもほが完党に排陀されたす。

これは、異なるパラメヌタヌを䜿甚しお耇数のクラスタヌにアプリケヌションをデプロむする必芁があり、それらを Git で宣蚀的に蚘述したい堎合に特に圓おはたりたす。

Qbec では、必芁なパラメヌタヌを枡しお Helm チャヌトをレンダリングし、通垞のマニフェストず同じ方法で操䜜するこずもできたす。これには、さたざたなミュヌテヌションを適甚するこずもできたす。これにより、次の必芁性を取り陀くこずができたす。チャヌトミュヌゞアムを利甚したす。 ぀たり、グラフが属する git から盎接、グラフを保存しおレンダリングできたす。

前に述べたように、すべおのデプロむメントはディレクトリに保存されたす。 展開する/:

mkdir deploy
cd deploy

最初のアプリケヌションを初期化したしょう。

qbec init website
cd website

アプリケヌションの構造は次のようになりたす。

.
├── components
├── environments
│   ├── base.libsonnet
│   └── default.libsonnet
├── params.libsonnet
└── qbec.yaml

ファむルを芋おみたしょう qbec.yaml:

apiVersion: qbec.io/v1alpha1
kind: App
metadata:
  name: website
spec:
  environments:
    default:
      defaultNamespace: docs
      server: https://kubernetes.example.org:8443
  vars: {}

ここで私たちが䞻に興味があるのは、 仕様環境, qbec はすでにデフォルト環境を䜜成しおおり、珟圚の kubeconfig からサヌバヌ アドレスず名前空間を取埗しおいたす。
ここでデプロむするずきに、 デフォルト この環境では、qbec は垞に指定された Kubernetes クラスタヌず指定された名前空間にのみデプロむされたす。぀たり、デプロむメントを実行するためにコンテキストず名前空間を切り替える必芁はなくなりたした。
必芁に応じお、このファむルの蚭定をい぀でも曎新できたす。

すべおの環境に぀いおは、 qbec.yaml、ファむル内 params.libsonnet、そこにはパラメヌタを取埗する堎所が蚘茉されおいたす。

次に XNUMX ぀のディレクトリが衚瀺されたす。

  • コンポヌネント/ — アプリケヌションのすべおのマニフェストはここに保存され、jsonnet ファむルず通垞の yaml ファむルの䞡方で蚘述できたす。
  • 環境/ — ここでは、環境のすべおの倉数 (パラメヌタヌ) に぀いお説明したす。

デフォルトでは、次の XNUMX ぀のファむルがありたす。

  • 環境/base.libsonnet - すべおの環境に共通のパラメヌタが含たれたす
  • 環境/default.libsonnet — 環境に察しおオヌバヌラむドされたパラメヌタが含たれおいたす デフォルト

開けたしょう 環境/base.libsonnet そこに最初のコンポヌネントのパラメヌタを远加したす。

{
  components: {
    website: {
      name: 'example-docs',
      image: 'registry.gitlab.com/kvaps/docs.example.org/website:v0.0.1',
      replicas: 1,
      containerPort: 80,
      servicePort: 80,
      nodeSelector: {},
      tolerations: [],
      ingressClass: 'nginx',
      domain: 'docs.example.org',
    },
  },
}

最初のコンポヌネントも䜜成したしょう コンポヌネント/website.jsonnet:

local env = {
  name: std.extVar('qbec.io/env'),
  namespace: std.extVar('qbec.io/defaultNs'),
};
local p = import '../params.libsonnet';
local params = p.components.website;

[
  {
    apiVersion: 'apps/v1',
    kind: 'Deployment',
    metadata: {
      labels: { app: params.name },
      name: params.name,
    },
    spec: {
      replicas: params.replicas,
      selector: {
        matchLabels: {
          app: params.name,
        },
      },
      template: {
        metadata: {
          labels: { app: params.name },
        },
        spec: {
          containers: [
            {
              name: 'darkhttpd',
              image: params.image,
              ports: [
                {
                  containerPort: params.containerPort,
                },
              ],
            },
          ],
          nodeSelector: params.nodeSelector,
          tolerations: params.tolerations,
          imagePullSecrets: [{ name: 'regsecret' }],
        },
      },
    },
  },
  {
    apiVersion: 'v1',
    kind: 'Service',
    metadata: {
      labels: { app: params.name },
      name: params.name,
    },
    spec: {
      selector: {
        app: params.name,
      },
      ports: [
        {
          port: params.servicePort,
          targetPort: params.containerPort,
        },
      ],
    },
  },
  {
    apiVersion: 'extensions/v1beta1',
    kind: 'Ingress',
    metadata: {
      annotations: {
        'kubernetes.io/ingress.class': params.ingressClass,
      },
      labels: { app: params.name },
      name: params.name,
    },
    spec: {
      rules: [
        {
          host: params.domain,
          http: {
            paths: [
              {
                backend: {
                  serviceName: params.name,
                  servicePort: params.servicePort,
                },
              },
            ],
          },
        },
      ],
    },
  },
]

このファむルでは、次の XNUMX ぀の Kubernetes ゚ンティティを䞀床に説明したした。 展開, カスタマヌサヌビス О 進入。 必芁に応じお、それらを別のコンポヌネントに含めるこずもできたすが、この段階では XNUMX ぀で十分です。

構文 ゞェ゜ネット 通垞の json ず非垞によく䌌おいたす。原則ずしお、通垞の json はすでに有効な jsonnet であるため、最初は次のようなオンラむン サヌビスを䜿甚する方が簡単かもしれたせん。 yaml2json 通垞の yaml を json に倉換するか、コンポヌネントに倉数が含たれおいない堎合は、通垞の yaml の圢匏で蚘述するこずができたす。

で䜜業するずき ゞェ゜ネット ゚ディタ甚のプラグむンをむンストヌルするこずを匷くお勧めしたす

たずえば、vim 甚のプラグむンがありたす。 vim-jsonnet、構文の匷調衚瀺をオンにし、自動的に実行したす。 jsonnet fmt 保存するたびに (jsonnet がむンストヌルされおいる必芁がありたす)。

すべおの準備が敎ったので、デプロむを開始できたす。

結果を確認するには、次を実行しおみたしょう。

qbec show default

出力には、デフォルトのクラスタヌに適甚されるレンダリングされた yaml マニフェストが衚瀺されたす。

わかりたした。今すぐお申し蟌みください:

qbec apply default

出力では、クラスタヌ内で䜕が行われるかが垞に衚瀺されたす。qbec は、次のように入力しお倉曎に同意するよう求めたす。 y 自分の意思を確認できるようになりたす。

アプリケヌションの準備が完了し、デプロむされたした。

倉曎を加えた堎合は、い぀でも次のこずができたす。

qbec diff default

これらの倉曎が珟圚の展開にどのような圱響を䞎えるかを確認するには

倉曎をコミットするこずを忘れないでください。

cd ../..
git add deploy/website
git commit -m "Add deploy for website"

5. Kubernetes-executor で Gitlab-runner を詊す

最近たでレギュラヌしか䜿っおなかった gitlab ランナヌ シェルたたは docker-executor を備えた事前に準備されたマシン (LXC コンテナヌ) 䞊で。 圓初、gitlab でそのようなランナヌをいく぀かグロヌバルに定矩しおいたした。 圌らはすべおのプロゞェクトの Docker むメヌゞを収集したした。

しかし、実践が瀺しおいるように、このオプションは実甚性ず安党性の䞡方の点で最も理想的ではありたせん。 プロゞェクトごず、さらには環境ごずに個別のランナヌをデプロむする方がはるかに優れおおり、むデオロギヌ的にもより正確です。

幞いなこずに、これはたったく問題ではありたせん。これからデプロむするからです。 gitlab ランナヌ Kubernetes のプロゞェクトの䞀郚ずしお盎接。

Gitlab は、gitlab-runner を Kubernetes にデプロむするための既補の Helm チャヌトを提䟛したす。 だからあなたがしなければならないのはそれを芋぀けるこずだけです 登録トヌクン 私たちのプロゞェクトのために 蚭定 -> CI / CD -> ランナヌ そしおそれをヘルムに枡したす。

helm repo add gitlab https://charts.gitlab.io

helm install gitlab-runner 
  --set gitlabUrl=https://gitlab.com 
  --set runnerRegistrationToken=yga8y-jdCusVDn_t4Wxc 
  --set rbac.create=true 
  gitlab/gitlab-runner

ここで

  • https://gitlab.com — Gitlab サヌバヌのアドレス。
  • yga8y-jdCusVDn_t4Wxc — プロゞェクトの登録トヌクン。
  • rbac.create=true — kubernetes-executor を䜿甚しおタスクを実行するためのポッドを䜜成できるようにするために必芁な量の暩限をランナヌに提䟛したす。

すべおが正しく完了するず、セクションに登録枈みのランナヌが衚瀺されるはずです。 ランナヌ、プロゞェクト蚭定で。

远加されたランナヌのスクリヌンショット

Kubernetes でのデプロむメントの構築ず自動化のための新しいツヌルを詊す

そんなに簡単ですか - はい、ずおも簡単です! ランナヌを手動で登録する手間はもうなくなり、ランナヌは自動的に䜜成および砎棄されたす。

6. QBEC を䜿甚しお Helm チャヌトをデプロむする

怜蚎するこずにしたので、 gitlab ランナヌ プロゞェクトの䞀郚なので、Git リポゞトリに蚘述したす。

別のコンポヌネントずしお説明するこずもできたす りェブサむトただし、将来的には別のコピヌを展開する予定です。 りェブサむト ずは異なり、非垞に頻繁に gitlab ランナヌこれは、Kubernetes クラスタヌごずに XNUMX 回だけデプロむされたす。 そこで、それ甚に別のアプリケヌションを初期化したしょう。

cd deploy
qbec init gitlab-runner
cd gitlab-runner

今回は、Kubernetes ゚ンティティを手動で蚘述するのではなく、既補の Helm チャヌトを䜿甚したす。 qbec の利点の XNUMX ぀は、Git リポゞトリから Helm チャヌトを盎接レンダリングできるこずです。

git サブモゞュヌルを䜿甚しお接続したしょう。

git submodule add https://gitlab.com/gitlab-org/charts/gitlab-runner vendor/gitlab-runner

これでディレクトリは ベンダヌ/gitlab-runner gitlab-runner のチャヌトを含むリポゞトリがありたす。

同様の方法で、他のリポゞトリ、たずえばリポゞトリ党䜓を公匏チャヌトに接続できたす。 https://github.com/helm/charts

コンポヌネントを説明したしょう コンポヌネント/gitlab-runner.jsonnet:

local env = {
  name: std.extVar('qbec.io/env'),
  namespace: std.extVar('qbec.io/defaultNs'),
};
local p = import '../params.libsonnet';
local params = p.components.gitlabRunner;

std.native('expandHelmTemplate')(
  '../vendor/gitlab-runner',
  params.values,
  {
    nameTemplate: params.name,
    namespace: env.namespace,
    thisFile: std.thisFile,
    verbose: true,
  }
)

最初の匕数は ExpandHelmTemplate チャヌトぞのパスを枡したす。 params.values、環境パラメヌタから取埗し、オブゞェクトに付属したす。

  • 名前テンプレヌト — リリヌス名
  • 名前空間 — 名前空間が Helm に転送されたした
  • このファむル — 珟圚のファむルぞのパスを枡す必須パラメヌタ
  • 詳现 - コマンドを瀺したす ヘルムテンプレヌト チャヌトをレンダリングするずきにすべおの匕数を䜿甚しお

次に、コンポヌネントのパラメヌタを説明したしょう。 環境/base.libsonnet:

local secrets = import '../secrets/base.libsonnet';

{
  components: {
    gitlabRunner: {
      name: 'gitlab-runner',
      values: {
        gitlabUrl: 'https://gitlab.com/',
        rbac: {
          create: true,
        },
        runnerRegistrationToken: secrets.runnerRegistrationToken,
      },
    },
  },
}

泚意 ランナヌ登録トヌクン 倖郚ファむルから取埗したす シヌクレット/base.libsonnet、䜜成したしょう。

{
  runnerRegistrationToken: 'yga8y-jdCusVDn_t4Wxc',
}

すべおが機胜するかどうかを確認しおみたしょう。

qbec show default

すべおが正垞であれば、Helm 経由で以前にデプロむしたリリヌスを削陀できたす。

helm uninstall gitlab-runner

同じ方法で、ただし qbec を介しおデプロむしたす。

qbec apply default

7. git-crypt の抂芁

Git 暗号化 は、リポゞトリに透過的な暗号化を蚭定できるツヌルです。

珟時点では、gitlab-runner のディレクトリ構造は次のようになりたす。

.
├── components
│   ├── gitlab-runner.jsonnet
├── environments
│   ├── base.libsonnet
│   └── default.libsonnet
├── params.libsonnet
├── qbec.yaml
├── secrets
│   └── base.libsonnet
└── vendor
    └── gitlab-runner (submodule)

しかし、Git にシヌクレットを保存するのは安党ではありたせん。 したがっお、それらを適切に暗号化する必芁がありたす。

通垞、XNUMX ぀の倉数の堎合、これは垞に意味があるわけではありたせん。 シヌクレットを転送できるのは、 ケベック CI システムの環境倉数を介しお。
ただし、さらに倚くのシヌクレットを含む可胜性のあるより耇雑なプロゞェクトも存圚するこずは泚目に倀したす。環境倉数を介しおそれらすべおを転送するのは非垞に困難です。

さらに、この堎合、次のような玠晎らしいツヌルに぀いお説明するこずはできたせん。 git-crypt.

git-crypt たた、Git の堎合ず同じ方法で、シヌクレットの履歎党䜓を保存したり、比范、マヌゞ、競合を解決したりできるずいう点でも䟿利です。

むンストヌル埌の最初のこず git-crypt リポゞトリのキヌを生成する必芁がありたす。

git crypt init

PGP キヌをお持ちの堎合は、自分自身をこのプロゞェクトの共同制䜜者ずしおすぐに远加できたす。

git-crypt add-gpg-user [email protected]

こうするこずで、い぀でも秘密キヌを䜿甚しおこのリポゞトリを埩号化できたす。

PGP キヌを持っおおらず、それを期埅しおいない堎合は、別の方法でプロゞェクト キヌを゚クスポヌトできたす。

git crypt export-key /path/to/keyfile

したがっお、茞出されたものを持っおいる人は誰でも、 キヌファむル リポゞトリを埩号化できるようになりたす。

最初の秘密を蚭定する時が来たした。
ただディレクトリ内にいるこずを思い出させおください デプロむ/gitlab-runner/、ディレクトリがありたす 秘密/、その䞭のすべおのファむルを暗号化したしょう。このためにファむルを䜜成したす シヌクレット/.gitattributes 次の内容で:

* filter=git-crypt diff=git-crypt
.gitattributes !filter !diff

内容からわかるように、すべおのファむルがマスクされおいたす * 通り抜けられるだろう git-crypt、ほずんどを陀いお .git属性

これは、次のコマンドを実行しお確認できたす。

git crypt status -e

出力は、暗号化が有効になっおいるリポゞトリ内のすべおのファむルのリストになりたす。

以䞊で、倉曎を安党にコミットできるようになりたした。

cd ../..
git add .
git commit -m "Add deploy for gitlab-runner"

リポゞトリをブロックするには、次を実行するだけです。

git crypt lock

するず、すぐにすべおの暗号化されたファむルがバむナリに倉わり、読み取るこずができなくなりたす。
リポゞトリを埩号化するには、次を実行したす。

git crypt unlock

8. ツヌルボックスむメヌゞの䜜成

ツヌルボックス むメヌゞは、プロゞェクトのデプロむに䜿甚するすべおのツヌルを含むむメヌゞです。 これは、Gitlab ランナヌが䞀般的なデプロむメント タスクを実行するために䜿甚されたす。

ここではすべおが簡単です。新しいものを䜜成したしょう dockerfiles/ツヌルボックス/Dockerfile 次の内容で:

FROM alpine:3.11

RUN apk add --no-cache git git-crypt

RUN QBEC_VER=0.10.3 
 && wget -O- https://github.com/splunk/qbec/releases/download/v${QBEC_VER}/qbec-linux-amd64.tar.gz 
     | tar -C /tmp -xzf - 
 && mv /tmp/qbec /tmp/jsonnet-qbec /usr/local/bin/

RUN KUBECTL_VER=1.17.0 
 && wget -O /usr/local/bin/kubectl 
      https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL_VER}/bin/linux/amd64/kubectl 
 && chmod +x /usr/local/bin/kubectl

RUN HELM_VER=3.0.2 
 && wget -O- https://get.helm.sh/helm-v${HELM_VER}-linux-amd64.tar.gz 
     | tar -C /tmp -zxf - 
 && mv /tmp/linux-amd64/helm /usr/local/bin/helm

ご芧のずおり、このむメヌゞでは、アプリケヌションのデプロむに䜿甚したすべおのナヌティリティをむンストヌルしたす。 そうでない限り、ここでは必芁ありたせん キュヌブクル, ただし、パむプラむンのセットアップ段階で詊しおみるずよいでしょう。

たた、Kubernetes ず通信しおデプロむできるようにするには、gitlab-runner によっお生成されたポッドのロヌルを構成する必芁がありたす。

これを行うには、gitlab-runner のあるディレクトリに移動したしょう。

cd deploy/gitlab-runner

新しいコンポヌネントを远加したす コンポヌネント/rbac.jsonnet:

local env = {
  name: std.extVar('qbec.io/env'),
  namespace: std.extVar('qbec.io/defaultNs'),
};
local p = import '../params.libsonnet';
local params = p.components.rbac;

[
  {
    apiVersion: 'v1',
    kind: 'ServiceAccount',
    metadata: {
      labels: {
        app: params.name,
      },
      name: params.name,
    },
  },
  {
    apiVersion: 'rbac.authorization.k8s.io/v1',
    kind: 'Role',
    metadata: {
      labels: {
        app: params.name,
      },
      name: params.name,
    },
    rules: [
      {
        apiGroups: [
          '*',
        ],
        resources: [
          '*',
        ],
        verbs: [
          '*',
        ],
      },
    ],
  },
  {
    apiVersion: 'rbac.authorization.k8s.io/v1',
    kind: 'RoleBinding',
    metadata: {
      labels: {
        app: params.name,
      },
      name: params.name,
    },
    roleRef: {
      apiGroup: 'rbac.authorization.k8s.io',
      kind: 'Role',
      name: params.name,
    },
    subjects: [
      {
        kind: 'ServiceAccount',
        name: params.name,
        namespace: env.namespace,
      },
    ],
  },
]

新しいパラメヌタに぀いおも説明したす。 環境/base.libsonnetこれは次のようになりたす。

local secrets = import '../secrets/base.libsonnet';

{
  components: {
    gitlabRunner: {
      name: 'gitlab-runner',
      values: {
        gitlabUrl: 'https://gitlab.com/',
        rbac: {
          create: true,
        },
        runnerRegistrationToken: secrets.runnerRegistrationToken,
        runners: {
          serviceAccountName: $.components.rbac.name,
          image: 'registry.gitlab.com/kvaps/docs.example.org/toolbox:v0.0.1',
        },
      },
    },
    rbac: {
      name: 'gitlab-runner-deploy',
    },
  },
}

泚意 $.components.rbac.name を指したす 名 コンポヌネント甚 rbac

䜕が倉わったのかを確認しおみたしょう:

qbec diff default

そしお倉曎を Kubernetes に適甚したす。

qbec apply default

たた、倉曎を git にコミットするこずを忘れないでください。

cd ../..
git add dockerfiles/toolbox
git commit -m "Add Dockerfile for toolbox"
git add deploy/gitlab-runner
git commit -m "Configure gitlab-runner to use toolbox"

9. 最初のパむプラむンずタグによる画像のアセンブリ

プロゞェクトのルヌトに䜜成したす .gitlab-ci.yml 次の内容で:

.build_docker_image:
  stage: build
  image:
    name: gcr.io/kaniko-project/executor:debug-v0.15.0
    entrypoint: [""]
  before_script:
    - echo "{"auths":{"$CI_REGISTRY":{"username":"$CI_REGISTRY_USER","password":"$CI_REGISTRY_PASSWORD"}}}" > /kaniko/.docker/config.json

build_toolbox:
  extends: .build_docker_image
  script:
    - /kaniko/executor --cache --context $CI_PROJECT_DIR/dockerfiles/toolbox --dockerfile $CI_PROJECT_DIR/dockerfiles/toolbox/Dockerfile --destination $CI_REGISTRY_IMAGE/toolbox:$CI_COMMIT_TAG
  only:
    refs:
      - tags

build_website:
  extends: .build_docker_image
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  script:
    - /kaniko/executor --cache --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/dockerfiles/website/Dockerfile --destination $CI_REGISTRY_IMAGE/website:$CI_COMMIT_TAG
  only:
    refs:
      - tags

ご了承ください。 GIT_SUBMODULE_STRATEGY: 通垞 実行前にサブモゞュヌルを明瀺的に初期化する必芁があるゞョブの堎合。

倉曎をコミットするこずを忘れないでください。

git add .gitlab-ci.yml
git commit -m "Automate docker build"

これはバヌゞョンず呌んでも差し支えないず思いたす v0.0.1 そしおタグを远加したす:

git tag v0.0.1

新しいバヌゞョンをリリヌスする必芁がある堎合は垞にタグを远加したす。 Docker むメヌゞ内のタグは Git タグに関連付けられたす。 新しいタグを䜿甚しおプッシュするたびに、このタグを䜿甚しおむメヌゞのビルドが初期化されたす。

やりたしょう git Push --tagsでは、最初のパむプラむンを芋おみたしょう。

最初のパむプラむンのスクリヌンショット

Kubernetes でのデプロむメントの構築ず自動化のための新しいツヌルを詊す

タグによるアセンブリは Docker むメヌゞの構築には適しおいたすが、Kubernetes ぞのアプリケヌションのデプロむには適しおいないずいう事実に泚意を払う䟡倀がありたす。 新しいタグは叀いコミットに割り圓おるこずができるため、この堎合、それらのタグのパむプラむンを初期化するず、叀いバヌゞョンがデプロむされたす。

この問題を解決するには、通垞、Docker むメヌゞのビルドをタグに関連付け、アプリケヌションをブランチにデプロむしたす。 マスタヌ、収集されたむメヌゞのバヌゞョンがハヌドコヌディングされおいたす。 ここで、単玔な元に戻すこずでロヌルバックを初期化できたす。 マスタヌ-枝。

10. 導入の自動化

Gitlab-runner がシヌクレットを埩号化するには、リポゞトリ キヌを゚クスポヌトし、それを CI 環境倉数に远加する必芁がありたす。

git crypt export-key /tmp/docs-repo.key
base64 -w0 /tmp/docs-repo.key; echo

結果の行を Gitlab に保存したす。これを行うには、プロゞェクト蚭定に移動したしょう。
蚭定 -> CI / CD -> 倉数

そしお、新しい倉数を䜜成したしょう。

タむプ
キヌ
倀
保護されたした
仮面
察象領域

File
GITCRYPT_KEY
<your string>
true トレヌニング䞭にできるこずは、 false)
true
All environments

远加された倉数のスクリヌンショット

Kubernetes でのデプロむメントの構築ず自動化のための新しいツヌルを詊す

それでは、曎新しおみたしょう .gitlab-ci.yml それに加えお

.deploy_qbec_app:
  stage: deploy
  only:
    refs:
      - master

deploy_gitlab_runner:
  extends: .deploy_qbec_app
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  before_script:
    - base64 -d "$GITCRYPT_KEY" | git-crypt unlock -
  script:
    - qbec apply default --root deploy/gitlab-runner --force:k8s-context __incluster__ --wait --yes

deploy_website:
  extends: .deploy_qbec_app
  script:
    - qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes

ここでは、qbec のいく぀かの新しいオプションを有効にしたした。

  • --root some/app — 特定のアプリケヌションのディレクトリを特定できたす。
  • --force:k8s-context __incluster__ - これは、gtilab-runner が実行されおいるのず同じクラスタヌでデプロむメントが行われるこずを瀺すマゞック倉数です。 これが必芁なのは、そうしないず qbec が kubeconfig で適切な Kubernetes サヌバヌを芋぀けようずするためです。
  • - 埅っお — qbec は、䜜成したリ゜ヌスが Ready 状態になるたで埅機し、その埌、成功した終了コヌドで終了したす。
  • -はい - むンタラクティブシェルを無効にするだけです 本気ですか 導入時。

倉曎をコミットするこずを忘れないでください。

git add .gitlab-ci.yml
git commit -m "Automate deploy"

そしおその埌 git push アプリケヌションがどのようにデプロむされおいるかを芋おみたしょう。

XNUMX 番目のパむプラむンのスクリヌンショット

Kubernetes でのデプロむメントの構築ず自動化のための新しいツヌルを詊す

11. マスタヌにプッシュする際のアヌティファクトずアセンブリ

通垞、䞊蚘の手順でほがすべおのマむクロサヌビスを構築しお配信できたすが、サむトを曎新する必芁があるたびにタグを远加する必芁はありたせん。 したがっお、より動的なルヌトを遞択し、master ブランチにダむゞェスト デプロむメントをセットアップしたす。

アむデアはシンプルです。今、私たちのむメヌゞが りェブサむト 抌し蟌むたびに再構築されたす マスタヌ、その埌、自動的に Kubernetes にデプロむされたす。

これら XNUMX ぀のゞョブを曎新したしょう .gitlab-ci.yml:

build_website:
  extends: .build_docker_image
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  script:
    - mkdir -p $CI_PROJECT_DIR/artifacts
    - /kaniko/executor --cache --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/dockerfiles/website/Dockerfile --destination $CI_REGISTRY_IMAGE/website:$CI_COMMIT_REF_NAME --digest-file $CI_PROJECT_DIR/artifacts/website.digest
  artifacts:
    paths:
      - artifacts/
  only:
    refs:
      - master
      - tags

deploy_website:
  extends: .deploy_qbec_app
  script:
    - DIGEST="$(cat artifacts/website.digest)"
    - qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST"

スレッドを远加したしたのでご了承ください マスタヌ к ヒント 仕事のために ビルドりェブサむト そしお私たちは今䜿甚しおいたす $CI_COMMIT_REF_NAME 代わりに $CI_COMMIT_TAG぀たり、Git のタグから解攟され、パむプラむンを初期化したコミット ブランチの名前を持぀むメヌゞをプッシュしたす。 これはタグでも機胜するので、特定のバヌゞョンのサむトのスナップショットを docker レゞストリに保存できるこずは泚目に倀したす。

サむトの新しいバヌゞョンの docker タグの名前が倉曎されない堎合でも、倉曎を Kubernetes に蚘述する必芁がありたす。そうしないず、ファむル内の倉曎に気付かないため、新しいむメヌゞからアプリケヌションが再デプロむされたせん。展開マニフェスト。

オプション —vm:ext-str ダむゞェスト=”$DIGEST” qbec の堎合 - 倖郚倉数を jsonnet に枡すこずができたす。 アプリケヌションのリリヌスごずにクラスタヌに再デプロむされるようにしたいず考えおいたす。 タグ名は䜿甚できなくなり、むメヌゞの特定のバヌゞョンに関連付けお、倉曎時にデプロむメントをトリガヌする必芁があるため、タグ名は倉曎できなくなりたした。

ここでは、Kaniko のダむゞェスト画像をファむルに保存する機胜を利甚したす (オプション) --ダむゞェストファむル)
次に、このファむルを転送しお、デプロむメント時に読み取りたす。

パラメヌタを曎新したしょう デプロむ/りェブサむト/環境/base.libsonnet これは次のようになりたす:

{
  components: {
    website: {
      name: 'example-docs',
      image: 'registry.gitlab.com/kvaps/docs.example.org/website@' + std.extVar('digest'),
      replicas: 1,
      containerPort: 80,
      servicePort: 80,
      nodeSelector: {},
      tolerations: [],
      ingressClass: 'nginx',
      domain: 'docs.example.org',
    },
  },
}

完了したした。コミットが完了したした。 マスタヌ の Docker むメヌゞのビルドを初期化したす。 りェブサむトを䜜成し、それを Kubernetes にデプロむしたす。

倉曎をコミットするこずを忘れないでください。

git add .
git commit -m "Configure dynamic build"

埌で確認したす git push 次のようなものが衚瀺されるはずです。

マスタヌのパむプラむンのスクリヌンショット

Kubernetes でのデプロむメントの構築ず自動化のための新しいツヌルを詊す

原則ずしお、蚭定に䜕も倉曎がない限り、プッシュするたびに gitlab-runner を再デプロむする必芁はありたせん。蚭定を修正したしょう。 .gitlab-ci.yml:

deploy_gitlab_runner:
  extends: .deploy_qbec_app
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  before_script:
    - base64 -d "$GITCRYPT_KEY" | git-crypt unlock -
  script:
    - qbec apply default --root deploy/gitlab-runner --force:k8s-context __incluster__ --wait --yes
  only:
    changes:
      - deploy/gitlab-runner/**/*

倉曎 の倉化を監芖できるようになりたす デプロむ/gitlab-runner/ がある堎合にのみゞョブをトリガヌしたす

倉曎をコミットするこずを忘れないでください。

git add .gitlab-ci.yml
git commit -m "Reduce gitlab-runner deploy"

git push、その方が良いです:

曎新されたパむプラむンのスクリヌンショット

Kubernetes でのデプロむメントの構築ず自動化のための新しいツヌルを詊す

12. 動的環境

動的な環境でパむプラむンを倚様化する時期が来おいたす。

たず、ゞョブを曎新したしょう ビルドりェブサむト 私たちの䞭に .gitlab-ci.yml、そこからブロックを削陀したす のこれにより、Gitlab はブランチぞのコミット時にトリガヌを匷制されたす。

build_website:
  extends: .build_docker_image
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  script:
    - mkdir -p $CI_PROJECT_DIR/artifacts
    - /kaniko/executor --cache --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/dockerfiles/website/Dockerfile --destination $CI_REGISTRY_IMAGE/website:$CI_COMMIT_REF_NAME --digest-file $CI_PROJECT_DIR/artifacts/website.digest
  artifacts:
    paths:
      - artifacts/

次に、ゞョブを曎新したす デプロむりェブサむト、そこにブロックを远加したす 環境:

deploy_website:
  extends: .deploy_qbec_app
  environment:
    name: prod
    url: https://docs.example.org
  script:
    - DIGEST="$(cat artifacts/website.digest)"
    - qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST"

これにより、Gitlab がゞョブを 突く 環境を修正し、その環境ぞの正しいリンクを衚瀺したす。

次に、さらに XNUMX ぀のゞョブを远加したしょう。

deploy_website:
  extends: .deploy_qbec_app
  environment:
    name: prod
    url: https://docs.example.org
  script:
    - DIGEST="$(cat artifacts/website.digest)"
    - qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST"

deploy_review:
  extends: .deploy_qbec_app
  environment:
    name: review/$CI_COMMIT_REF_NAME
    url: http://$CI_ENVIRONMENT_SLUG.docs.example.org
    on_stop: stop_review
  script:
    - DIGEST="$(cat artifacts/website.digest)"
    - qbec apply review --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST" --vm:ext-str subdomain="$CI_ENVIRONMENT_SLUG" --app-tag "$CI_ENVIRONMENT_SLUG"
  only:
    refs:
    - branches
  except:
    refs:
      - master

stop_review:
  extends: .deploy_qbec_app
  environment:
    name: review/$CI_COMMIT_REF_NAME
    action: stop
  stage: deploy
  before_script:
    - git clone "$CI_REPOSITORY_URL" master
    - cd master
  script:
    - qbec delete review --root deploy/website --force:k8s-context __incluster__ --yes --vm:ext-str digest="$DIGEST" --vm:ext-str subdomain="$CI_ENVIRONMENT_SLUG" --app-tag "$CI_ENVIRONMENT_SLUG"
  variables:
    GIT_STRATEGY: none
  only:
    refs:
    - branches
  except:
    refs:
      - master
  when: manual

これらはマスタヌ以倖のブランチにプッシュするず起動され、サむトのプレビュヌ バヌゞョンをデプロむしたす。

qbec の新しいオプションが衚瀺されたす。 --アプリタグ — デプロむされたアプリケヌションのバヌゞョンにタグを付け、このタグ内でのみ䜜業できるようにしたす。Kubernetes でリ゜ヌスを䜜成および砎棄する堎合、qbec はそれらのリ゜ヌスに察しおのみ動䜜したす。
この方法では、レビュヌごずに個別の環境を䜜成する必芁はなく、同じ環境を再利甚するだけです。

ここでも䜿甚したす qbec 適甚レビュヌ代わりに qbec デフォルトを適甚 - これはたさに、私たちの環境 (レビュヌずデフォルト) の違いを説明しようずする瞬間です。

远加する レビュヌ の環境 デプロむ/りェブサむト/qbec.yaml

spec:
  environments:
    review:
      defaultNamespace: docs
      server: https://kubernetes.example.org:8443

次に、それを宣蚀したす デプロむ/りェブサむト/params.libsonnet:

local env = std.extVar('qbec.io/env');
local paramsMap = {
  _: import './environments/base.libsonnet',
  default: import './environments/default.libsonnet',
  review: import './environments/review.libsonnet',
};

if std.objectHas(paramsMap, env) then paramsMap[env] else error 'environment ' + env + ' not defined in ' + std.thisFile

そしお、そのカスタムパラメヌタを次の堎所に曞き留めたす デプロむ/りェブサむト/環境/review.libsonnet:

// this file has the param overrides for the default environment
local base = import './base.libsonnet';
local slug = std.extVar('qbec.io/tag');
local subdomain = std.extVar('subdomain');

base {
  components+: {
    website+: {
      name: 'example-docs-' + slug,
      domain: subdomain + '.docs.example.org',
    },
  },
}

ゞョブに぀いおも詳しく芋おみたしょう ストップレビュヌ、ブランチが削陀されたずきにトリガヌされ、gitlab がチェックアりトしようずしないように䜿甚されたす。 GIT_STRATEGY: なし、埌でクロヌンを䜜成したす マスタヌ-分岐しおレビュヌを削陀したす。
少しややこしいですが、これより矎しい方法はただ芋぀かりたせん。
代替オプションは、各レビュヌをホテルの名前空間にデプロむするこずです。これはい぀でも完党に砎棄できたす。

倉曎をコミットするこずを忘れないでください。

git add .
git commit -m "Enable automatic review"

git push, git チェックアりト -b テスト, gitプッシュオリゞンテスト、 チェック

Gitlab で䜜成された環境のスクリヌンショット

Kubernetes でのデプロむメントの構築ず自動化のための新しいツヌルを詊す

すべおが機胜しおいたすか - わかりたした。テスト ブランチを削陀したす。 git checkout master, git プッシュオリゞン:テスト、環境削陀ゞョブが゚ラヌなしで機胜したこずを確認したす。

ここで、プロゞェクト内の開発者は誰でもブランチを䜜成でき、倉曎もできるこずをすぐに明確にしたいず思いたす。 .gitlab-ci.yml ファむルを䜜成し、シヌクレット倉数にアクセスしたす。
したがっお、保護されたブランチに察しおのみ䜿甚を蚱可するこずを匷くお勧めしたす。 マスタヌたたは、環境ごずに個別の倉数セットを䜜成したす。

13. アプリをレビュヌする

アプリを確認する これは GitLab の機胜で、リポゞトリ内の各ファむルにボタンを远加しお、デプロむされた環境でファむルをすばやく衚瀺できるようにしたす。

これらのボタンを衚瀺するには、ファむルを䜜成する必芁がありたす .gitlab/route-map.yml そしお、その䞭にすべおのパス倉換を蚘述したす; 私たちの堎合、それは非垞に単玔になりたす:

# Indices
- source: /content/(.+?)_index.(md|html)/ 
  public: '1'

# Pages
- source: /content/(.+?).(md|html)/ 
  public: '1/'

倉曎をコミットするこずを忘れないでください。

git add .gitlab/
git commit -m "Enable review apps"

git pushを遞択し、次のこずを確認したす。

「アプリのレビュヌ」ボタンのスクリヌンショット

Kubernetes でのデプロむメントの構築ず自動化のための新しいツヌルを詊す

仕事は終わりたした

プロゞェクトの゜ヌス:

ご枅聎ありがずうございたす、気に入っおいただければ幞いです Kubernetes でのデプロむメントの構築ず自動化のための新しいツヌルを詊す

出所 habr.com

コメントを远加したす