ArgoCDとGitOpsを使用してKubernetesにデプロイする方法
序章
Kubernetesを使用してアプリケーションをデプロイすると、柔軟なスケーリング、分散コンポーネントの管理、アプリケーションのさまざまなバージョンの制御など、インフラストラクチャ上で大きなメリットが得られます。 ただし、制御が強化されると、複雑さが増します。 継続的インテグレーションと継続的展開( CI / CD )システムは通常、バージョン管理、変更ログ、およびロールバック機能を提供するために、高レベルの抽象化で機能します。 この抽象化レイヤーへの一般的なアプローチは、GitOpsと呼ばれます。
GitOpsは、2017ブログ投稿でWeaveworks によって最初に提案されたように、 GitをCI/CDプロセスの「信頼できる唯一の情報源」として使用し、コードの変更を統合しますプロジェクトごとに単一の共有リポジトリで、プルリクエストを使用してインフラストラクチャと展開を管理します。
KubernetesのDevOpsプロセスのフォーカルポイントとしてGitを使用するツールがいくつかあります。 このチュートリアルでは、宣言型の継続的デリバリーツールである ArgoCDの使用方法を学習します。 Argo CDは、GitHubリポジトリに変更が加えられるたびにアプリケーションを自動的に同期してデプロイする、継続的デリバリーツールを提供します。 アプリケーションのデプロイとライフサイクルを管理することで、Kubernetes環境でのバージョン管理、構成、アプリケーション定義のソリューションを提供し、わかりやすいユーザーインターフェイスで複雑なデータを整理します。 Jsonnet、 Kustomize アプリケーション、 Helm チャート、YAML / jsonファイルなど、いくつかのタイプのKubernetesマニフェストを処理でき、GitHub、GitLab、BitbucketからのWebhook通知をサポートします。
この記事では、Argo CDを使用して、GitHubリポジトリからアプリケーションを同期およびデプロイします。
前提条件
このチュートリアルに従うには、次のものが必要です。
- ローカルのLinux/MacOS/BSDマシン上のSSHキーペア。 これまでにSSHキーを使用したことがない場合は、ローカルマシンでのSSHキーの設定方法の説明に従って、SSHキーの設定方法を学ぶことができます。 Windowsを使用している場合は、 Windows Subsystem forLinux環境で作業している必要があります。
- 少なくとも1つのワーカーノードで構成される既存のKubernetesクラスター。 kubectl が作業環境にインストールされ、クラスターに接続できる必要があります。 DigitalOceanのManagedKubernetes は、デフォルトでこのような構成を提供します。 DigitalOceanのマネージドKubernetesを使用している場合は、クラスターへの接続方法を確認する必要があります。
- Kubernetesの概念に精通していること。 詳細については、記事Kubernetesの概要を参照してください。
ステップ1—クラスターへのArgoCDのインストール
Argo CDをインストールするには、最初にkubectl
で有効なKubernetes構成をセットアップし、そこからワーカーノードにpingを実行できるようにする必要があります。 kubectl get nodes
を実行して、これをテストできます。
kubectl get nodes
このコマンドは、Ready
ステータスのノードのリストを返す必要があります。
OutputNAME STATUS ROLES AGE VERSION pool-uqv8a47h0-ul5a7 Ready <none> 22m v1.21.5 pool-uqv8a47h0-ul5am Ready <none> 21m v1.21.5 pool-uqv8a47h0-ul5aq Ready <none> 21m v1.21.5
kubectl
がReady
ステータスのノードのセットを返さない場合は、クラスタ構成とKubernetesドキュメントを確認する必要があります。
次に、クラスターにargocd
名前空間を作成します。これには、ArgoCDとそれに関連するサービスが含まれます。
kubectl create namespace argocd
その後、プロジェクトメンテナから提供されたArgoCDインストールスクリプトを実行できます。
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
インストールが正常に完了したら、watch
コマンドを使用して、Kubernetesポッドのステータスを確認できます。
watch kubectl get pods -n argocd
デフォルトでは、ストックArgoCDインストールの一部として最終的にRunning
ステータスを受け取る5つのポッドが必要です。
OutputNAME READY STATUS RESTARTS AGE argocd-application-controller-0 1/1 Running 0 2m28s argocd-dex-server-66f865ffb4-chwwg 1/1 Running 0 2m30s argocd-redis-5b6967fdfc-q4klp 1/1 Running 0 2m30s argocd-repo-server-656c76778f-vsn7l 1/1 Running 0 2m29s argocd-server-cd68f46f8-zg7hq 1/1 Running 0 2m28s
Ctrl+C
を押すと、watch
インターフェースを終了できます。 これで、KubernetesクラスターでArgoCDが実行されます。 ただし、Kubernetesがネットワークインターフェースの周りに抽象化を作成する方法のため、クラスター内からポートを転送せずに直接アクセスすることはできません。 次のステップでそれを処理する方法を学びます。
ステップ2—ArgoCDにアクセスするためのポートの転送
Kubernetesはクラスター内の任意のネットワークアドレスにサービスをデプロイするため、ローカルマシンからアクセスするには、関連するポートを転送する必要があります。 Argo CDは、ポート443にargocd-server
という名前のサービスを内部的にセットアップします。 ポート443はデフォルトのHTTPSポートであり、他のHTTP / HTTPSサービスを実行している可能性があるため、次のように、8080
などの任意に選択した他のポートにそれらを転送するのが一般的です。
kubectl port-forward svc/argocd-server -n argocd 8080:443
ポートフォワーディングは、アクティブである限り、実行中の端末をブロックするため、作業を継続している間は、新しい端末ウィンドウでこれを実行することをお勧めします。 ポートの転送を停止する場合は、Ctrl+C
を押して、このようなブロッキングプロセスを正常に終了できます。
それまでの間、localhost:8080
に移動すると、WebブラウザでArgoCDにアクセスできるようになります。 ただし、次の手順で取得するためにコマンドラインを使用する必要があるログインパスワードの入力を求められます。 Argo CDはまだ有効なSSL証明書で構成されていないため、セキュリティ警告をクリックする必要があります。
注:KubernetesでLetsEncryptHTTPS証明書を使用するには、Cert-Managerなどの追加ツールを使用するのが最適です。
ステップ3—コマンドラインからArgoCDを操作する
次の手順では、argocd
コマンドをローカルにインストールして、ArgoCDインスタンスとのインターフェイスおよび設定の変更を行う必要があります。 Argo CDの公式ドキュメントでは、Homebrewパッケージマネージャーを使用してインストールすることをお勧めします。 Homebrewは、MacOSでコマンドラインツールを管理するために非常に人気があり、最近では、このようなツールの保守を容易にするためにLinuxに移植されています。
Homebrewをまだインストールしていない場合は、次の1行のコマンドで取得してインストールできます。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
インストールプロセス中にパスワードの入力を求められる場合があります。 その後、端末でbrew
コマンドを使用できるようになります。 これを使用して、ArgoCDをインストールできます。
brew install argocd
これにより、argocd
コマンドが提供されます。 使用する前に、kubectl
を再度使用して、インストール中に自動的に生成された管理者パスワードを取得し、ログインに使用できるようにする必要があります。 Kubernetesシークレットを使用して保存されている特定のJSONファイルへのパスを渡し、関連する値を抽出します。
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
OutputfbP20pvw-o-D5uxH
次に、ブラウザでlocalhost:8080
に戻り、admin
ユーザーとして自分のパスワードでログインすることにより、ArgoCDダッシュボードにログインできます。
すべてが機能したら、argocd login
を実行することにより、同じクレデンシャルを使用してコマンドラインからArgoCDにログインできます。 これは、後でコマンドラインからデプロイするために必要になります。
argocd login localhost:8080
ここのコマンドラインで同等の証明書の警告が再度表示されます。プロンプトが表示されたら、y
と入力して続行する必要があります。 必要に応じて、argocd account update-password
を実行して、パスワードをより安全で覚えやすいものに変更できます。 その後、完全に機能するArgoCD構成が作成されます。 このチュートリアルの最後のステップでは、これを使用して実際にいくつかのサンプルアプリケーションをデプロイする方法を学習します。
ステップ4—複数のクラスターの処理(オプション)
アプリケーションをデプロイする前に、実際にアプリケーションをデプロイする場所を確認する必要があります。 デフォルトでは、Argo CDは、Argo CD自体が実行されているのと同じクラスターにアプリケーションをデプロイします。これはデモには問題ありませんが、実稼働環境ではおそらく適切ではありません。 現在のマシンで認識されているすべてのクラスターを一覧表示するには、kubectl config
を使用できます。
kubectl config get-contexts -o name
Outputtest-deploy-cluster test-target-cluster
ArgoCDをtest-deploy-cluster
にインストールし、それを使用してアプリケーションをtest-target-cluster
に展開したい場合は、argocd cluster add
:
argocd cluster add target-k8s
これにより、追加のクラスターのログイン詳細がArgo CDに追加され、ArgoCDがクラスターにサービスを展開できるようになります。
ステップ5—サンプルアプリケーションのデプロイ(オプション)
Argo CDを実行し、アプリケーションをさまざまなKubernetesクラスターにデプロイする方法を理解したので、次はそれを実践します。 Argo CDプロジェクトは、GitOpsの基礎を紹介するように設計されたサンプルアプリケーションのリポジトリを維持しています。 これらの例の多くは、同じguestbook
デモアプリを、Jsonnetなどのさまざまな種類のKubernetesマニフェストに移植したものです。 この場合、最も耐久性のあるKubernetes管理ソリューションの1つであるヘルムチャートを使用するhelm-guestbook
の例をデプロイします。
これを行うには、argocd app create
コマンドを使用して、Gitリポジトリへのパス、特定のhelm-guestbook
の例を指定し、デフォルトの宛先と名前空間を渡します。
argocd app create helm-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path helm-guestbook --dest-server https://kubernetes.default.svc --dest-namespace default
Argo CD内でアプリケーションを「作成」した後、argocd app get
でそのステータスを確認できます。
argocd app get helm-guestbook
OutputName: helm-guestbook Project: default Server: https://kubernetes.default.svc Namespace: default URL: https://localhost:8080/applications/helm-guestbook Repo: https://github.com/argoproj/argocd-example-apps.git Target: Path: helm-guestbook SyncWindow: Sync Allowed Sync Policy: <none> Sync Status: OutOfSync from (53e28ff) Health Status: Missing GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE Service default helm-guestbook OutOfSync Missing apps Deployment default helm-guestbook OutOfSync Missing
OutOfSync
アプリケーションのステータスは正常です。 Githubからアプリケーションのヘルムチャートを取得し、Argo CDにエントリを作成しましたが、実際にはまだKubernetesリソースを起動していません。 アプリケーションを実際にデプロイするには、argocd app sync
を実行します。
argocd app sync helm-guestbook
sync
は、GitOpsの原則に沿った、ここでの展開と同義です。ArgoCDを使用する場合の目標は、アプリケーションがアップストリーム構成で常に1:1を追跡することです。
OutputTIMESTAMP GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE 2022-01-19T11:01:48-08:00 Service default helm-guestbook OutOfSync Missing 2022-01-19T11:01:48-08:00 apps Deployment default helm-guestbook OutOfSync Missing 2022-01-19T11:01:48-08:00 Service default helm-guestbook Synced Healthy 2022-01-19T11:01:48-08:00 Service default helm-guestbook Synced Healthy service/helm-guestbook created 2022-01-19T11:01:48-08:00 apps Deployment default helm-guestbook OutOfSync Missing deployment.apps/helm-guestbook created 2022-01-19T11:01:49-08:00 apps Deployment default helm-guestbook Synced Progressing deployment.apps/helm-guestbook created Name: helm-guestbook Project: default Server: https://kubernetes.default.svc Namespace: default URL: https://localhost:8080/applications/helm-guestbook Repo: https://github.com/argoproj/argocd-example-apps.git Target: Path: helm-guestbook SyncWindow: Sync Allowed Sync Policy: <none> Sync Status: Synced to (53e28ff) Health Status: Progressing Operation: Sync Sync Revision: 53e28ff20cc530b9ada2173fbbd64d48338583ba Phase: Succeeded Start: 2022-01-19 11:01:49 -0800 PST Finished: 2022-01-19 11:01:50 -0800 PST Duration: 1s Message: successfully synced (all tasks run) GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE Service default helm-guestbook Synced Healthy service/helm-guestbook created apps Deployment default helm-guestbook Synced Progressing deployment.apps/helm-guestbook created
これで、ArgoCDを使用してアプリケーションを正常にデプロイできました。 Argo CD Webインターフェイスから同じことを実行することは可能ですが、通常はコマンドラインを介して展開する方が迅速で再現性が高くなります。 ただし、アプリケーションが正しく実行されていることを確認するために、展開後にArgoCDWebダッシュボードを確認すると非常に役立ちます。 ブラウザでlocalhost:8080
を開くと、次のことがわかります。
この時点で、最後に行うことは、ブラウザーで新しいデプロイメントにアクセスできることを確認することです。 そのためには、Argo CD自体の場合と同じように、別のポートを転送します。 内部的には、helm-guestbook
アプリは通常のHTTPポート80
で実行され、自分のポート80
またはポート[ ArgoCDに使用しているX183X]は、ポート9090
に転送できます。
kubectl port-forward svc/helm-guestbook 9090:80
以前と同様に、Ctrl+C
を押してポートの転送を停止するまでその端末をブロックするため、別の端末でこれを実行することをお勧めします。 次に、ブラウザウィンドウでlocalhost:9090
を開いて、サンプルのゲストブックアプリを表示できます。
このGithubリポジトリにさらにプッシュすると、ArgoCDに自動的に反映され、継続的な可用性を提供しながらデプロイメントが再同期されます。
結論
これで、ArgoCDを使用したアプリケーションのインストールとデプロイの基本について説明しました。 Kubernetesは非常に多くの抽象化レイヤーを必要とするため、デプロイが可能な限り維持可能であることを確認することが重要であり、GitOps哲学は優れたソリューションです。
次に、Kubernetesクラスターの稼働時間、正常性、ログ記録を監視するための TOBS、可観測性スタックのデプロイについて学習することをお勧めします。