🛣️

EKSでArgoCDとGrafanaを共有ALBでまとめて運用した

に公開

結論:How To?

not75743さんの記事をみて、要点を把握しました。
https://zenn.dev/not75743/scraps/f86690bba45a5d

group.namegroup.orderを入れる。not75743さんの記事をみて自分も設定できました。ありがとうございます!

はじめに

HelmでArgoCDやらGrafanaやらJaegerを立てる時、毎回Ingress作るのはめんどくさい。ALBも複数立つとコストもかかる。今回は、共有Ingressを作成し、複数 namespace にまたがる Deployment を1つのALBにまとめて設定した方法について、覚え書きとして共有します。また、その作業中に遭遇したトラブルもあわせて記録します。

前提条件

以下の要件を前提としています:

  • EKSクラスター動作中
  • AWS Load Balancer Controllerが導入済み
  • Route53でドメイン管理
  • ACMでSSL証明書作成済み

普通にEKS使ってたらだいたい揃ってそう。また、今回はhelmを使用しました。
Prometheus × Grafana:https://prometheus-community.github.io/helm-charts/
ArgoCD:ArgoCD-Helm

アーキテクチャのポンチ図

ALBの共有ってこんな感じ↓

ArgoCDもGrafanaも、それぞれでIngressやALB Controller Annotationを記載するのですが、ALB Controllerによって、実態としてできるALBは一つになる。といった形です。

設定方法

1. 基本的なALB設定

まず、両方のサービスで共通して使う設定を決めます。今回はHTTPSでの接続が要件にある為、listen-portsなどの値を設定しています。

annotations:
  # 同じALBグループに属するよう設定
  alb.ingress.kubernetes.io/group.name: admin
  
  # HTTPS(443)ポートでリッスン
  alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}]'
  
  # SSL証明書ARN
  alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-northeast-1:XXXXXXXXXXXX:certificate/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
  
  # インターネット向けALB
  alb.ingress.kubernetes.io/scheme: internet-facing
  
  # IPターゲットモード
  alb.ingress.kubernetes.io/target-type: ip
  
  # セキュリティグループ
  alb.ingress.kubernetes.io/security-groups: eks-sg-alb, k8s-traffic-cluster-xxxxxxxxxx

# IngressClass
ingressClassName: alb

2. ArgoCDの設定

ArgoCDはこんな感じで設定します:

# ArgoCD values.yaml
server:
  ingress:
    enabled: true
    controller: aws
    ingressClassName: alb
    
    annotations:
      alb.ingress.kubernetes.io/group.name: admin
      alb.ingress.kubernetes.io/group.order: "1"  # 優先順位設定
      alb.ingress.kubernetes.io/backend-protocol: HTTP
      alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}]'
      alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-northeast-1:XXXXXXXXXXXX:certificate/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
      alb.ingress.kubernetes.io/scheme: internet-facing
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/healthcheck-path: /healthz
      alb.ingress.kubernetes.io/healthcheck-port: "8080"
      alb.ingress.kubernetes.io/security-groups: eks-sg-alb, k8s-traffic-cluster-xxxxxxxxxx
    
    hostname: "argocd.example.com"
    path: /
    pathType: Prefix
    tls: false

3. Grafanaの設定

Grafanaも似たような感じですが、少し違います:

# Grafana values.yaml(kube-prometheus-stack)
grafana:
  ingress:
    enabled: true
    ingressClassName: alb
    
    annotations:
      alb.ingress.kubernetes.io/group.name: admin
      alb.ingress.kubernetes.io/group.order: "2"  # ArgoCDより低い優先順位
      alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}]'
      alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-northeast-1:XXXXXXXXXXXX:certificate/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
      alb.ingress.kubernetes.io/scheme: internet-facing
      alb.ingress.kubernetes.io/security-groups: eks-sg-alb, k8s-traffic-cluster-xxxxxxxxxx
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/backend-protocol: HTTP
      alb.ingress.kubernetes.io/healthcheck-path: /api/health
      alb.ingress.kubernetes.io/healthcheck-port: "3000"
    
    hosts:
      - grafana.example.com
    path: /
    tls: []

設定で気をつけるポイント

1. group.nameで同じALBを共有

alb.ingress.kubernetes.io/group.name: admin

これが一番重要!同じ名前にすることで、複数のIngressが1つのALBを使い回せます。

2. group.orderで優先順位を決める

# ArgoCD
alb.ingress.kubernetes.io/group.order: "1"

# Grafana  
alb.ingress.kubernetes.io/group.order: "2"

数字が小さいほど優先度高め。ルールの評価順序を制御できます。LBのリソースマップを見ると、ルールが変化していることがわかります。

3. ヘルスチェックはサービスごとに調整

# ArgoCD
alb.ingress.kubernetes.io/healthcheck-path: /healthz
alb.ingress.kubernetes.io/healthcheck-port: "8080"

# Grafana
alb.ingress.kubernetes.io/healthcheck-path: /api/health
alb.ingress.kubernetes.io/healthcheck-port: "3000"

それぞれのサービスに合ったヘルスチェックを設定しないと、うまく動きません。

4. セキュリティグループの設定

alb.ingress.kubernetes.io/security-groups: eks-sg-alb, k8s-traffic-cluster-xxxxxxxxxx

ALBからEKSノードへの通信を許可するセキュリティグループを忘れずに。特に、ALBのアウトバウンドを適切に設定しないとEKSまで届かなくなったことがありました。

注意点

やらかしがちなミス

group.nameを変更すると、既存のALBが削除されて新しいALBが作成されます。

# 変更前
alb.ingress.kubernetes.io/group.name: admin

# 変更後
alb.ingress.kubernetes.io/group.name: production  # ← これで新しいALBができる

Route53のレコード更新を行わないと、ずっと前のALBへ名前解決されてしまうので、気を付けましょう!また、切り替え時に一時的にサービスが使えなくなるのでメンテナンス時間が必要な場合もありそうです。

まとめ

何を変更すると何が変わるのか?、が分かっていないと、意外なところが影響しあってわけわからんくなります。この記事がトラブルシューティングの参考になれば幸いです。

参考資料

Discussion