![日本雅虎如何在 OpenStack 上大规模构建和运行 Kubernetes](https://static001.infoq.cn/resource/image/2e/80/2e4a328faac004a5e9b197f3177bc680.jpg)
编者注:
今天的帖子是由日本雅虎的基础设施工程团队撰写,内容是他们如何在 Kubernetes 上运行 OpenStack。这篇帖子是由日本雅虎的工程博客编译而来。
简介:
这篇帖子大致描述了日本雅虎在 Google 和 Solinea 的帮助下,创建了一个自动工具链,在 OpenStack 基础设施平台上,帮助实现“一键”部署代码到 Kubernetes。
文章也基本涵盖了安全,网络,存储,性能等方面,确保产品已经就绪。
文章的最后也讨论了用于创建 CI/CD 管道的生态系统工具,在 VM 或者是裸机上面,Kubernetes 作为一个部署平台如何部署,以及描述了 Kubernetes 架构概览,帮助创建、部署你自己的集群。
前言
2012 年,我们公司开始使用 OpenStack,很快,我们的内部环境改变了。我们最初的目标是将硬件虚拟化,OpenStack 帮助我们实现了这个目标。但是,随着云技术和容器技术的发展,我们的平台需要更多的功能——比如,能够发布服务到不同的平台。这篇帖子会举出一些例子——将应用程序运行到 OpenStack 上,并且输出到 Kubernetes 上。
代码生命周期
项目的目标是为平台创建镜像(从单个应用程序代码),并且部署这些镜像到每个平台上。比如,当代码库、裸机镜像、Docker 容器,CI 工具创建的虚拟镜像里面的代码发生改变的时候,那就 push 到我们的镜像库,然后再部署到每个基础设施平台。
![](https://static001.infoq.cn/resource/image/62/56/62d001c837fb7195d72401e13c4e7f56.png)
我们会在我们的 CICD 管道使用以下产品:
![](https://static001.infoq.cn/resource/image/d6/e7/d630a0f84946368b09b6fdd735f9cde7.png)
镜像创建。每个镜像创建的工作已经展示在以下图表中。
VM 镜像创建
![](https://static001.infoq.cn/resource/image/2a/d5/2a234edd1d3b3e94e3f1390fb9169fd5.jpg)
1.push 代码到 Github
2.hook 到 Jenkins master
3.在 Jenkins slave 发布 Job
4.检查 Packer 库
5.运行 Service Job
6.用 build 脚本运行 Packer
7.Packer 为 OpenStack Glance 启动 VM
8.配置 VM,并且安装需要的应用
9.创建 snapshot 和 register 到 glance
10.从 Glance 下载新创建的镜像
11.上传镜像到 Artifactory
裸机镜像创建
![](https://static001.infoq.cn/resource/image/c3/37/c3f6c7fc7c5187f11821bbcd1b513537.jpg)
1.push 代码到 Github
2.hook 到 Jenkins master
3.在 Jenkins slave 发布 Job
4.检查 Packer 库
5.运行 Service Job
6.下载 build 脚本创建的 base 裸机
7.用 Packer 创建脚本执行 diskimage-builder,一起创建裸机镜像
8.上传新创建的镜像到 Glance
9.上传镜像到 Artifactory
容器镜像创建
![](https://static001.infoq.cn/resource/image/e0/dd/e0827c19e1e754bd754b036c70bddedd.jpg)
1.push 代码到 Github
2.hook 到 Jenkins master
3.在 Jenkins slave 发布 Job
4.检查 Dockerfile 库
5.运行 Service Job
6.从 Artifactory 下载基础 Docker 镜像
7.如果在 Artifactory 找不到 Docker 镜像,那就从 Docker Hub 下载
8.执行 Docker build,并且创建镜像
9.上传镜像到 Artifactory
平台架构
现在让我们重点关注一下容器是如何工作的,梳理一遍我们使用 Kubernetes 作为部署平台的流程。这个平台的架构如下图所示。
![](https://static001.infoq.cn/resource/image/9a/7e/9a3611a5fa18c9067cf5aca6efdfdb7e.jpg)
![](https://static001.infoq.cn/resource/image/db/40/db7c90e5ccea3ff08d5e59ab11c56040.jpg)
为了使用 Container Host(OpenStack 实例),我们利用 CentOS,安装 Docker,Kubernetes,Calico,etcd 等等。当然,Kubernetes 上可以运行各种各样的容器。事实上,OpenStack 可以像容器一样运行在 Kubernetes 上。也就是,在 OpenStack 的 Kubernetes 上运行 OpenStack。我们目前有 30 多个 OpenStack 集群,所以管理和操作起来都挺困难。这样的情况下,我们想要创建一个简单的、基于 OpenStack 的集群,为 Kubernetes 提供所需的基础功能,并且使我们的 OpenStack 环境易于管理。
Kubernetes 架构
现在来更详尽地解释一下 Kubernetes 架构。架构图如下所示:
![](https://static001.infoq.cn/resource/image/e2/27/e240bccfcbc7a4f4db2e9d74adcdef27.jpg)
![](https://static001.infoq.cn/resource/image/4c/16/4c4def693d9eb448dc2d5db0e8f55916.jpg)
租户隔离
为了启用多租户使用,比如 OpenStack,我们利用 OpenStack Keystone 来进行验证和授权。
验证
有了 Kubernetes 插件,OpenStack Keystone 可以被用来验证。通过在 Kubernetes API 服务器上添加 Keystone 的 authURL,我们可以使用 OpenStack OS_USERNAME 和 OS_PASSWORD 这些(变量)来验证。
授权
我们目前使用的是 Kubernetes 授权的 ABAC(Attribute-Based Access Control)模式。我们跟咨询公司 Solinea 合作,他们帮忙创建了一个实用工具来转换 OpenStack 的 Keystone 用户和租户信息,将它们转移到 Kubernetes JSON 策略文件,这个文件可以映射 Kubernetes ABAC 用户和 namespace 信息到 OpenStack 租户。当发布 Kubernetes API Service 的时候,我们就指定策略文件。这个实用工具也从租户信息创建 namespace。
这些配置启用 Kubernetes 来验证,以及 OpenStack Keystone,在授权的 namespace 中操作。
数据卷和持久性数据
Kubernetes 提供持久性数据卷子系统,为 Pods 作为持久性存储运行。“持久性数据卷”能够支持云提供商存储,利用 OpenStack 的 cinder-volume,使用 OpenStack 作为云提供商。
网络
Flannel 和各种不同的网络项目在 Kubernetes 中以网络模型的形式存在,为此,我们曾经使用过 Calico 项目。日本雅虎推荐用 L3 网络(比如 redistributeARP 有效值或者 IP CLOS 网络),IP CLOS 网络或者 Calico 项目创建数据中心,以此来跟这个方向相匹配。
当我们申请像 Flannel 这样的覆盖网络时,我们没有获得 Kubernetes 集群外部访问 Pod IP 的权限。但是 Calico 项目做到了。我们也为负载均衡器使用 Calico 项目,这个我们之后会讲。
![](https://static001.infoq.cn/resource/image/7d/f1/7de40fea670ed258b4d1f6507c3936f1.jpg)
在 Calico 项目中,通过 BGP 运行在 BIRD 容器(OSS 路由软件)上,来 broadcasting 产品 IP。通过在容器化的 BIRD 上(BIRD 为一款 OSS 路由软件)运行 BGP,从而进行广播同步 IP 信息。默认设置下,它只会在集群内广播。我们通过在集群外设置对等路由器,它使得访问集群外部成为可能。
外部 Service 负载均衡器
Kubernetes 的外部 service 负载均衡器有很多选择(从集群外部访问 service),比如 NodePort,LoadBalance 和 Ingress。我们找不到可以准确匹配我们需求的解决方案。但是,我们发现了一个匹配我们需求的解决方案,就是通过 broadcasting 集群 IP 实现,这个集群 IP 是用于内部 service 负载均衡器(从集群内部访问服务),以及 Callico BGP 项目,从 Layer4 的集群外部启用了外部负载均衡器。
![](https://static001.infoq.cn/resource/image/c1/1a/c125197cd4dedd9498d13730d8a8c01a.jpg)
服务发现
通过 Sky DNS 插件,在 Kubernetes 实现服务发现也是可能的。作为集群内部服务,它在集群中类似于 ClusterIP 一样可访问。通过 BGP 来 broadcasting ClusterIP,从集群外部命名解决工作。
Kubernetes 和镜像创建工作的联合,我们创建了以下工具链,使 push、部署代码变得容易。
![](https://static001.infoq.cn/resource/image/71/a4/71312d6928bfc857d1742e9551397da4.jpg)
总结
总而言之,通过将镜像创建和 Kubernetes 结合,日本雅虎在 Google 和 Solinea 的帮助下,成功地创建了自动工具链,使得在多租户,authn/authz,存储,网络,服务和服务发现这些过程,从代码的 push 到部署这整个过程都变得容易。
我们希望你找到关于生态系统工具的讨论,这些工具用于创建 CI/CD 管道, Kubernetes 作为在 VM 或者裸机上的部署平台,Kubernetes 架构整体概览就是为了帮助你构造部署你自己的集群。
本文转载自才云 Caicloud 公众号。
原文链接:https://mp.weixin.qq.com/s/ZeMorSmDrhHQTZKlstS2YA
评论