Amazon Web Services ブログ
Amazon ECSとKubernetesの統合サービスディスカバリー
本日(訳注:2018年5月31日)から、Amazon Elastic Container Service(Amazon ECS)およびKubernetesによって管理されるサービスの統合サービスディスカバリーを活用することができます。私たちは最近、Amazon Route 53 Auto Naming(オートネーミング)APIを使用してサービス名のレジストリを作成および管理することにより、コンテナ化されたサービスの発見と相互接続を容易にするECSサービスディスカバリーを導入しました。サービス名は、一連のDNSレコードセットに自動的にマップされます。これにより、コード内でサービスを名前(backend.example.comなど)で参照可能となり、実行時にサービスのエンドポイントを名前で解決するためのDNSクエリを記述することができます。
私たちは、Kubernetesユーザーにもオートネーミング APIが活用できるようにするため、オートネーミング APIをKubernetesもサポートするように拡張しました。この統合によって、オートネーミング APIによって管理されるサービスレジストリにKubernetesのサービスとイングレスを自動的に複製できるようになりました。 Kubernetesクラスタの外部にあるクライアントから、フレンドリーなサービス名を使用してこれらのサービスエンドポイントを簡単に解決できます。この統合を可能にするために、私たちはKubernetesインキュベータープロジェクトであるExternal DNSにコントリビュートしました。
これにより、Amazon ECSで実行されるサービスから、Route 53へのシンプルなDNSクエリを作成することで、Kubernetesで動作するサービスを発見して接続することができます。
オートネーミングとは何か?
オートネーミングAPIは、DNSレコードの管理およびRoute 53とサードパーティの両方でヘルスチェックを管理するための代替のアプローチです。 オートネーミングは、DNSプロトコルの技術的詳細を抽象化し、すべてのサービスエンドポイントの管理を容易にするサービスレジストリを提供します。シンプルなDNSコールを行うことでサービスを発見することができ、オートネーミングは利用可能なエンドポイントの場所を返します。
オートネーミングの主なAPIは次のとおりです:
- CreatePublicDNSNamespace – パブリックなRoute 53ホストゾーンを作成します。このゾーンは、たとえばAWS SDKやオートネーミングAPIを使用してプログラムからのみ管理できます(現在、ルート53コンソールは、ホストゾーンとレコードを表示する場合にのみオートネーミングをサポートします)。
- CreatePrivateDNSNamespace – 指定したVPC内で使用可能なプライベートRoute 53ホストゾーンを作成します。ホストゾーンはプログラムでのみ管理できます。
- CreateService – 名前空間に新しいサービスを作成します。サービスはDNSとヘルスチェックの設定を定義します。
- RegisterInstance – 特定のインスタンスをサービスに登録し、対応するDNSレコードとオプションのヘルスチェックを作成します。
- DeregisterInstace – インスタンス登録を削除し、関連するDNSレコードとオプションのヘルスチェックを削除します。
オートネーミングAPIの詳細については、Amazon Route 53 APIリファレンスを参照してください。
Kubernetesクラスタで動作するアプリケーションでオートネーミングの利用を開始する方法を見てみましょう。
ステップ 1: IAMパーミッションの設定
オートネーミングをKubernetesで使用するには、ユーザーは「AmazonRoute53AutoNamingFullAccess」IAMポリシーに要約されている権限を持っている必要があります。 次のAWS CLIの例では、external-dnsという名前の新しいユーザーを作成し、必要なアクセス許可を付与します。
$ aws iam create-group --group-name external-dns
$ aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonRoute53AutoNamingFullAccess --group-name external-dns
$ aws iam create-user --user-name external-dns
$ aws iam add-user-to-group --user-name external-dns --group-name external-dns
AWS CLIの詳細については、「AWSコマンドラインインターフェイスユーザーガイド」を参照してください。
ステップ 2: 名前空間のセットアップ
サービスディスカバリーの使用を開始するには、AWS CLIを使用してDNS名前空間を作成します。 名前空間は、選択によってパブリックか、またはバーチャルプライベートクラウド(VPC)内から検出できる論理的なサービスグループです。 また、ECSサービスディスカバリーを使用して作成した既存のDNS名前空間を使用することもできます。
名前空間を作成する:
$ aws servicediscovery create-private-dns-namespace --name "external-dns-test.internal" –vpc “your-vpc-id”
名前空間が作成されたか確認するか、既存の名前空間を検索する:
$ aws servicediscovery list-namespaces
ステップ 3: ExternalDNSの展開
ExternalDNSは公開されたKubernetesサービスとイングレスをRoute 53などのDNSプロバイダと同期させます。 これによりKubernetesリソースを介してDNSレコードを動的に制御することができます。
ExternalDNSをテストしたいクラスタに `kubectl`クライアントを接続してください。 次に、次のYAMLマニフェストファイル “nginx-deployment.yaml”を適用してExternalDNSをデプロイします。
apiVersion: v1
kind: Service
metadata:
name: nginx
annotations:
external-dns.alpha.kubernetes.io/hostname: nginx.external-dns-test.internal
spec:
type: LoadBalancer
ports:
- port: 80
name: http
targetPort: 80
selector:
app: nginx
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx
spec:
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
name: http
ExternalDNSを展開するには、次のマニフェストを適用します。
$ kubectl apply -f nginx-deployment.yaml
1分後、サービスに関連するDNSレコードがホストゾーンで作成されたことを確認します。 この目的のためにAmazon Route53コンソールを使用することができます。 VPC内からnginxサービスを直接接続することもできます:
nginx.external-dns-test.internal
KubernetesとAmazon ECSを共に利用開始する
Amazon ECSクラスタとKubernetesクラスタで実行されているアプリケーションは、example.comなどの同じ名前空間を共有し、DNSクエリを使用して互いを検出できます。 どちらのクラスタで作成された新しいサービスもすべて同じ名前空間で自動的に利用できるようになり、Kubernetesで実行されるコンポーネントを追加することで、Amazon ECSで実行されているアプリケーションをシームレスに拡張できます。
開始するには、サービスを実行しているKubernetesのExternalDNSコネクタの最新バージョンを、Amazon ECSで動作しているサービスのためのECSサービスディスカバリーと共に展開します。 詳細については、ドキュメントを参照してください。
Alexandr MorozAlex Morozは、高可用性でスケーラブルなクラウドDNS WebサービスであるAmazon Route 53のプロダクトマネージャです。 彼はサービスディスカバリーとマイクロサービスベースのアーキテクチャに関連するトピックにフォーカスしています。前職のCAでは、AlexはモバイルAPIゲートウェイの製品を率いていました。また開発者が安全なモバイルとIoTアプリケーションをより速く構築するのに役立つSDKのオープンソース化を行いました。 |
日本語翻訳はSA福井厚が担当しました。原文は下記にあります。
https://thinkwithwp.com/blogs/opensource/unified-service-discovery-ecs-kubernetes/