今天的帖子是由日本雅虎的基础设施工程团队撰写,内容是他们如何在 Kubernetes 上运行 OpenStack。这篇帖子是由日本雅虎的工程博客编译而来。
简介:
这篇帖子大致描述了日本雅虎在 Google 和 Solinea 的帮助下,创建了一个自动工具链,在 OpenStack 基础设施平台上,帮助实现“一键”部署代码到 Kubernetes。
文章也基本涵盖了安全,网络,存储,性能等方面,确保产品已经就绪。
文章的最后也讨论了用于创建 CI/CD 管道的生态系统工具,在 VM 或者是裸机上面,Kubernetes 作为一个部署平台如何部署,以及描述了 Kubernetes 架构概览,帮助创建、部署你自己的集群。
前言
2012年,我们公司开始使用 OpenStack,很快,我们的内部环境改变了。我们最初的目标是将硬件虚拟化,OpenStack 帮助我们实现了这个目标。但是,随着云技术和容器技术的发展,我们的平台需要更多的功能——比如,能够发布服务到不同的平台。这篇帖子会举出一些例子——将应用程序运行到 OpenStack 上,并且输出到 Kubernetes 上。
代码生命周期
项目的目标是为平台创建镜像(从单个应用程序代码),并且部署这些镜像到每个平台上。比如,当代码库、裸机镜像、Docker 容器,CI 工具创建的虚拟镜像里面的代码发生改变的时候,那就 push 到我们的镜像库,然后再部署到每个基础设施平台。
我们会在我们的 CICD 管道使用以下产品:
镜像创建。每个镜像创建的工作已经展示在以下图表中。
VM 镜像创建
-
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
-
裸机镜像创建
-
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
-
上传镜像到 Artifactory
-
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 作为部署平台的流程。这个平台的架构如下图所示。
为了使用 Container Host(OpenStack 实例),我们利用 CentOS,安装 Docker,Kubernetes,Calico,etcd 等等。当然,Kubernetes 上可以运行各种各样的容器。事实上,OpenStack 可以像容器一样运行在 Kubernetes 上。也就是,在 OpenStack 的 Kubernetes 上运行 OpenStack。我们目前有30多个 OpenStack 集群,所以管理和操作起来都挺困难。这样的情况下,我们想要创建一个简单的、基于 OpenStack 的集群,为 Kubernetes 提供所需的基础功能,并且使我们的 OpenStack 环境易于管理。
Kubernetes 架构
现在来更详尽地解释一下 Kubernetes 架构。架构图如下所示:
租户隔离
为了启用多租户使用,比如 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 项目,这个我们之后会讲。
在 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 的集群外部启用了外部负载均衡器。
服务发现
通过 Sky DNS 插件,在 Kubernetes 实现服务发现也是可能的。作为集群内部服务,它在集群中类似于 ClusterIP 一样可访问。通过 BGP 来 broadcasting ClusterIP,从集群外部命名解决工作。
Kubernetes 和镜像创建工作的联合,我们创建了以下工具链,使 push、部署代码变得容易。
总结
总而言之,通过将镜像创建和 Kubernetes 结合,日本雅虎在 Google 和 Solinea 的帮助下,成功地创建了自动工具链,使得在多租户,authn/authz,存储,网络,服务和服务发现这些过程,从代码的 push 到部署这整个过程都变得容易。
我们希望你找到关于生态系统工具的讨论,这些工具用于创建 CI/CD 管道, Kubernetes 作为在 VM 或者裸机上的部署平台,Kubernetes 架构整体概览就是为了帮助你构造部署你自己的集群。
文章由才云科技翻译,如若转载,必须注明转载自“才云科技”。