見出し画像

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

argo-cdのUI

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

argo-rollouts UI

k8sのアップデート戦略がローリングアップデートであるのに対し、Blue/GreenデプロイメントやCanaryリリースなどの機能を追加する。Deploymentによく似た形式のRolloutというCRDを作成することで、バージョンの差をもったPodのデプロイをコントロールする。kubectl argo rolloutというcli pluginや、Web UI上でRolloutを操作する。

argocd-image-updater

k8sのワークロードと共にデプロイされたコンテナイメージに対し、コンテナレジストリをポーリングすることで新しいバージョンの有無を確認し、設定された戦略に従ってイメージを自動的に更新する。

aws-appmesh-controller

【AWS Black Belt Online Seminar】AWS App Mesh

envoyなどのプロキシが各サービスの前段にたって通信を処理することで、リトライ処理やサーキットブレーカーなど、マイクロサービス間通信で考慮されるべき機能を提供する。
プロキシはコントロールプレーンと呼ばれる中央司令塔からアプリケーションのサイドカーのコンテナとして注入される(個別の設定はannotationなどを通じて設定する)。ネットワークは透過的に作用するため、アプリケーションの言語などに依存しない。
istioという代表的なツールがあるが、FargateのPodに対応していない
appmesh-controllerが提供するCRDをデプロイすることによってAWS App Meshのリソースをコントロールする。

aws-load-balancer-controller


How AWS Load Balancer controller works

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

Grafana Stats Overview

Prometheus(Metrics)、Jaeger(Trace)、Loki(Logs)などをデータソースとしたテレメトリーデータの可視化ツール。APMダッシュボードとしての機能をもち、OSS版のNewRelicやDatadog的な立ち位置。NewRelicのコストが高いこともあって、我々のプロジェクトでは並行的にGrafanaも検討している。
デモ環境で雰囲気を掴むことができる。(trace系のデータソースはないかも?)

jaeger

jaeger-query(UI)

Traceの収集、可視化ツール。分散されたアプリケーションに跨るリクエストにおける、全体/部分的な消費時間に加えてクエリ、パラメータなどの付加情報を知ることができる。

kubernetes-dashboard

Kubernetes Dashboard(UI)

k8sリソースの可視化ツール。

nri-bundle

New Relicのテレメトリデータ収集ツールのバンドル版。デフォルトではnewrelic-infrastructurenri-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. オブザーバビリティのためのテレメトリーデータ収集/可視化
といった感じの分類になるかと思います。調査段階など、利用が明確に定まっていないものもありますが、今後も色々と試してみたいと思います。

(開発部・松原浩平)