亚马逊AWS官方博客

OpenSource | Kube-AWS 更好管理 AWS 上的 Kubernetes 集群

管理 AWS 上的 Kubernetes集群的方式有很多。Kube-AWS 是一个 Kubernetes 孵化器项目,它允许您在 AWS 上创建、更新和部署具有高可扩展性和高可用性的 Kubernetes 集群。它可以与 KMS、Auto Scaling 组、Spot 队列、节点池等多个 AWS 功能无缝集成。完整的项目资料请访问 github.com/kubernetes-incubator/kube-aws,项目创建人 Yusuke Kuoka 撰写的此博文可帮助您很好地了解如何开始使用 kube-aws,以及如何就进一步的问题参与项目。–Arun


Kubernetes 也称为容器编排系统,它帮助以较为自动化的方式管理许多容器。我常常称它为“微服务轨道”,因为它提供了自行构架应用程序管理框架所需的基本元件。(基本元件包括容器、Pod、部署、服务以及各种各样的对象类型以及用户处理这些对象的 API)。Kubernetes 还有许多扩展点以及出色的客户端库,支持主要编程语言。开发和运行许多微服务是一件极具挑战的事情,特别是您的自动化和工具有限时。将 Kubernetes 作为框架,您可以添加 Fluentd、Zipkin 和 Prometheus 等补充工具来创建先进的微服务管理平台。我认为这就是为什么如今 Kubernetes 越来越引人关注的原因。您是否遇到过下面的任何问题?

  • 面向多微服务的快速开发环境:您需要处理依赖多个微服务的微服务,并且每个微服务的开发需要几分钟的预置时间。
  • 分布式跟踪:您需要从多个微服务中找到事务处理速度偶尔很慢的根本原因。
  • 分布式日志记录:您需要通过多个 nginx 反向代理的访问日志来跟踪用户获得,以进行调试。
  • 资源监控:您需要找出为什么系统表现不佳的原因。

两年前,我拼尽全力试图找到解决所有这些问题的金钥匙。我尝试完美契合我的使用案例的 PaaS,最终只是发现当时还没有这种玩意。因此,我开始以 AWS 上的 Kubernetes 为基础,设想我会在它之上逐步建立 PaaS。尽管 Kubernetes 本身并不属于 PaaS,它确实帮助我建立了一个,因为每次发布后它的生态系统和普遍适用性都在提升。Helm、HelmfileBrigade 等项目补充了我的 PaaS 需求,所有这些项目都由使用不同云提供商的贡献者开发。没有 Kubernetes 的普遍多样性,这一切都不会发生。结果是一个名叫 kube-aws 的开放源工具,近两年我一直在维护此工具。我已经在多家公司广泛使用它,用于在 AWS 上预置我自己的 Kubernetes 生产集群,现在它已经在全世界广泛使用,客户包括 Hotels.com、Netquest、Checkr、ChatWork、freee 等等,服务建立在 AWS 上的 Kubernetes 基础上的业务关键应用程序。您可能会想:“现在有许多 Kubernetes 预置工具可用。使用点是什么,更别说维护,这是另一个工具,尤其是已经有一个不错的工具 kops 可用时?” 继续阅读以了解 kube-aws 的不同之处。

那么什么是 kube-aws?

Kube-aws 是一个 Kubernetes 孵化器项目,它是一种在 AWS 上预置生产就绪 Kubernetes 集群的工具。它高度依赖也专长于 CoreOS Container Linux 以及 EC2、KMS、S3、ASG、ELB 和 CloudFormation 等著名的 AWS 托管服务,允许您以高度可自定义的方式在 AWS 上预置高可用性、高可扩展性和高安全性的 Kubernetes 集群。kube-aws 的基本功能包括:多可用区 etcd 集群、Kubernetes 控制面板以及支持可用性的工作线程节点池;支持各类节点的私有和公有子网、适用于 Kubernetes API 终端节点的面向互联网和内部的负载均衡器,以确保安全性。您可以拥有单独的 API 终端节点负载均衡器:一个用于互联网访问,另一个用于 VPC 访问。集群凭证使用 KMS 加密。资源信号用于滚动更新节点,无需停机。kube-aws 的一个关键特点是灵活性:您可以从一个名为“cluster.yaml”的文件自定义集群的许多方面。此外,只要可以用于云配置和 CloudFormation 堆栈模板来表达,您还可以自定义节点和堆栈的所有方面。这意味着:

  • 它是 IAM 友好的:您可以将现有预配置的 AWS 资源重复用于 kube-aws。假设您在一家企业,但您没有创建 IAM 角色的权限,那么 kube-aws 将无法代表您创建角色。在这种情况下,您只需指示 kube-aws 使用管理员事先创建的 IAM 角色即可。VPC、子网、安全组、ELB 等元素也同样如此。kube-aws 还支持 CloudFormation 服务角色,因此您无需使用 IAM 管理员用户角色来运行 kube-aws。
  • 如果您需要向工作线程/控制器/etcd 节点添加许多组织具体的设置和文件,只需向云配置添加代码段即可。以前,这将导致节点预置脚本的复杂化,因为 EC2 用户有 16KB 的大小限制,这将迫使您将节点预置脚本/配置源与实例用户数据分开。kube-aws 通过自动将用户数据放入 S3 存储桶解决了这一问题。
  • 同样,如果您需要添加与 Kubernetes 集群相关的自定义设置和额外的 AWS 资源,您可能会陷入 CloudFormation 中的堆栈模板 51200 字节大小限制。同样,kube-aws 通过自动将堆栈模板放入 S3 存储桶解决了这一问题。

kube-aws 不一定是解决所有问题的答案;您始终应确定它是否适合您的需求。但它消除了预置具有高可靠性、高扩展性和高安全性的 Kubernetes 集群的许多杂事。它在您的主要需求不仅仅是运行 Kubernetes 集群时特别有用。我自己的主要工作是负责现场可靠性工程和开发人员工作效率。Kube-aws 帮助我完成下列工作,从而让我可以将精力集中在更复杂的工作内容上:

  • 预置 Kubernetes 集群。
  • 更新 Kubernetes 集群,包括添加/删除/更新节点和负载均衡器、安全组、IAM 策略等。
  • 跨团队共享集群配置。

开始使用 kube-aws

详细的入门指南请参见 kube-aws 文档网站。它归结为运行如下命令:

console
 kube-aws init \

--cluster-name=quick-start-k8 \

--region=us-west-1 \

--availability-zone=us-west-1a \

--hosted-zone-id=ZBN159WIK8JJD \

--external-dns-name=quick-start-k8s.mycompany.com \

--key-name=ec2-key-pair-name \

--kms-key-arn="arn:aws:kms:us-west-1:123456789012:key/c4f79cb0-f9fb-434a-ac3c-47c5697d51e6"

--s3-uri=s3://kube-aws-assets/
 kube-aws render credentials --generate-ca

kube-aws render stack
 kube-aws validate
 kube-aws up

下面来看每个命令的工作机制:

  • kube-aws init 生成“cluster.yaml”文件。它定义了 Kubernetes 集群可能包含的所有内容。您可以定义的内容包括:是否使用现有的 VPC/子网/路由表/互联网网关/NAT 网关、etcd 和控制器节点的数量、节点池的数量和大小、是否启用 GPU、apiserver 和 kubelet 旗标、sysetmd 配置等等。
  • kube-aws render credentials 生成运行 K8S 系统组件所需的若干 TLS 资产。
  • kube-aws render stack 生成若干云配置和堆栈模板。
  • kube-aws validate 运行对集群配置的 lint 检查。
  • kube-aws up 通过调用到 CloudFormation 从而启动整个集群。

在 kube-aws 启动后,根据 cluster.yaml 中定义的集群大小,您甚至可以使用 Ctrl-C,然后来一点咖啡,休息十分钟左右。CloudFormation 会创建多个堆栈,每个堆栈都包含一组用于 etcd、Kubernetes 控制面板和节点池的 AWS 资源。您可以来查看“kube-aws init”使用的示例 cluster.yaml 模板。

关于 kube-aws 灵活性的说明

有高级使用案例和要求的用户可能需要修改生成的堆栈模板和云配置。您不需要处理 golang 和重建 kube-aws,只需对标准的 kube-aws 配置做些轻微调整即可。如要自定义集群配置,您可以作出 CoreOS 定制云配置和 CloudFormation 堆栈模板允许的任何修改。只需注意这将导致您的集群升级未来发布的 kube-aws 版本难度增加。如果您需要自定义,我鼓励您在 GitHub 问题中提出功能请求,在 Kubernetes Slack 的 #kube-aws 频道提出问题,从而让我们可以共同确定如何解决您的问题。

上线生产前的建议

不同使用案例的生产集群是不一样的。我建议检查专门的 GitHub 问题以获取有关生产质量部署的建议,了解有关您自己的生产集群的宜忌参考。我的个人选择包括:

如果您要对堆栈模板和/或云配置作出巨大更改,请使用 Git 对您的集群资产进行版本控制 非常欢迎您分享您的选择和经验,以及您可能提出的任何问题和功能请求!

未来的工作

kube-aws 专门针对 AWS 用户设计。当然,在 AWS EKS 最近推出期待已久的托管 Kubernetes 服务后,我们的应对是计划增加提供适用于 kube-aws 的一流 EKS 服务。EKS 集成的可能面貌是:EKS 管理 Kubernetes 控制面板,后者由 etcd 和控制器节点组成。所有 etcd 成员以及 apiserver 和控制器管理器等 Kubernetes 系统组件都在 EKS 管理的节点上运行,而 kube-aws 仅管理工作线程节点池。与 etcd 和控制器节点相比,工作线程节点在要求上的差异往往更大,例如审核、日志记录、网络安全性以及 IAM 权限等,因为它们运行面向用户的容器。由于 EKS 的原因,集成将确保您的 Kubernetes 运行成本保持最低,同时利用 kube-aws 管理的工作线程节点保持最大灵活性。Kubernetes 工具有很多,研究最合适特定使用案例的工具对用户而言非常耗时。我在考虑是否要将 kube-aws 与一个或多个其他预置工具整合,以创造更好的用户体验。虽然我还没有具体的计划,我期待在未来做成这件事。Kubernetes 集群 API 将是一个很好的起点。不断调整,— 甚至更好!— 与我们合作,告诉我们您对这一集成的需要和期望!


Yusuke Kuoka 是 K.K. 的软件开发工程师,引领高可用性、高可扩展性和高安全性的微服务开发人员平台和基础设施的设计与开发。他负责维护多个 OSS 项目,包括 kube-AWS、Brigade、Helmfile 和 Habitus,他认为这些项目对解决在 AWS 上的 Kubernetes 集群中运行生产工作负载时遇到的真实世界问题非常重要。