OpenShift GitOps Lab - Helmインテグレーション

Helmインテグレーション

HelmはKubernetesアプリケーションのパッケージマネージャーです。事前にパッケージ化されたアプリケーションを定義、インストール、更新することができます。ビルド済みのKubernetesアプリケーションをバンドルして提供する方法です。

helm 001

Argo CDは、Kubernetes用の宣言型GitOps継続的デリバリーツールです。Argo CDを使用すると、Helmチャートを使用してアプリケーションをデプロイおよび管理できます。 この演習では、Argo CDを使用してHelm チャートをデプロイする方法を学習します。

このトピックではArgo CD内のネイティブHelmインテグレーションについて説明します。

背景

Helmはアプリケーションスタックをパッケージ化してKubernetesにデプロイするための方法です。 Helmは、Kubernetesのパッケージマネージャーのようなものと考えることができます。Helmの主なコンポーネントは次のとおりです。

  • Chart : アプリケーションやアプリケーションスタックなどのをデプロイするために使用される、関連するKubernetes YAMLファイルで構成されるパッケージ

  • Repository : チャートを保存、共有、配布できる場所

  • Release : Kubernetes クラスターにデプロイされた Chart の特定のインスタンス

Helm は、ユーザーがCLIを介しHelmチャートに対して(ほとんどの場合YAMLファイルを介して)パラメーターを提供することによって機能します。 これらのパラメーターはHelmテンプレートYAMLに挿入され、KubernetesクラスターにデプロイされるYAMLを生成します。

helm 002

Argo CDにはHelmのネイティブサポートが組み込まれています。 Helmチャートリポジトリを呼び出し、値を直接 アプリケーションマニフェストに提供します。 さらに、UIまたはCLIを介して、直接、クラスター上のHelmリリースをArgoCDで操作や管理することができます。

マニフェストを調べる

Argo CDのApplicationマニフェストで Helmリポジトリ、チャート、および値を直接指定できます。 例を見てみましょう。 quarkus-app.yamlファイルを確認します。 このApplicationは、サンプルのQuarkusアプリケーションをデプロイします。ファイル全体は以下の通りです。

---
apiVersion: v1
kind: Namespace
metadata:
  name: demo
  labels:
    argocd.argoproj.io/managed-by: openshift-gitops
---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: quarkus-app
  namespace: openshift-gitops
spec:
  destination:
    namespace: demo
    server: https://kubernetes.default.svc
  project: default
  source:
    helm:
      parameters:
        - name: build.enabled
          value: "false"
        - name: deploy.route.tls.enabled
          value: "true"
        - name: image.name
          value: quay.io/ablock/gitops-helm-quarkus
    chart: quarkus
    repoURL: https://redhat-developer.github.io/redhat-helm-charts
    targetRevision: 0.0.3
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true

内容を見ると、.spec.source.helmで特定の構成が設定されているのでセクションを少し細かく見てみます。

spec:
  source:
    helm:
      parameters:
        - name: build.enabled
          value: "false"
        - name: deploy.route.tls.enabled
          value: "true"
        - name: image.name
          value: quay.io/ablock/gitops-helm-quarkus
    chart: quarkus
    repoURL: https://redhat-developer.github.io/redhat-helm-charts
    targetRevision: 0.0.3
  • parameters - このセクションでは、Helmチャートに渡すパラメーターを入力します。これらはValues.yamlファイルにある値と同じです。

  • chart - Helmリポジトリからデプロイするチャートの名前です。

  • repoURL - HelmリポジトリのURLです。

  • targetRevision - デプロイしたいチャートのバージョンです。

これらはhelm install …​を使用するのと同じように、Helmチャートをクラスターにデプロイするために使用できます。

実際に起こることは、Argo CDが helm template …​ | kubectl apply -f - を実行することです。それについては少し後で説明します。

アプリケーションをデプロイする

Argo CDインスタンスにGUIおよびCLI接続を行っていない場合、GitOpsのラボを参照しインスタンスへの接続を行います。

このトピックの最初の方に表示したArgo CD Applicationマニフェスト quarkus-app.yamlを適用して、Helmチャートをデプロイします。

oc apply -f https://raw.githubusercontent.com/redhat-developer-demos/openshift-gitops-examples/main/components/applications/quarkus-app.yaml

これによりquarkus-appアプリケーションが作成されます。Helmのアイコンに注意してください。アイコン ⎈ はHelmアプリケーションであることを示しています。

helm 002

この"card"をクリックすると、アプリケーションの概要ページに移動します。"show hidden resources"をクリックすると"tree"ビューが展開されます。

helm 003
helm 004

次のコマンドを実行してアプリケーションのURLを取得します。

oc get route/quarkus-app -n demo  -o jsonpath='{.spec.host}{"\n"}'

URLにアクセスすると、次のようなページが表示されます。quarkus-appはこのような表示を行うアプリケーションです。

helm 005

argocd CLI を使用して、このApplicationを操作できるようになりました。 例えば、アプリケーションのスケールを2レプリカに変更したい場合は、 argocd CLIを使用してその値を変更するだけです。 まず、実行中のpodの数を確認します。

oc get pods -n demo

出力は次のようになり、1つのpodが稼働しています。

NAME                           READY   STATUS              RESTARTS   AGE
quarkus-app-58f475cb86-rddz2   1/1     Running             0          14m

Helmのvaluesを変更してみましょう。

argocd app set quarkus-app -p deploy.replicas=2

このアプリケーションが2つのpodを利用するようにセットしました。podの数を再度確認します。

oc get pods -n demo

podが2つになります。

NAME                           READY   STATUS              RESTARTS   AGE
quarkus-app-58f475cb86-rddz2   1/1     Running             0          15m
quarkus-app-58f475cb86-s9llq   0/1     ContainerCreating   0          1s

Argo CDのUIには、2つのポッドがあり、アプリケーションが表示され、完全に正常に同期していることがわかります。

これはArgo CDを使用してHelmチャートをデプロイする有効かつ完全にサポートされている方法です。 しかし、これはGitOpsフレンドリーではありません。次のトピックでGitOpsワークフローでHelmを使用する方法を見てみましょう。 次の演習のために Argo CD WebUI タブを開いたままにしておいてください。Helm チャートをデプロイする、よりGitOpsフレンドリーな方法を学びます。

Helm GitOps Deployment

このトピックではHelmを利用したGitOpsデプロイメントパターンを学習します。

背景

前のトピックでは、Argo CDを使用してHelmチャートをネイティブにデプロイする方法を見てきました。この方法では、コンフィグでHelm Repo、Chart、および Valuesを直接提供する必要がありました。前のトピックの最後に、この方法は有効ではあるものの、GitOpsフレンドリーではないと申し上げました。

GitOpsワークフローでは、アプリケーションのデプロイの状態をSCMリポジトリ(GitHubなど)に保存する必要があります。これを行うには、values.yamlをgitリポジトリに保存し、何らかの方法でHelmリポジトリを参照する必要があります。

ここで、Helm Subchart/Dependency デプロイ戦略の出番です。

マニフェストを調べる

Kustomizeのラボ でクローンしたレポジトリ examples repo の中の quarkus-subchart ディレクトリをターゲットにします。

レポジトリをクローンしていない場合は、下記のコマンドでクローンを実行します。

cd ~
git clone https://github.com/redhat-developer-demos/openshift-gitops-examples
cd openshift-gitops-examples

quarkus-subchart ディレクトリの構成を調べると次のような、Chart.yaml ファイルと values.yaml ファイルの2つのYAMLファイルのみで構成されています。

openshift-gitops-examples/apps/quarkus-subchart
├── Chart.yaml
└── values.yaml

0 directories, 2 files

まずChart.yamlファイルを見てみましょう。

cat apps/quarkus-subchart/Chart.yaml

次のように表示されます。

apiVersion: v2
name: quarkus-subchart
type: application
version: 1.0.0
appVersion: "1.0.0"
dependencies:
- name: quarkus
  version: 0.0.3
  repository: https://redhat-developer.github.io/redhat-helm-charts

このChart.yamlファイルは、空のHelmチャートを作成し、デプロイするHelmチャートに関する依存関係としてdependeciesセクションに追加しています。

この方法を使用して、複数のHelmチャートをデプロイできます。

次にvalues.yamlファイルを見てみます。

cat apps/quarkus-subchart/values.yaml

次のように表示されます。

quarkus:
  build:
    enabled: false
  deploy:
    route:
      tls:
        enabled: true
    replicas: 1
  image:
    name: quay.io/ablock/gitops-helm-quarkus

ここでは、Helmチャートに渡す値を指定しています。 デプロイの状態がgitリポジトリに保存されるようになり、よりGitOpsに適しています。たとえば、イメージやレプリカの数を変更する場合は、gitワークフローを使用してこのアプリケーションを更新できます。GitOpsワークフローの場合と同様に、このリポジトリにpull requestできるようになりました。

Argo CDのApplicationは、通常のgitアプリケーションのように見えるはずです。

cat components/applications/quarkus-subchart.yaml

次のように表示されます。

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: quarkus-subchart
  namespace: openshift-gitops
spec:
  destination:
    namespace: demo
    server: https://kubernetes.default.svc
  project: default
  source:
    path: apps/quarkus-subchart/
    repoURL: https://github.com/redhat-developer-demos/openshift-gitops-examples
    targetRevision: main
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true

sourceの部分を見ると、Helmリポジトリではなくgitリポジトリをターゲットにしていることがわかります。

 source:
    path: apps/quarkus-subchart/
    repoURL: https://github.com/redhat-developer-demos/openshift-gitops-examples
    targetRevision: main

アプリケーションのデプロイ

このアプリケーションをデプロイする前に、Argo CDのWeb UIが開いていることを確認してください。 前のステップと同様に、Argo CD Web UIを開き、アプリケーションが作成されるのを確認します。

Argo CD Application マニフェスト quarkus-subchart.yaml を適用して、このHelmチャートをデプロイします。

oc apply -f https://raw.githubusercontent.com/redhat-developer-demos/openshift-gitops-examples/main/components/applications/quarkus-subchart.yaml

これにより、アプリケーションが作成されます。

Helmロゴ ⎈ は表示されません。 YAMLをロードしているだけなので、gitロゴになりました。
helm 006

このカードをクリックすると、アプリケーションの概要ページに移動します。必要に応じて、"show hidden resources"をクリックして、"tree"ビューを展開します。

helm 007

これで、Argo CDを使用して、GitOpsに適した方法でHelmチャートをデプロイしました。 注意すべき重要な点が1つあります。このHelmチャートを2回デプロイしましたが、argocd CLIを使用してこれを確認できます。次のコマンドを実行します。

argocd app list -o name

これにより、次の出力が得られるはずです。

quarkus-app
quarkus-subchart

これは、ocコマンドでも確認できます。

oc get applications -n openshift-gitops

ocコマンドにより次のような出力が得られるはずです。

NAME               SYNC STATUS   HEALTH STATUS
quarkus-app        Synced        Healthy
quarkus-subchart   Synced        Healthy

ただし、Helm CLIを使用してアプリケーションを一覧表示しようとしても、見ることができません。

helm ls --all-namespaces

次のように、Helmリリースは表示されません。

NAME    NAMESPACE       REVISION        UPDATED STATUS  CHART   APP VERSION

これは、Argo CDがHelmチャートをデプロイする方法のためです。Argo CDがHelmチャートをデプロイするとき、helm templateを実行し、それを kubectl apply -f にパイプで渡すことによってデプロイします。これは、Argo CDがhelm template(提供された値を含む) を "raw" のKubernetes YAMLに変換することを意味します。

この演習は以上になります。