ArgoCDとGitOpsを使用してKubernetesにデプロイする方法

提供:Dev Guides
移動先:案内検索

序章

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

kubectlReadyステータスのノードのセットを返さない場合は、クラスタ構成と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、可観測性スタックのデプロイについて学習することをお勧めします。