こんにちは、テクマトリックスの酒井です。

前回までの記事ではローカル環境に Kubernetes クラスターとコンテナの CI 環境を構築しました。 CI 環境でコンテナをビルドすることはできましたが、コンテナを実行するには実行環境へデプロイすることが必要です。そこで今回は、 Argo CD というツールを利用して、ローカル環境でコンテナを Kubernetes クラスターにデプロイする仕組みを作ってみます。

Argo CD とは?

Argo CD のトップページには次のように記載されています。

Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes. 

Argo Project Authors, https://argo-cd.readthedocs.io/en/stable/, 最終確認日 2023/07/14.

上記を Google 翻訳で翻訳したのが次の文です。

Argo CD は、Kubernetes 用の宣言型 GitOps 継続的配信ツールです。

Google 翻訳

説明に出てくる「GitOps」とは、最初は Weaveworks 社のブログで紹介された方法ですが、現在では日本語でも多数説明されています。例えば RedHat のサイトでは次のように説明されています。

GitOps は、Git リポジトリを信頼できる唯一の情報源として使用し、インフラストラクチャをコードとして提供します。登録されたコードは CI プロセスをチェックし、CD プロセスではセキュリティやコードとしてのインフラストラクチャ (IaC、Infrastructure as Code)、またはアプリケーションフレームワークに設定される境界線に関する要件がチェックし、適用します。コードの変更はすべて追跡されるため、アップデートが容易になると同時に、ロールバックが必要な場合のバージョン管理も可能です。

RedHat, https://www.redhat.com/ja/topics/devops/what-is-gitops, 最終確認日 2023/07/14.

Argo CD を利用すると GitOps を容易に実現できるのですが、実現の核となる、コードを適用してコンテナを Kubernetes にデプロイする方法を簡単にご説明します。

コンテナを Kubernetes にデプロイする方法

Argo CD を利用する前に、コンテナを Kubernetes にデプロイする方法をおさらいしておきます。

基本のデプロイ方法は、 Kubernetes CLI (kubectl コマンド) を使うことです。 Kubernetes のチュートリアルでは、最初のアプリケーションをデプロイするために次のコマンドを実行します。

kubectl create deployment kubernetes-bootcamp--image=gcr.io/google-samples/kubernetes-bootcamp:v1

このコマンドでポッドが作成されコンテナが実行されますが、アプリケーションとして利用するためにはこれだけでは通常は不十分で、ポッドのような Workload リソースの他にも、 Service リソースや Config and Storage リソースなど多くのリソースを作成する必要があります。リソースごとに kubectl コマンドを一つずつ実行する代わりに、マニフェストと呼ばれる Kubernetes リソースの仕様を YAML または JSON ファイルで宣言しておき、次のようなコマンドを実行することで、多数のリソースを一度に作成することができます。

kubectl apply -f マニフェストファイル [-f マニフェストファイル [...]]

リソースの仕様はアプリケーションの構成やデプロイ先の環境などによっても変わります。典型的な例としては、デプロイするデータベースサーバーとして MySQL と PostgreSQL を選択したり、テスト環境と本番環境で URL を変更するといったことが挙げられます。このようなニーズに応える仕組みとして Kustomize や Helm などがあります。

Argo CD は、デプロイするアプリケーションごとに、 Git などのリポジトリからマニフェストファイル・ Kustomization ファイル・ Helm チャートなどを取得し、 Kustomize や Helm と同じ方法でカスタマイズされたマニフェストを生成し、マニフェストを Kubernetes クラスターに適用します。結果として、人がマニフェストファイル・ Kustomization ファイル・ Helm チャートなどをソースコードリポジトリに登録し、何らかの方法で Argo CD でデプロイを実行すると、コンテナが Kubernetes クラスターにデプロイされます。

GitOps の説明に立ち戻ると、マニフェストファイル・ Kustomization ファイル・ Helm チャートなどが「コード」に相当し、 Argo CD は継続的デリバリー (CD) プロセスを担当するツールであると言えます。

構成

それでは環境を作っていきます。今回も Windows 10 上の Hyper-V VM に Kubernetes クラスターを作成します。そしてこのクラスターに Argo CD をデプロイした後、この Argo CD を利用して、同じクラスターに Gitea をデプロイします。

環境の作成と Gitea のデプロイまでの手順は、概ね Argo CD の Getting Started に従っています。

なお Kubernetes クラスターに関して、前回の記事で作成した Kubernetes クラスターを利用しても良かったのですが、仮想マシンのハードウェアリソースが不足しそうなため新規に作成することにしました。

準備

Windows 10 に構築に必要なツールである Chocolatey, Minikube, Kubernetes CLI (kubectl), Argo CD CLI をインストールします。 Chocolatey, Minikube, Kubernetes CLI のインストールについては、以前の記事をご参照ください。 Argo CD CLI のインストールは、 Windows Powershell を管理者として実行し、次のコマンドを実行します。

choco install argocd-cli

インストールを確認するため、 argocd version --client を実行します。 Argo CD が正常にインストールされていれば以下のように出力されます。

argocd: v2.7.7+4650bb2
  BuildDate: 2023-07-05T20:02:35Z
  GitCommit: 4650bb2817c3c81405f40cf77e93ef2b5fb275fb
  GitTreeState: clean
  GoVersion: go1.19.10
  Compiler: gc
  Platform: windows/amd64

Kubernetes クラスターの作成

Minikube を利用してローカル PC 上に VM と Kubernetes クラスターを作成します。作成と同時に Nginx イングレスコントローラーも有効にします。 Windows Powershell で次のコマンドを実行します。

minikube start --driver hyperv --addons ingress

クラスターの作成が完了したら、 minikube ip コマンドを実行して、出力された VM の IP アドレスを控えておきます。

Argo CD のインストール

Argo CD の Getting Started に従ってインストールします。またイングレスを作成して Argo CD のウェブ UI にアクセス可能にします。先程と同じく Windows Powershell で次のコマンドを実行します。

# 名前空間を作成
kubectl create namespace argocd

# Argo CD をインストール
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

# Argo CD のドメイン名
$ArgoCDDomain = "cd.$(minikube ip).nip.io"

# イングレスを作成
@"
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argocd-server-ingress
  namespace: argocd
  annotations:
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  ingressClassName: "nginx"
  rules:
  - host: ${ArgoCDDomain}
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: argocd-server
            port:
              name: https
"@ | kubectl apply -f -

# 初期パスワードを取得
argocd admin initial-password -n argocd

# ログイン
argocd login $ArgoCDDomain --insecure
# Username に admin 、 Password に初期パスワードを入力

# パスワードを更新
argocd account update-password
# 初期パスワードと、新しいパスワードを2回入力

# Argo CD の URL を表示
"https://${ArgoCDDomain}/"

コマンドの実行の最後に表示された URL をブラウザで開きます。セキュリティリスクの警告が表示された場合は「危険性を承知で開く」などを選択します。するとログイン画面が表示されます。 Username に admin 、 Password にパスワードを入力してログインすると、アプリケーションの一覧画面が表示されます。

最初のログイン直後の画面

これで Argo CD のセットアップは完了です!

Argo CD を使ったアプリケーションのデプロイ

では早速 Argo CD を使って Kubernetes クラスターに Gitea をデプロイします。 Gitea のデプロイにはマニフェストファイルなどを作成するのではなく、 Gitea のドキュメントに記載の Helm チャートを利用することとします。

最初に、 Argo CD に「アプリケーション」を作成します。 Argo CD の画面上部にある + NEW APP ボタンをクリックします。するとダイアログが表示されるので、以下の内容を設定していきます。記載のない項目は変更しません。

  • GENERAL
    • Application Name : gitea
    • Project Name : default
  • SYNC POLICY : Automatic
  • SYNC OPTIONS
    • AUTO-CREATE NAMESPACE : オン
  • SOURCE
    • Repository URL : https://dl.gitea.io/charts/
      • 入力後、右側のドロップダウンリストから HELM を選択
    • Chart : gitea
      • Version (Chartの右) : 8.3.0
  • DESTINATION
    • Cluster URL : https://kubernetes.default.svc (Minikube で作成したクラスター)
    • Namespace : gitea
  • HELM
    • VALUES : 以下のとおり。ただし ${IPADDR} は VM の IP アドレスに置き換えます。
ingress:
  enabled: true
  className: nginx
  hosts:
    - host: git.${IPADDR}.nip.io
      paths:
        - path: /
          pathType: Prefix
アプリケーションの作成ダイアログ
アプリケーションの作成ダイアログの Helm の設定部分

HELM の設定に関して、最初は PARAMETERS 以下に個々の値を設定していたのですが、 ingress.hosts[0].host の値を設定するとイングレスのマニフェストが期待通りに作成されなかったため、回避策としてすべてのパラメーターを VALUES に記載するようにしました。

作成ダイアログへの入力後、ダイアログ上部の CREATE ボタンをクリックすると、 Argo CD に gitea アプリケーションが追加されます。 gitea アプリケーションのステータスは MissingOutOfSync, Syncing となってデプロイが開始されます。もう少し待つとデプロイが完了し、ステータスが Healthy, Synced となりました。

アプリケーションの設定とデプロイされたリソースが同期した状態

アプリケーションのカードをクリックすると詳細が表示されます。作成されたリソースがツリー状に表示されるのが分かりやすいです。

アプリケーションの詳細

最後に、ブラウザで https://git.${IPADDR}.nip.io/ (${IPADDR} は VM の IP アドレスに置き換えます)にアクセスすると、 Gitea のトップページが表示されます。

これで無事 Argo CD を使って Gitea をデプロイできました!

感想とまとめ

ローカル環境の Kubernetes クラスターに Argo CD をインストールして、アプリケーションとして Gitea をデプロイする方法をご紹介しました。 Argo CD のウェブ UI が分かりやすく、簡単に利用できそうという印象を受けました。しかし依然として Kubernetes のマニフェストや Helm チャートなどの知識は必要だと思います。

今回作成した環境を利用して、次回は Gitea のリポジトリに Kubernetes のマニフェストファイルをプッシュすると、アプリケーションが Kubernetes クラスターにデプロイされる、という GitOps を試してみたいと思います。

By tsakai

Jenkins関連のサービスやCloudBees製品を主に担当しています。 Certified CloudBees Jenkins Engineer (CCJE) および CloudBees CI DevOps Associate です。