序章

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:

  1. kubectl get nodes

このコマンドは、ノードのリストを返す必要があります。 Ready 状態:

Output
NAME 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とそれに関連するサービスが含まれます。

  1. kubectl create namespace argocd

その後、プロジェクトメンテナから提供されたArgoCDインストールスクリプトを実行できます。

  1. kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

インストールが正常に完了すると、 watch Kubernetesポッドのステータスを確認するコマンド:

  1. watch kubectl get pods -n argocd

デフォルトでは、最終的に受信するポッドが5つあるはずです。 Running 在庫のArgoCDインストールの一部としてのステータス。

Output
NAME 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、 そのようです:

  1. 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行のコマンドで取得してインストールできます。

  1. ​​/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

インストールプロセス中にパスワードの入力を求められる場合があります。 その後、あなたは持っている必要があります brew ターミナルで使用可能なコマンド。 これを使用して、ArgoCDをインストールできます。

  1. brew install argocd

これにより、 argocd 指図。 それを使用する前に、あなたは使用したいと思うでしょう kubectl インストール中に自動的に生成された管理者パスワードを再度取得して、ログインに使用できるようにします。 Kubernetesシークレットを使用して保存されている特定のJSONファイルへのパスを渡し、関連する値を抽出します。

  1. kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
Output
fbP20pvw-o-D5uxH

その後、に戻ってArgoCDダッシュボードにログインできます。 localhost:8080 ブラウザでログインし、 admin 自分のパスワードを持つユーザー:

すべてが機能したら、同じクレデンシャルを使用して、コマンドラインからArgoCDにログインできます。 argocd login. これは、後でコマンドラインからデプロイするために必要になります。

  1. argocd login localhost:8080

ここのコマンドラインで同等の証明書の警告が再度表示されるので、次のように入力する必要があります。 y プロンプトが表示されたら続行します。 必要に応じて、次のコマンドを実行して、パスワードをより安全で覚えやすいものに変更できます。 argocd account update-password. その後、完全に機能するArgoCD構成が作成されます。 このチュートリアルの最後のステップでは、これを使用して実際にいくつかのサンプルアプリケーションをデプロイする方法を学習します。

ステップ4—複数のクラスターの処理(オプション)

アプリケーションをデプロイする前に、実際にアプリケーションをデプロイする場所を確認する必要があります。 デフォルトでは、Argo CDは、Argo CD自体が実行されているのと同じクラスターにアプリケーションをデプロイします。これはデモには問題ありませんが、実稼働環境ではおそらく適切ではありません。 現在のマシンで認識されているすべてのクラスターを一覧表示するには、次を使用できます。 kubectl config:

  1. kubectl config get-contexts -o name
Output
test-deploy-cluster test-target-cluster

ArgoCDをにインストールしたと仮定します test-deploy-cluster、そしてそれを使用してアプリケーションをにデプロイしたかった test-target-cluster、登録できます test-target-cluster ArgoCDを実行して argocd cluster add:

  1. 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 たとえば、デフォルトの宛先と名前空間を渡します。

  1. 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:

  1. argocd app get helm-guestbook
Output
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: 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:

  1. argocd app sync helm-guestbook

sync は、GitOpsの原則に沿った、ここでの展開と同義です。ArgoCDを使用する場合の目標は、アプリケーションがアップストリーム構成で常に1:1を追跡することです。

Output
TIMESTAMP 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:

  1. kubectl port-forward svc/helm-guestbook 9090:80

以前と同様に、別の端末でこれを実行することをお勧めします。これは、を押すまでその端末をブロックするためです。 Ctrl+C ポートの転送を停止します。 その後、開くことができます localhost:9090 ブラウザウィンドウで、サンプルのゲストブックアプリを表示します。

このGithubリポジトリにさらにプッシュすると、ArgoCDに自動的に反映され、継続的な可用性を提供しながらデプロイメントが再同期されます。

結論

これで、ArgoCDを使用したアプリケーションのインストールとデプロイの基本について説明しました。 Kubernetesは非常に多くの抽象化レイヤーを必要とするため、デプロイが可能な限り維持可能であることを確認することが重要であり、GitOps哲学は優れたソリューションです。

次に、Kubernetesクラスターの稼働時間、正常性、ログ記録を監視するための TOBS、可観測性スタックのデプロイについて学習することをお勧めします。