Zenn
🐙

GKE での Argo CD の構築

2025/02/25に公開
3

クラウドエースの北野です。

概要

Google Kubernetes Engine (以降 GKE と呼びます。) 上に以下の構成で Argo CD を構築する方法を紹介します。

ロードバランサの設定に Gateway を使い、証明書に Google Cloud の Certificate Manager を使って構築します。また、Argo CD のデプロイには Kustomize を使います。

Argo CD をデプロイする マニフェストは以下の通りです。

namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: argocd
kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: argocd
resources:
  - gateway.yaml
  - httproute.yaml
  - health-check-policy.yaml
  - https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/ha/install.yaml

patches:
  - path: configmap.yaml
gateway.yaml
kind: Gateway
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
  name: external-http
  annotations:
    networking.gke.io/certmap: <CERTIFICATE MANAGER NAME>
spec:
  gatewayClassName: gke-l7-global-external-managed
  listeners:
    - name: https
      protocol: HTTPS
      port: 443
  addresses:
    - type: NamedAddress
      value: <EXTERNAL_IP ADDRESS NAME>
httproute.yaml
kind: HTTPRoute
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
  name: argocd
  labels:
    gateway: external-http
spec:
  parentRefs:
    - name: external-http
  hostnames:
    - <ARGOCD DOMAIN>
  rules:
    - backendRefs:
        - name: argocd-server
          port: 80
health-check-policy.yaml
apiVersion: networking.gke.io/v1
kind: HealthCheckPolicy
metadata:
  name: argocd-hc
spec:
  default:
    checkIntervalSec: 15
    timeoutSec: 15
    healthyThreshold: 1
    unhealthyThreshold: 2
    config:
      type: HTTP
      httpHealthCheck:
        port: 8080
        requestPath: /healthz
  targetRef:
    group: ""
    kind: Service
    name: argocd-server
configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cmd-params-cm
data:
  server.insecure: "true"

はじめに

Argo CD は Kubernetes のリソースを継続的にデプロイする OSS です。 マニフェストを管理しているリポジトリと連携すると、自動的にマニフェストを適用できたりするため、Kubernetes で簡単に GitOps を実現できます。

しかし、Argo CD は OSS であるため、利用者がシステムを構築する必要があります。公式のドキュメントには、Kubernetes 上に構築する方法が説明されていますが、ロードバランサの設定には Ingress を使う方法のみ紹介されています。

そこで、本記事では、GKE 上に Argo CD を構築し、ロードバランサの設定に Gateway を使う方法を紹介します。

システム設計

以下のようなシステムの構成で Argo CD を構築します。

GKE 上に Argo CD をデプロイします。Gateway を使い Cloud Load Balancing を作成しインターネットからアクセスできるようにします。また、Certificate Manager を使ってマネージドのサーバー証明書を作成して通信を暗号化させます。
この記事で公開する DNS ドメインは、Google Cloud の Cloud DNS で管理しているものとします。

構築

Google Cloud のリソースを作成し、その後に GKE 上に Argo CD を構築します。コード内の <> で囲まれた値は、環境に合わせて書き替えてください。

Google Cloud のリソース作成

以下のリソースを Google Cloud 上に Terraform を使い作成します。

  • VPC ネットワーク
  • GKE クラスタ
  • IP アドレス
  • Cloud DNS
  • Certificate Manager

GKE クラスタの作成

まず、GKE クラスタを構築する VPC ネットワークを作成します。

vpc_network.tf
resource "google_compute_network" "main" {
  name = "<VPC_NETWORK_NAME>"

  project                 = var.project
  auto_create_subnetworks = false
}

resource "google_compute_subnetwork" "main" {
  name = "<SUBNETWORK_NAME>"

  project       = var.project
  region        = "asia-northeast1"
  network       = google_compute_network.main.self_link
  ip_cidr_range = "192.168.0.0/24"
}

作成した VPC ネットワークに GKE クラスタを作成します。今回、Autopilot の GKE クラスタを作成します。

gke.tf
resource "google_container_cluster" "main" {
  name = "<GKE_CLUSTER_NAME>"

  project          = var.project
  location         = "asia-northeast1"
  enable_autopilot = true
  network          = google_compute_network.main.id
  subnetwork       = google_compute_subnetwork.main.id
}

Argo CD のドメイン登録

IP アドレスを取得し、Cloud DNS に Argo CD のドメインを登録します。

cloud_dns.tf
resource "google_compute_global_address" "main" {
  name = "<IP_ADDRESS_NAME>"

  project      = var.project
  address_type = "EXTERNAL"
}

resource "google_dns_managed_zone" "main" {
  name        = "<PUBLIC_DOMAIN_NAME>"
  
  project    = var.project
  visibility = "public"
  dns_name   = "<PUBLIC_DOMAIN>"
}

resource "google_dns_record_set" "argocd_a_record" {
  name = "<ARGOCD_DOMAIN>"

  project      = var.project
  managed_zone = google_dns_managed_zone.main.name
  type         = "A"
  rrdatas      = [
    google_compute_global_address.main.address
  ]
}

Certificate Manager の作成

Argo CD に使うサーバー証明書を作成します。Certificate Manager の Google マネージド証明書を使って、サーバーの証明書を作成します。
また、マネージド証明書の作成には、DNS 認証を用いるので、先の Cloud DNS のマネージドゾーンに Certificate Manager で生成された CNAME を登録します。

certificate_manager.tf
resource "google_certificate_manager_certificate_map" "main" {
  name = "<CERTIFICATE_MANAGER_MAP_NAME>"

  project = var.project
}

resource "google_certificate_manager_certificate_map_entry" "main" {
  name = "<CERTIFICATE_MANAGER_MAP_ENTRY_NAME>"

  project = var.project
  map     = google_certificate_manager_certificate_map.main.name
  matcher = "PRIMARY"
  certificates = [
    google_certificate_manager_certificate.main.id
  ]
}

resource "google_certificate_manager_dns_authorization" "main" {
  name = "<CERTIFICATE_MANAGER_DNS_AUTH_NAME>"

  project = var.project
  domain  = "<ARGOCD_DOMAIN>"
}

resource "google_certificate_manager_certificate" "main" {
  name = "<CERTIFICATE_MANAGER_CERTIFICATE_NAME>"

  project = var.project
  managed {
    domains = [
      google_certificate_manager_dns_authorization.main.domain
    ]
    dns_authorizations = [
      google_certificate_manager_dns_authorization.main.id
    ]
  }
}

resource "google_dns_record_set" "argocd_cname_record" {
  name = google_certificate_manager_dns_authorization.main.dns_resource_record[0].name

  project      = var.project
  managed_zone = google_dns_managed_zone.main.name
  type         = google_certificate_manager_dns_authorization.main.dns_resource_record[0].type
  rrdatas      = [
    google_certificate_manager_dns_authorization.main.dns_resource_record[0].data
  ]
}

しばらくすると、作成した Certificate Manager の証明書が以下の様に承認されます。

Argo CD の構築

次に GKE 上に Argo CD を構築します。以下のリソースをマニフェストで定義します。

  • Namespace
  • Gateway
  • HttpRoute
  • HealthCheckPolicy
  • ConfigMap

Argo CD のリソース群は、Argo CD が公開しているインストーラーを使い、必要なリソース群をインストールします。
まず、Argo CD を argocd の Namespace 上に作成するので、初めに Namespace を作成します。

namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: argocd

次に Gateway を使い アプリケーションロードバランサーを作成します。このとき、先に作成した Certificate Manager の Certificate Map 名を <CERTIFICATE_MANAGER_MAP_NAME> に代入し、IP アドレス名を <IP_ADDRESS_NAME> に代入します。

gateway.yaml
kind: Gateway
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
  name: external-http
  annotations:
    networking.gke.io/certmap: <CERTIFICATE_MANAGER_MAP_NAME>
spec:
  gatewayClassName: gke-l7-global-external-managed
  listeners:
    - name: https
      protocol: HTTPS
      port: 443
  addresses:
    - type: NamedAddress
      value: <IP_ADDRESS_NAME>

HTTPRoute に Cloud DNS に登録した Argo CD のドメインを <ARGOCD_DOMAIN> に代入します。

httproute.yaml
kind: HTTPRoute
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
  name: argocd
  labels:
    gateway: external-http
spec:
  parentRefs:
    - name: external-http
  hostnames:
    - <ARGOCD_DOMAIN>
  rules:
    - backendRefs:
        - name: argocd-server
          port: 80

Google Cloud の Cloud Load Balancing が 8080 ポートの /halthz パスにヘルスチェックをするように HealthCheckPolicy を作成します。

health-check-policy.yaml
apiVersion: networking.gke.io/v1
kind: HealthCheckPolicy
metadata:
  name: argocd-hc
spec:
  default:
    checkIntervalSec: 15
    timeoutSec: 15
    healthyThreshold: 1
    unhealthyThreshold: 2
    config:
      type: HTTP
      httpHealthCheck:
        port: 8080
        requestPath: /healthz
  targetRef:
    group: ""
    kind: Service
    name: argocd-server

また、Google Cloud の Cloud Load Balancing で暗号化した通信を復号するため、暗号化せずに Kubernetes 内で通信してもエラーにならないように server.insecure の設定を argocd-cm-params-cm に定義します。

configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cmd-params-cm
data:
  server.insecure: "true"

上記の manifest および Argo CD をインストールする kustomization.yaml を以下の様に定義します。
今回、スタンダードな Argo CD クラスタを使い Argo CD を構築します。インストールするバージョンは stable となっています。特定のバージョンに固定したり、高可容なクラスタを構築する場合、要件に当ったインストールマニフェストを指定してください。

kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: argocd
resources:
  - gateway.yaml
  - httproute.yaml
  - health-check-policy.yaml
  - https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

patches:
  - path: configmap.yaml

以下の コマンドで紹介したマニフェストを適用して Argo CD を構築します。

kubectl apply -f namespace.yaml
kustomize -b | kubectl apply -f -

暫くすると Argo CD の pod が立ち上がるので、登録したドメインにアクセスすると以下の様なログイン画面が表示されます。

以下のコマンドで admin ユーザーのパスワードを取得し、ログインするとログインできます。

kubectl -n argocd get secrets argocd-initial-admin-secret -ojsonpath={.data.password} | base64 -d

さいごに

Kubernetes の Gateway 機能を使いインターネットからアクセスできる Argo CD を GKE 上に構築する方法を紹介しました。Cloud Armor などによるアクセス制御を組み合わせると、セキュアな GitOps 環境の実現が可能になります。GKE を活用されている方は、運用に Argo CD の導入を検討してみてください。

3

Discussion

ログインするとコメントできます