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 Moroz

Alex Morozは、高可用性でスケーラブルなクラウドDNS WebサービスであるAmazon Route 53のプロダクトマネージャです。 彼はサービスディスカバリーとマイクロサービスベースのアーキテクチャに関連するトピックにフォーカスしています。前職のCAでは、AlexはモバイルAPIゲートウェイの製品を率いていました。また開発者が安全なモバイルとIoTアプリケーションをより速く構築するのに役立つSDKのオープンソース化を行いました。

 

日本語翻訳はSA福井厚が担当しました。原文は下記にあります。
https://aws.amazon.com/blogs/opensource/unified-service-discovery-ecs-kubernetes/