11 月 19 - 20 日 Apache Pulsar 社区年度盛会来啦,立即报名! 了解详情
写点什么

日本雅虎如何在 OpenStack 上大规模构建和运行 Kubernetes

  • 2020-03-09
  • 本文字数:2704 字

    阅读完需:约 9 分钟

日本雅虎如何在 OpenStack 上大规模构建和运行 Kubernetes

编者注:

今天的帖子是由日本雅虎的基础设施工程团队撰写,内容是他们如何在 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


9.上传镜像到 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 架构整体概览就是为了帮助你构造部署你自己的集群。


本文转载自才云 Caicloud 公众号。


原文链接:https://mp.weixin.qq.com/s/ZeMorSmDrhHQTZKlstS2YA


2020-03-09 17:53349

评论

发布
暂无评论
发现更多内容

马化腾:腾讯探索社会价值与商业价值共融的路径

博文视点Broadview

龙蜥开发者说:一人行快,众人行远!在龙蜥社区的日子,我想说这些 | 第 12 期

OpenAnolis小助手

Linux 开源 合作 龙蜥开发者说 红旗

零基础参加java培训机构有用吗

小谷哥

技术分享 | 测试平台开发-前端开发之Vue.js 框架

测吧(北京)科技有限公司

测试

干货|app自动化测试之设备交互API详解

测吧(北京)科技有限公司

测试

技术分享 | Spring Boot 集成 Swagger

测吧(北京)科技有限公司

测试

不会武功的程序员不是一个好厨子!那么问题来了,如何成为一个优秀的程序员?

雨果

程序员

Jeff Dean:机器学习在硬件设计中的潜力

OneFlow

人工智能 机器学习 深度学习 芯片开发

Java 14 令人期待的 5 大新特性,打包工具终于要来了

小小怪下士

Java 编程 程序员 架构

2022年史上最全Java面试题:数据结构+算法+JVM+线程+finalize+GC

小小怪下士

Java JVM java面试 秋招编程 算法结构

干货|app自动化测试之Capability 使用进阶

测吧(北京)科技有限公司

测试

技术分享 | Spring Boot 异常处理

测吧(北京)科技有限公司

测试

前端培训机构如何选择比较好

小谷哥

大数据培训班如何选择

小谷哥

数据持久化技术(Python)的使用

测吧(北京)科技有限公司

测试

ONES 参与《软件研发效能权威指南》编写

万事ONES

将生活的热情放进1平米工位中|ONES 人物特别策划

万事ONES

java培训学员需要注意什么呢

小谷哥

什么是容灾和备份?

源字节1号

微信小程序 软件开发 前端开发 后端开发

技术分享 | 测试平台开发-前端开发之Vue.js 框架的使用

测吧(北京)科技有限公司

测试

干货|app自动化测试之Appium问题分析及定位

测吧(北京)科技有限公司

测试

干货|移动端App自动化之触屏操作自动化

测吧(北京)科技有限公司

测试

java开发培训课程应该注意什么

小谷哥

日本雅虎如何在 OpenStack 上大规模构建和运行 Kubernetes_文化 & 方法_才云科技_InfoQ精选文章