EKSでArgoCDとGrafanaを共有ALBでまとめて運用した
結論:How To?
not75743さんの記事をみて、要点を把握しました。
group.name
、group.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