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をインストールするには、最初に有効なKubernetes構成をセットアップする必要があります kubectl
、そこからワーカーノードに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
デフォルトでは、最終的に受信するポッドが5つあるはずです。 Running
在庫のArgoCDインストールの一部としてのステータス。
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はクラスター内の任意のネットワークアドレスにサービスをデプロイするため、ローカルマシンからアクセスするには、関連するポートを転送する必要があります。 ArgoCDはという名前のサービスを設定します argocd-server
内部的にポート443で。 ポート443はデフォルトのHTTPSポートであり、他のHTTP / HTTPSサービスを実行している可能性があるため、これらを任意に選択した他のポートに転送するのが一般的な方法です。 8080
、 そのようです:
- kubectl port-forward svc/argocd-server -n argocd 8080:443
ポートフォワーディングは、アクティブである限り、実行中の端末をブロックするため、作業を継続している間は、新しい端末ウィンドウでこれを実行することをお勧めします。 押すことができます Ctrl+C
ポートの転送を停止する場合は、このようなブロッキングプロセスを正常に終了します。
それまでの間、次の場所に移動すると、WebブラウザでArgoCDにアクセスできるようになります。 localhost:8080
. ただし、次の手順で取得するためにコマンドラインを使用する必要があるログインパスワードの入力を求められます。 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
その後、に戻ってArgoCDダッシュボードにログインできます。 localhost:8080
ブラウザでログインし、 admin
自分のパスワードを持つユーザー:
すべてが機能したら、同じクレデンシャルを使用して、コマンドラインからArgoCDにログインできます。 argocd login
. これは、後でコマンドラインからデプロイするために必要になります。
- 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
、登録できます test-target-cluster
ArgoCDを実行して argocd cluster add
:
- argocd cluster add target-k8s
これにより、追加のクラスターのログイン詳細がArgo CDに追加され、ArgoCDがクラスターにサービスを展開できるようになります。
ステップ5—サンプルアプリケーションのデプロイ(オプション)
Argo CDを実行し、アプリケーションをさまざまなKubernetesクラスターにデプロイする方法を理解したので、次はそれを実践します。 Argo CDプロジェクトは、GitOpsの基礎を紹介するように設計されたサンプルアプリケーションのリポジトリを維持しています。 これらの例の多くは同じポートです guestbook
Jsonnetなどのさまざまな種類のKubernetesマニフェストのデモアプリ。 この場合、 helm-guestbook
たとえば、最も耐久性のあるKubernetes管理ソリューションの1つであるヘルムチャートを使用します。
そのためには、 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
The 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
またはポート上 8080
Argo CDに使用している場合は、ポートに転送できます 9090
:
- kubectl port-forward svc/helm-guestbook 9090:80
以前と同様に、別の端末でこれを実行することをお勧めします。これは、を押すまでその端末をブロックするためです。 Ctrl+C
ポートの転送を停止します。 その後、開くことができます localhost:9090
ブラウザウィンドウで、サンプルのゲストブックアプリを表示します。
このGithubリポジトリにさらにプッシュすると、ArgoCDに自動的に反映され、継続的な可用性を提供しながらデプロイメントが再同期されます。
結論
これで、ArgoCDを使用したアプリケーションのインストールとデプロイの基本について説明しました。 Kubernetesは非常に多くの抽象化レイヤーを必要とするため、デプロイが可能な限り維持可能であることを確認することが重要であり、GitOps哲学は優れたソリューションです。
次に、Kubernetesクラスターの稼働時間、正常性、ログ記録を監視するための TOBS、可観測性スタックのデプロイについて学習することをお勧めします。