EKS環境で使っているサードパーティ製モジュールを紹介する
こんにちは。開発部の松原です。今回は私が業務で使っているEKS(Amazon Elastic Kubernetes Service)について、EKS上で動作しているサードパーティ製のモジュールを紹介します。(アルファベット順)
.
├── apps
├── argo-cd
├── argo-rollouts
├── argocd-image-updater
├── aws-appmesh-controller
├── aws-load-balancer-controller
├── cert-manager
├── external-dns
├── external-secrets
├── grafana
├── jaeger
├── kubernetes-dashboard
├── nri-bundle
└── opentelemetry-operator
argo-cd
GitHubなどのリポジトリのソースの状態と、k8sのリソースの状態の差分を検知し、自動/手動でk8sにリソースをデプロイするためのCI/CDツール。ApplicationというCRDを作成し、リソースのパスとブランチを紐づけることで、k8sリソースのCI/CDを実現する。初期設定では180秒間隔でポーリングを行うが、追加で設定を行うことで、GitHubからWebhookを受け取ることも可能。
初回の導入以降はArgoCD自身でArgoCDのデプロイを管理することも可能。KustomizeやHelm Chartなどのデプロイに対応しており、我々のプロジェクトではサードパーティ製のモジュールはほぼHelmのdependenciesとして入れている。argocd-example-apps にwordpressの例があり、values.yamlに設定を書くことで部分的に上書きしてくれる。設定可能な値はartifacthub.ioで確認することが出来る。
argo-rollouts
k8sのアップデート戦略がローリングアップデートであるのに対し、Blue/GreenデプロイメントやCanaryリリースなどの機能を追加する。Deploymentによく似た形式のRolloutというCRDを作成することで、バージョンの差をもったPodのデプロイをコントロールする。kubectl argo rolloutというcli pluginや、Web UI上でRolloutを操作する。
argocd-image-updater
k8sのワークロードと共にデプロイされたコンテナイメージに対し、コンテナレジストリをポーリングすることで新しいバージョンの有無を確認し、設定された戦略に従ってイメージを自動的に更新する。
aws-appmesh-controller
envoyなどのプロキシが各サービスの前段にたって通信を処理することで、リトライ処理やサーキットブレーカーなど、マイクロサービス間通信で考慮されるべき機能を提供する。
プロキシはコントロールプレーンと呼ばれる中央司令塔からアプリケーションのサイドカーのコンテナとして注入される(個別の設定はannotationなどを通じて設定する)。ネットワークは透過的に作用するため、アプリケーションの言語などに依存しない。
istioという代表的なツールがあるが、FargateのPodに対応していない。
appmesh-controllerが提供するCRDをデプロイすることによってAWS App Meshのリソースをコントロールする。
aws-load-balancer-controller
Ingress/Serviceのk8sリソースを作成し、aws-load-balancer-controllerのannotationを設定することでALB/NLBとk8sのServiceを紐付け、k8s外部からのアクセスを可能にする。外部公開されるサービスの他、各ツール類が提供しているUI(ArgoCD、Kubernetes Dashboard、Grafanaなど)についてもIngressを作成する。登録済みのSecurityGroupやAWS Certificate Managerの証明書などの連携も可能。
cert-manager
k8sで利用する証明書を管理する。aws-load-balancer-controllerでは導入手順中にcert-managerのインストールがあるが、webhookのTLS通信における証明書の発行に使われるため、別途証明書を用意すればcert-managerはなくてもよい。(AWS Certificate Managerへの証明書リクエストなどの操作はaws-load-balancer-controllerからaws-sdk-goを通じて行われる)
https://github.com/kubernetes-sigs/aws-load-balancer-controller/issues/2015
external-dns
k8sリソース(Ingress/Serviceなど)を読み取り、外部DNS(AWS Route53やGoogle Cloud DNSなど)に設定を反映する。
external-secrets
外部のシークレット管理サービス(AWS Secret Manager、HashiCorp Vault、 Google Secrets Managerなど)からAPIキーやパスワードといった機密データを取得し、k8sのSecretを生成する。
grafana
Prometheus(Metrics)、Jaeger(Trace)、Loki(Logs)などをデータソースとしたテレメトリーデータの可視化ツール。APMダッシュボードとしての機能をもち、OSS版のNewRelicやDatadog的な立ち位置。NewRelicのコストが高いこともあって、我々のプロジェクトでは並行的にGrafanaも検討している。
デモ環境で雰囲気を掴むことができる。(trace系のデータソースはないかも?)
jaeger
Traceの収集、可視化ツール。分散されたアプリケーションに跨るリクエストにおける、全体/部分的な消費時間に加えてクエリ、パラメータなどの付加情報を知ることができる。
kubernetes-dashboard
k8sリソースの可視化ツール。
nri-bundle
New Relicのテレメトリデータ収集ツールのバンドル版。デフォルトではnewrelic-infrastructure、nri-metadata-injectionしか入らないため、helmのvaluesに設定することでオプトインしていく。あくまでNewRelic用のデータ収集用のモジュールであり、UIは付属しない。
opentelemetry-operator
OpenTelemetry Collectorをサイドカー又はDamonSetとして注入するためのコントローラー。アプリケーションからのテレメトリーデータを受信し、NewRelicやJaegerなどに送信する。こちらもUIは付属しない
その他
ubuntu: ネットワーク関連のデバッグ用
nginx: プライベートサブネットのOpenSearch Dashboardへのプロキシ用
最後に
EKSで現在使っているモジュールの紹介でした。ArgoCD + Helm Chartのデプロイに慣れてくると、これらのサードパーティ製モジュールをさくっと入れるようになると思います。
今回紹介したモジュールの役割としては、
1. k8sのリソース管理(特にデプロイ周り)
2. CRDの作成やannotaionを用いたクラウドリソース管理
3. オブザーバビリティのためのテレメトリーデータ収集/可視化
といった感じの分類になるかと思います。調査段階など、利用が明確に定まっていないものもありますが、今後も色々と試してみたいと思います。
(開発部・松原浩平)