GKE での Argo CD の構築
クラウドエースの北野です。
概要
Google Kubernetes Engine (以降 GKE と呼びます。) 上に以下の構成で Argo CD を構築する方法を紹介します。
ロードバランサの設定に Gateway を使い、証明書に Google Cloud の Certificate Manager を使って構築します。また、Argo CD のデプロイには Kustomize を使います。
Argo CD をデプロイする マニフェストは以下の通りです。
apiVersion: v1
kind: Namespace
metadata:
name: argocd
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
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>
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
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
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 ネットワークを作成します。
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 クラスタを作成します。
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 のドメインを登録します。
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 を登録します。
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 を作成します。
apiVersion: v1
kind: Namespace
metadata:
name: argocd
次に Gateway を使い アプリケーションロードバランサーを作成します。このとき、先に作成した Certificate Manager の Certificate Map 名を <CERTIFICATE_MANAGER_MAP_NAME>
に代入し、IP アドレス名を <IP_ADDRESS_NAME>
に代入します。
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>
に代入します。
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 を作成します。
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
に定義します。
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cmd-params-cm
data:
server.insecure: "true"
上記の manifest および Argo CD をインストールする kustomization.yaml
を以下の様に定義します。
今回、スタンダードな Argo CD クラスタを使い Argo CD を構築します。インストールするバージョンは stable
となっています。特定のバージョンに固定したり、高可容なクラスタを構築する場合、要件に当ったインストールマニフェストを指定してください。
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 の導入を検討してみてください。
Discussion