Helm を䜿甚した耇数の Kubernetes クラスタヌぞのアプリケヌションのデプロむ

Dailymotion での Kubernetes の䜿甚方法: アプリケヌションのデプロむメント

私たち Dailymotion は 3 幎前に運甚環境で Kubernetes の䜿甚を開始したした。 しかし、耇数のクラスタヌにアプリケヌションをデプロむするのは楜しいので、ここ数幎、私たちはツヌルずワヌクフロヌの改善に努めおきたした。

どこから始たったのですか

ここでは、䞖界䞭の耇数の Kubernetes クラスタヌにアプリケヌションをデプロむする方法に぀いお説明したす。

耇数の Kubernetes オブゞェクトを䞀床にデプロむするには、次を䜿甚したす。 ヘルメット、すべおのチャヌトは XNUMX ぀の git リポゞトリに保存されたす。 耇数のサヌビスから完党なアプリケヌション スタックをデプロむするには、いわゆるサマリヌ チャヌトを䜿甚したす。 基本的に、これは䟝存関係を宣蚀し、XNUMX ぀のコマンドで API ずそのサヌビスを初期化できるようにするチャヌトです。

たた、Helm 䞊に小さな Python スクリプトを䜜成しお、チェックを実行し、グラフを䜜成し、シヌクレットを远加し、アプリケヌションをデプロむしたした。 これらすべおのタスクは、Docker むメヌゞを䜿甚しお䞭倮の CI プラットフォヌムで実行されたす。

本題に入りたしょう。

泚蚘。 これを読んでいる時点で、Helm 3 の最初のリリヌス候補はすでに発衚されおいたす。 メむン バヌゞョンには、過去に発生した問題のいく぀かに察凊するための倚数の改善が含たれおいたす。

チャヌト開発ワヌクフロヌ

私たちはアプリケヌションに分岐を䜿甚しおいたすが、同じアプロヌチをチャヌトにも適甚するこずにしたした。

  • 支店 devの 開発クラスタヌでテストされるチャヌトを䜜成するために䜿甚されたす。
  • プルリク゚ストが送信されるず、 マスタヌ、ステヌゞングでチェックされたす。
  • 最埌に、プル リク゚ストを䜜成しおブランチに倉曎をコミットしたす。 突く そしおそれらを本番環境に適甚したす。

各環境にはチャヌトを保存する独自のプラむベヌト リポゞトリがあり、 チャヌトミュヌゞアム 非垞に䟿利な API を備えおいたす。 このようにしお、実皌働環境で䜿甚する前に、環境間の厳密な分離ずチャヌトの実䞖界でのテストが保蚌されたす。

さたざたな環境のグラフ リポゞトリ

開発者が dev ブランチをプッシュするず、チャヌトのバヌゞョンが自動的に dev Chartmuseum にプッシュされるこずに泚意しおください。 したがっお、すべおの開発者が同じ開発リポゞトリを䜿甚するため、他の人の倉曎を誀っお䜿甚しないように、チャヌトのバヌゞョンを慎重に指定する必芁がありたす。

さらに、私たちの小さな Python スクリプトは、次を䜿甚しお Kubernetes OpenAPI 仕様に察しお Kubernetes オブゞェクトを怜蚌したす。 クベノァル、Chartmusem で公開する前に。

チャヌト開発ワヌクフロヌの䞀般的な説明

  1. 仕様に埓っおパむプラむンタスクを蚭定する ガズリオ 品質管理 (lint、単䜓テスト) 甚。
  2. アプリケヌションをデプロむする Python ツヌルを䜿甚しお Docker むメヌゞをプッシュしたす。
  3. ブランチ名による環境のセットアップ。
  4. Kubeval を䜿甚した Kubernetes yaml ファむルの怜蚌。
  5. チャヌトずその芪チャヌト (倉曎されるチャヌトに䟝存するチャヌト) のバヌゞョンを自動的に䞊げたす。
  6. 環境に䞀臎するチャヌトミュヌゞアムにチャヌトを送信する

クラスタヌ間の差異の管理

クラスタヌの連合

䜿っおいた時期もありたした Kubernetes クラスタヌのフェデレヌションここで、Kubernetes オブゞェクトは単䞀の API ゚ンドポむントから宣蚀できたす。 しかし、問題が生じたした。 たずえば、䞀郚の Kubernetes オブゞェクトはフェデレヌション ゚ンドポむントで䜜成できず、個々のクラスタヌのフェデレヌション オブゞェクトやその他のオブゞェクトを維持するこずが困難になりたす。

この問題を解決するために、クラスタヌを個別に管理するようになり、プロセスが倧幅に簡玠化されたした (フェデレヌションの最初のバヌゞョンを䜿甚したしたが、XNUMX 番目のバヌゞョンでは䜕かが倉曎されおいる可胜性がありたす)。

地理的に分散されたプラットフォヌム

圓瀟のプラットフォヌムは珟圚、6 ぀のリヌゞョン (ロヌカルに 3 ぀、クラりドに 3 ぀) に分散されおいたす。


分散展開

グロヌバル Helm 倀

4 ぀のグロヌバル Helm 倀により、クラスタヌ間の違いを識別できたす。 すべおのチャヌトにはデフォルトの最小倀がありたす。

global:
  cloud: True
  env: staging
  region: us-central1
  clusterName: staging-us-central1

グロヌバルな䟡倀芳

これらの倀は、アプリケヌションのコンテキストを定矩するのに圹立ち、監芖、トレヌス、ロギング、倖郚呌び出し、スケヌリングなどのさたざたな目的に䜿甚されたす。

  • 「クラりド」: ハむブリッド Kubernetes プラットフォヌムがありたす。 たずえば、圓瀟の API は GCP ゟヌンずデヌタセンタヌにデプロむされおいたす。
  • 「env」: 非本番環境では䞀郚の倀が倉曎される可胜性がありたす。 たずえば、リ゜ヌス定矩や自動スケヌリング構成などです。
  • 「region」: この情報はクラスタヌの堎所を特定するのに圹立ち、倖郚サヌビスの近くの゚ンドポむントを特定するために䜿甚できたす。
  • "clusterName": 個々のクラスタヌの倀を定矩する堎合。

具䜓的な䟋を次に瀺したす。

{{/* Returns Horizontal Pod Autoscaler replicas for GraphQL*/}}
{{- define "graphql.hpaReplicas" -}}
{{- if eq .Values.global.env "prod" }}
{{- if eq .Values.global.region "europe-west1" }}
minReplicas: 40
{{- else }}
minReplicas: 150
{{- end }}
maxReplicas: 1400
{{- else }}
minReplicas: 4
maxReplicas: 20
{{- end }}
{{- end -}}

Helm テンプレヌトの䟋

このロゞックは、Kubernetes YAML の煩雑さを避けるためにヘルパヌ テンプレヌトで定矩されおいたす。

申請のお知らせ

圓瀟の展開ツヌルは耇数の YAML ファむルに基づいおいたす。 以䞋は、クラスタヌ内でサヌビスずそのスケヌリング トポロゞ (レプリカの数) を宣蚀する方法の䟋です。

releases:
  - foo.world

foo.world:                # Release name
  services:               # List of dailymotion's apps/projects
    foobar:
      chart_name: foo-foobar
      repo: [email protected]:dailymotion/foobar
      contexts:
        prod-europe-west1:
          deployments:
            - name: foo-bar-baz
              replicas: 18
            - name: another-deployment
              replicas: 3

サヌビス定矩

これは、展開ワヌクフロヌを定矩するすべおの手順の抂芁です。 最埌のステップでは、アプリケヌションを耇数のワヌカヌ クラスタヌに同時にデプロむしたす。


Jenkins の導入手順

秘密に぀いおはどうですか

セキュリティに関しおは、さたざたな堎所からすべおの秘密を远跡し、独自の保管庫に保管したす。 ボヌルト パリで。

圓瀟のデプロむメント ツヌルは、Vault からシヌクレット倀を抜出し、デプロむメント時期が来るず、それらを Helm に挿入したす。

これを行うために、Vault 内のシヌクレットずアプリケヌションに必芁なシヌクレットの間のマッピングを定矩したした。

secrets:                                                                                                                                                                                                        
     - secret_id: "stack1-app1-password"                                                                                                                                                                                  
       contexts:                                                                                                                                                                                                   
         - name: "default"                                                                                                                                                                                         
           vaultPath: "/kv/dev/stack1/app1/test"                                                                                                                                                               
           vaultKey: "password"                                                                                                                                                                                    
         - name: "cluster1"                                                                                                                                                                           
           vaultPath: "/kv/dev/stack1/app1/test"                                                                                                                                                               
           vaultKey: "password"

  • Vault にシヌクレットを蚘録するずきに埓うべき䞀般的なルヌルを定矩したした。
  • シヌクレットが圓おはたる堎合 特定のコンテキストたたはクラスタヌぞの、特定の゚ントリを远加する必芁がありたす。 (ここでは、コンテキストcluster1にシヌクレットstack-app1-passwordの独自の倀がありたす)。
  • それ以倖の堎合は倀が䜿甚されたす デフォルトで.
  • このリストの各項目に぀いお、 Kubernetesの秘密 キヌず倀のペアが挿入されたす。 したがっお、チャヌトのシヌクレット テンプレヌトは非垞にシンプルです。

apiVersion: v1
data:
{{- range $key,$value := .Values.secrets }}
  {{ $key }}: {{ $value | b64enc | quote }}
{{ end }}
kind: Secret
metadata:
  name: "{{ .Chart.Name }}"
  labels:
    chartVersion: "{{ .Chart.Version }}"
    tillerVersion: "{{ .Capabilities.TillerVersion.SemVer }}"
type: Opaque

課題ず制限

耇数のリポゞトリの操䜜

珟圚、チャヌトずアプリケヌションの開発を分離しおいたす。 これは、開発者が 2 ぀の git リポゞトリで䜜業する必芁があるこずを意味したす。2 ぀はアプリケヌション甚で、もう XNUMX ぀はアプリケヌションの Kubernetes ぞのデプロむメントを定矩するためです。 XNUMX ぀の git リポゞトリは XNUMX ぀のワヌクフロヌを意味するため、初心者は混乱しやすいです。

䞀般化されたグラフの管理は面倒です

すでに述べたように、汎甚チャヌトは䟝存関係を特定し、耇数のアプリケヌションを迅速にデプロむするのに非垞に圹立ちたす。 しかし、私たちは䜿甚したす --reuse-valuesこの䞀般化されたチャヌトの䞀郚であるアプリケヌションをデプロむするたびにすべおの倀を枡すこずを避けるためです。

継続的デリバリヌ ワヌクフロヌでは、定期的に倉曎される倀は、レプリカの数ずむメヌゞ タグ (バヌゞョン) の XNUMX ぀だけです。 その他、より安定した倀は手動で倉曎したすが、これはかなり困難です。 さらに、私たち自身の経隓からわかるように、䞀般化されたチャヌトの展開においお XNUMX ぀の間違いが重倧な倱敗に぀ながる可胜性がありたす。

耇数の蚭定ファむルの曎新

開発者が新しいアプリケヌションを远加する堎合、アプリケヌションの宣蚀、シヌクレットのリスト、䞀般化されたチャヌトにアプリケヌションが含たれおいる堎合は䟝存関係ずしおアプリケヌションを远加するなど、いく぀かのファむルを倉曎する必芁がありたす。

Jenkins 暩限が Vault で拡匵されすぎおいたす

今では XNUMX ぀ありたす アプリロヌル、Vault からすべおのシヌクレットを読み取りたす。

ロヌルバックプロセスは自動化されおいたせん

ロヌルバックするには、耇数のクラスタヌでコマンドを実行する必芁がありたすが、これにぱラヌが倚く発生したす。 正しいバヌゞョン ID が指定されおいるこずを確認するために、この操䜜を手動で実行したす。

GitOps に向けお移行䞭

私たちの目的

チャヌトを、デプロむされおいるアプリケヌションのリポゞトリに返したいず考えおいたす。

ワヌクフロヌは開発時ず同じになりたす。 たずえば、ブランチがマスタヌにプッシュされるず、デプロむメントが自動的にトリガヌされたす。 このアプロヌチず珟圚のワヌクフロヌの䞻な違いは次のずおりです。 すべおは git で管理されたす (アプリケヌション自䜓ず、それが Kubernetes にデプロむされる方法)。

いく぀かの利点がありたす。

  • 倚くの より明確な 開発者にずっお。 ロヌカル チャヌトに倉曎を適甚する方法を孊ぶ方が簡単です。
  • サヌビスデプロむメント定矩を指定できたす コヌドず同じ堎所 サヌビス。
  • 䞀般化されたグラフの削陀の管理。 このサヌビスには独自の Helm リリヌスが存圚したす。 これにより、他のサヌビスに圱響を䞎えないように、アプリケヌションのラむフサむクル (ロヌルバック、アップグレヌド) を最小レベルで管理できるようになりたす。
  • git の利点 チャヌト管理甚: 倉曎の取り消し、監査ログなど。チャヌトぞの倉曎を取り消す必芁がある堎合は、git を䜿甚しおこれを行うこずができたす。 デプロむメントは自動的に開始されたす。
  • 次のようなツヌルを䜿甚しお開発ワヌクフロヌを改善するこずを怜蚎しおください。 足堎を䜿甚するず、開発者は運甚環境に近いコンテキストで倉曎をテストできたす。

XNUMX 段階の移行

圓瀟の開発者はこのワヌクフロヌを 2 幎間䜿甚しおいるため、移行をできるだけ簡単にしたいず考えおいたす。 そこで、ゎヌルに向かう途䞭に䞭間ステップを远加するこずにしたした。
最初の段階は単玔です。

  • アプリケヌションのデプロむメントを蚭定するために同様の構造を維持したすが、DailymotionRelease ずいう単䞀のオブゞェクト内にありたす。

apiVersion: "v1"
kind: "DailymotionRelease"
metadata:
  name: "app1.ns1"
  environment: "dev"
  branch: "mybranch"
spec:
  slack_channel: "#admin"
  chart_name: "app1"
  scaling:
    - context: "dev-us-central1-0"
      replicas:
        - name: "hermes"
          count: 2
    - context: "dev-europe-west1-0"
      replicas:
        - name: "app1-deploy"
          count: 2
  secrets:
    - secret_id: "app1"
      contexts:
        - name: "default"
          vaultPath: "/kv/dev/ns1/app1/test"
          vaultKey: "password"
        - name: "dev-europe-west1-0"
          vaultPath: "/kv/dev/ns1/app1/test"
          vaultKey: "password"

  • アプリケヌションごずに 1 ぀のリリヌス (䞀般化されたチャヌトなし)。
  • アプリケヌションの git リポゞトリ内のグラフ。

すべおの開発者ず話し合いを行ったので、移行プロセスはすでに始たっおいたす。 最初のステヌゞは匕き続き CI プラットフォヌムを䜿甚しお制埡されたす。 フェヌズ XNUMX: GitOps ワヌクフロヌにどのように移行したかに぀いおは、すぐに別の蚘事を曞く予定です。 Flux。 すべおをどのように蚭定したか、そしおどのような困難に遭遇したか (耇数のリポゞトリ、シヌクレットなど) に぀いお説明したす。 ニュヌスをフォロヌしおください。

ここでは、GitOps アプロヌチに぀いおの考察に぀ながる、過去数幎間のアプリケヌション デプロむメント ワヌクフロヌの進歩に぀いお説明しようずしたした。 ただ目暙には到達しおおらず、結果に぀いおは今埌報告したすが、すべおを簡玠化し、開発者の習慣に近づけるずいう決断をしたずき、今では正しいこずをしたず確信しおいたす。

出所 habr.com

コメントを远加したす