本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
我们如何在 Yahoo! JAPAN 规模化地在 OpenStack 上架构和运行 Kubernetes
编者按:今天的帖子来自 Yahoo! JAPAN 的基础设施工程团队,他们将讲述如何在 Kubernetes 上运行 OpenStack。这篇帖子经过许可,已进行翻译和编辑以适应语境——最初发布于 Yahoo! JAPAN 工程博客。
引言
这篇帖子概述了 Yahoo! JAPAN 如何在 Google 和 Solinea 的帮助下,构建一个自动化工具链,实现“一键式”代码部署到运行在 OpenStack 上的 Kubernetes。
我们还将介绍基本的安全性、网络、存储和性能需求,以确保生产就绪。
最后,我们将讨论用于构建 CI/CD 管道的生态系统工具、Kubernetes 作为虚拟机/裸机上的部署平台,以及 Kubernetes 架构的概述,以帮助您架构和部署自己的集群。
前言
自我们公司于 2012 年开始使用 OpenStack 以来,我们的内部环境快速变化。我们最初的硬件虚拟化目标已通过 OpenStack 实现。然而,随着云计算和容器技术的发展,我们需要在各种平台上启动服务的能力。这篇帖子将提供我们将运行在 OpenStack 上的应用程序移植到 Kubernetes 的示例。
编码生命周期
该项目的目标是从一个应用程序代码为所有必需平台创建镜像,并将这些镜像部署到每个平台。例如,当代码在代码注册中心更改时,CI(持续集成)工具会创建裸机镜像、Docker 容器和虚拟机镜像,将其推送到我们的镜像注册中心,然后部署到每个基础设施平台。
我们在 CI/CD 管道中使用了以下产品
功能 | 产品 |
---|---|
代码注册中心 | GitHub Enterprise |
CI 工具 | Jenkins |
镜像注册中心 | Artifactory |
缺陷跟踪系统 | JIRA |
部署裸机平台 | OpenStack Ironic |
部署虚拟机平台 | OpenStack |
部署容器平台 | Kubernetes |
镜像创建。每个镜像创建工作流程如下图所示。
虚拟机镜像创建 :
- 1. 推送代码到 GitHub
- 2. 挂接到 Jenkins master
- 3. 在 Jenkins slave 上启动任务
- 4. 检出 Packer 仓库
- 5. 运行服务任务
- 6. 通过构建脚本执行 Packer
- 7. Packer 为 OpenStack Glance 启动虚拟机
- 8. 配置虚拟机并安装所需应用程序
- 9. 创建快照并注册到 Glance 10.10. 从 Glance 下载新创建的镜像 11.11. 将镜像上传到 Artifactory
裸机镜像创建
- 1. 推送代码到 GitHub
- 2. 挂接到 Jenkins master
- 3. 在 Jenkins slave 上启动任务
- 4. 检出 Packer 仓库
- 5. 运行服务任务
- 6. 通过构建脚本下载基础裸机镜像
- 7. 构建脚本使用 Packer 执行 diskimage-builder 以创建裸机镜像
- 8. 上传新创建的镜像到 Glance
- 9. 上传镜像到 Artifactory
容器镜像创建
- 1. 推送代码到 GitHub
- 2. 挂接到 Jenkins master
- 3. 在 Jenkins slave 上启动任务
- 4. 检出 Dockerfile 仓库
- 5. 运行服务任务
- 6. 从 Artifactory 下载基础 Docker 镜像
- 7. 如果 Artifactory 中没有找到 Docker 镜像,则从 Docker Hub 下载
- 8. 执行 Docker 构建并创建镜像
- 9. 上传镜像到 Artifactory
平台架构。
让我们关注容器工作流程,详细说明我们如何使用 Kubernetes 作为部署平台。该平台架构如下所示。
功能 | 产品 |
---|---|
基础设施服务 | OpenStack |
容器主机 | CentOS |
容器集群管理器 | Kubernetes |
容器网络 | Project Calico |
容器引擎 | Docker |
容器注册中心 | Artifactory |
服务注册中心 | etcd |
源代码管理 | GitHub Enterprise |
CI 工具 | Jenkins |
基础设施供应 | Terraform |
日志记录 | Fluentd、Elasticsearch、Kibana |
指标 | Heapster、Influxdb、Grafana |
服务监控 | Prometheus |
我们使用 CentOS 作为容器主机(OpenStack 实例),并安装 Docker、Kubernetes、Calico、etcd 等。当然,可以在 Kubernetes 上运行各种容器应用程序。实际上,我们将 OpenStack 作为其中一个应用程序运行。没错,就是 Kubernetes 上的 OpenStack 运行在 OpenStack 上。我们目前拥有超过 30 个 OpenStack 集群,这很快就变得难以管理和操作。因此,我们希望创建一个简单的基础 OpenStack 集群,为 Kubernetes 提供所需的基本功能,并使我们的 OpenStack 环境更易于管理。
Kubernetes 架构
让我更详细地解释 Kubernetes 架构。架构图如下。
|产品 |描述 | |OpenStack Keystone|Kubernetes 身份验证和授权 | |OpenStack Cinder |Pod 使用的外部卷(多个容器的组合) | |kube-apiserver |通过 REST API 配置和验证 Pod 或服务等对象(容器中服务访问的定义)| |kube-scheduler |将 Pod 分配给每个节点 | |kube-controller-manager |执行状态管理,管理复制控制器 | |kubelet |作为代理在每个节点上运行并管理 Pod | |calico |使用 BGP 实现 Pod 间连接 | |kube-proxy |配置 iptable NAT 表以配置 IP 和负载均衡 (ClusterIP) | |etcd |分布式 KVS 存储 Kubernetes 和 Calico 信息 | |etcd-proxy |在每个节点上运行并将客户端请求传输到 etcd 集群|
租户隔离 为实现像 OpenStack 这样的多租户使用,我们利用 OpenStack Keystone 进行身份验证和授权。
身份验证 借助 Kubernetes 插件,OpenStack Keystone 可用于身份验证。通过在启动 Kubernetes API 服务器时添加 Keystone 的 authURL,我们可以使用 OpenStack OS_USERNAME 和 OS_PASSWORD 进行身份验证。 授权 我们目前使用 Kubernetes 授权的 ABAC(基于属性的访问控制)模式。我们与咨询公司 Solinea 合作,他们帮助创建了一个实用程序,将 OpenStack Keystone 用户和租户信息转换为 Kubernetes JSON 策略文件,该文件将 Kubernetes ABAC 用户和命名空间信息映射到 OpenStack 租户。然后,我们在启动 Kubernetes API 服务器时指定该策略文件。此实用程序还会根据租户信息创建命名空间。这些配置使 Kubernetes 能够使用 OpenStack Keystone 进行身份验证,并在授权的命名空间中操作。 卷和数据持久性 Kubernetes 提供“持久卷”子系统,作为 Pod 的持久存储。“持久卷”能够支持云提供商存储,通过使用 OpenStack 作为云提供商,可以利用 OpenStack cinder-volume。 网络 Flannel 和各种网络作为 Kubernetes 的网络模型存在,我们在这个项目中使用了 Project Calico。Yahoo! JAPAN 建议使用纯 L3 网络构建数据中心,例如重新分发 ARP 验证或 IP CLOS 网络,Project Calico 符合这一方向。当我们应用 Flannel 等叠加模型时,无法从 Kubernetes 集群外部访问 Pod IP。但 Project Calico 使其成为可能。我们还使用 Project Calico 进行我们稍后描述的负载均衡。
在 Project Calico 中,通过在 Kubernetes 的每个节点上启动的 BIRD 容器 (OSS 路由软件) 上运行的 BGP 广播生产 IP。默认情况下,它只在集群内广播。通过设置集群外部的对等路由器,可以从集群外部访问 Pod。 外部服务负载均衡
Kubernetes 有多种外部服务负载均衡器(从集群外部访问服务)可供选择,例如 NodePort、LoadBalancer 和 Ingress。我们没有找到完全符合我们要求的解决方案。然而,我们找到了一个几乎符合我们要求的解决方案,即通过 Project Calico BGP 广播用于内部服务负载均衡(从集群内部访问服务)的 Cluster IP,从而实现集群外部的第 4 层外部负载均衡。
服务发现
通过使用 SkyDNS 附加组件,Kubernetes 可以实现服务发现。这作为集群内部服务提供,可以在集群内部像 ClusterIP 一样访问。通过 BGP 广播 ClusterIP,可以从集群外部进行名称解析。通过镜像创建工作流程和 Kubernetes 的结合,我们构建了以下工具链,使代码推送和部署变得简单。
总结
总而言之,通过结合镜像创建工作流程和 Kubernetes,Yahoo! JAPAN 在 Google 和 Solinea 的帮助下,成功构建了一个自动化工具链,该工具链使代码推送和部署变得简单,同时考虑了多租户、身份验证/授权、存储、网络、服务发现以及生产部署所需的其他必要因素。我们希望您能从讨论中获得帮助,了解用于构建 CI/CD 管道的生态系统工具、Kubernetes 作为虚拟机/裸机上的部署平台,以及 Kubernetes 架构的概述,以帮助您架构和部署自己的集群。感谢所有为该项目提供帮助的人。--Norifumi Matsuya、Hirotaka Ichikawa、Masaharu Miyamoto 和 Yuta Kinoshita。 这篇帖子经过许可,已进行翻译和编辑以适应语境——最初发布于 Yahoo! JAPAN 工程博客,这是关于 Kubernetes 的系列文章之一。