亚马逊AWS官方博客

OpenSource | 开始将 Kubernetes 和 Amazon ECS 结合使用

将服务发现功能用于 ECS 和 Route 53

从今天开始,您将可以对 Amazon Elastic Container Service (Amazon ECS) 和 Kubernetes 管理的服务使用统一的服务发现功能。我们最近推出了 ECS 服务发现功能,它使用 Amazon Route 53 Auto Naming (Auto Naming) API 创建和管理服务名称注册表,从而方便发现容器化的服务以及相互建立连接。服务名称会自动映射到一组 DNS 记录。这样您可以在代码中使用名称来引用服务(例如 backend.example.com),编写将在运行时解析到该名称,并进而解析到该服务的终端节点的 DNS 查询。我们希望也让 Kubernetes 用户享受 Auto Naming API 的优势,从而使对 Auto Naming API 的支持延及 Kubernetes。借助这种集成,您可以方便地自动复制 Kubernetes 服务并导入 Auto Naming API 管理的服务注册表。Kubernetes 集群之外的客户端现在可以轻松地使用友好的服务名称解析这些服务终端节点。如要启用此集成,我们向 Kubernetes 孵化器项目 External DNS 作出了贡献。现在,在 Amazon ECS 中运行的服务可以通过向 Route 53 发送简单的 DNS 查询,发现并与在 Kubernetes 中运行的服务连接。

什么是 Auto Naming?

Auto Naming API 是管理 DNS 记录以及 Route 53 和第三方运行状况检查的替代方法。Auto Naming 会提取 DNS 协议的详细技术信息并建立一个服务注册表,通过该注册表方便地管理您的所有服务终端节点。您可以通过简单的 DNS 调用发现您的服务,然后 Auto Naming 会返回运行正常 终端节点的位置。Auto Naming 中的主要 API 包括:

  • CreatePublicDNSNamespace — 创建只能以编程方式管理的公有 Route 53 托管区域,例如使用 AWS SDK 开发工具包或 Auto Naming API 管理(Route 53 控制台目前支持仅支持 Auto Naming 查看托管区域和记录。)
  • CreatePrivateDNSNamespace — 创建可在您指定的 VPC 内访问的私有 Route 53 托管区域;托管区域只能以编程方式访问
  • CreateService — 在命名空间中创建新的服务;该服务定义了 DNS 和运行状况检查设置
  • RegisterInstance — 将特定实例注册到服务,并创建对应的 DNS 记录以及可选的运行状况检查
  • DeregisterInstace — 删除实例注册,并删除相关 DNS 记录以及可选的运行状况检查

如需了解更多关于 Auto Naming API 的信息,请参阅 Amazon Route 53 API 参考。下面来看如何开始将 Auto Naming 用于在 Kubernetes 集群中运行的应用程序。

第 1 步:设置 IAM 权限

如要将 Auto Naming 用于 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 命名空间。命名空间是可以公开发现或从您选择的 Virtual Private Cloud (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 会使用 Route 53 等 DNS 提供商同步暴露的 Kubernetes 服务和 Ingress。从而让您可以通过 Kubernetes 资源动态控制 DNS 记录。将“kubectl”客户端连接到您希望测试 ExternalDNS 的集群。然后执行如下的 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

一分钟后,请确认服务对应的 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 服务发现功能。更多信息请参阅文档