Yahoo!上我们如何在OpenStack上大规模构建和运行Kubernetes!日本

编者注:今天的帖子由Yahoo!的基础架构工程团队撰写日本,谈论他们如何在Kubernetes上运行OpenStack。这篇文章经许可后经过翻译和编辑-最初发布在 雅虎!日本工程博客

介绍
这篇文章概述了Yahoo! JAPAN在Google和Solinea的帮助下,构建了一个自动化工具链,用于“一键式”将代码部署到在OpenStack上运行的Kubernetes。 

我们还将介绍基本的安全性,网络,存储和性能需求,以确保生产就绪。 

最后,我们将讨论用于构建CI / CD管道的生态系统工具,作为VM /裸机上的部署平台的Kubernetes,以及概述Kubernetes的体系结构,以帮助您构建和部署自己的集群。 

前言
自从我们公司于2012年开始使用OpenStack以来,我们的内部环境已经发生了快速变化。我们使用OpenStack实现了虚拟化硬件的最初目标。但是,由于云和容器技术的进步,我们需要能够在各种平台上启动服务的功能。这篇文章将提供我们的示例,说明如何在OpenStack上运行应用程序并将其移植到Kubernetes。

编码生命周期
该项目的目标是从一个应用程序代码为所有必需的平台创建映像,并将这些映像部署到每个平台上。例如,当在代码注册表中更改代码时,裸机映像,Docker容器和VM映像由CI(连续集成)工具创建,并推送到我们的映像注册表中,然后部署到每个基础架构平台。

我们在CICD管道中使用以下产品:

功能 产品
代码注册表 GitHub企业版
CI工具 詹金斯
图像注册表 人工工厂
错误追踪系统 吉拉
部署裸机平台 OpenStack的 讽刺
部署VM平台 OpenStack的 的
部署容器平台 Kubernetes

图像创作。下图显示了每个图像创建工作流程。

VM映像创建 :

  1. 1.将代码推送到GitHub
  2. 2.钩到詹金斯大师
  3. 3.在詹金斯奴隶上启动工作 
  4. 4.checkout Packer存储库
  5. 5.运行服务作业
  6. 6,通过构建脚本执行打包程序
  7. 7,打包机启动VM for OpenStack的 Glance 
  8. 8,配置虚拟机并安装所需的应用程序
  9. 9.创建快照并注册一目了然 10.10从Glance下载新创建的图像 11.11将图像上传到Artifactory

裸金属图像创建:

  1. 1.将代码推送到GitHub
  2. 2.钩到詹金斯大师
  3. 3.在詹金斯奴隶上启动工作 
  4. 4.checkout Packer存储库
  5. 5.运行服务作业
  6. 6.通过构建脚本下载基础裸机映像
  7. 7.build脚本使用Packer执行diskimage-builder来创建裸机映像
  8. 8.将新创建的图像上传到Glance
  9. 9.将图像上传到Artifactory

容器映像创建:

  1. 1.将代码推送到GitHub
  2. 2.钩到詹金斯大师
  3. 3.在詹金斯奴隶上启动工作 
  4. 4.签出Dockerfile仓库
  5. 5.运行服务作业
  6. 6,从Artifactory下载基础docker镜像
  7. 7,如果在Artifactory上找不到Docker映像,请从Docker Hub下载
  8. 8,执行docker构建并创建镜像 
  9. 9.将图像上传到Artifactory

平台架构。

让我们专注于容器工作流程,以逐步了解如何使用Kubernetes作为部署平台。该平台架构如下。

功能 产品
基础设施服务 OpenStack的 的
集装箱主机 CentOS的 的
容器集群管理器 Kubernetes
容器网络 印花布项目
集装箱发动机 码头工人
集装箱登记处 人工工厂
服务注册
源代码管理 GitHub企业版
CI工具 詹金斯
基础架构配置 地貌
记录中 Fluentd,Elasticsearch,Kibana
指标 Heapster,Influxdb,Grafana
服务监控 普罗米修斯

我们将CentOS用于容器主机(OpenStack实例),并安装Docker,Kubernetes,Calico等。当然,可以在Kubernetes上运行各种容器应用程序。实际上,我们将OpenStack作为这些应用程序之一运行。没错,Kubernetes上的OpenStack在OpenStack上。当前,我们有30多个OpenStack集群,这些集群很快变得难以管理和操作。因此,我们希望创建一个简单的基本OpenStack集群,以提供Kubernetes所需的基本功能,并使我们的OpenStack环境更易于管理。

Kubernetes 体系结构

让我更详细地解释Kubernetes架构。架构图如下。

|产品|说明| | OpenStack的 Keystone | Kubernetes 身份验证和授权| |||||||||||||| OpenStack的 Cinder || Pod中使用的外部卷(多个容器的分组】| | kube-apiserver |通过REST API配置和验证Pod或Services(定义对容器中服务的访问)之类的对象| | kube-scheduler |将Pod分配给每个节点| | kube-controller-manager |执行状态管理,管理复制控制器| | kubelet |作为代理在每个节点上运行并管理Pod | | calico |使用BGP启用Pod间连接| | kube-proxy |配置iptable NAT表以配置IP和负载平衡(ClusterIP)| | 等 |分发KVS以存储Kubernetes和Calico信息| | 等 -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 Server时指定该策略文件。该实用程序还根据租户信息创建名称空间。这些配置使Kubernetes可以通过OpenStack Keystone进行身份验证并在授权的名称空间中运行。 卷和数据持久性 Kubernetes 提供了“ Persistent Volumes”子系统,可作为Pod的持久存储。 “永久卷”能够支持云提供商的存储,可以通过将OpenStack用作云提供程序来利用OpenStack煤渣卷。 联网 法兰绒和各种联网作为Kubernetes的联网模型存在,我们在该项目中使用了Calico项目。雅虎! JAPAN建议使用纯L3网络(例如重新分配ARP验证或IP CLOS网络)构建数据中心,Project Calico与此相符。当我们应用Flannel之类的叠加模型时,我们无法从Kubernetes集群外部访问Pod IP。但是Calico项目使这成为可能。我们还将Project Calico用于负载平衡,我们将在后面介绍。

在Calico项目中,在Kubernetes的每个节点上启动的BIRD容器(OSS路由软件)上的BGP广播生产IP。默认情况下,它仅在群集中广播。通过在群集外部设置对等路由器,可以从群集外部访问Pod。 外部服务负载平衡

Kubernetes 可以使用多种外部服务负载平衡器选择(从集群外部访问服务),例如NodePort,LoadBalancer和Ingress。我们找不到完全符合我们要求的解决方案。但是,我们找到了一种解决方案,该解决方案可以通过Project Calico BGP广播用于内部服务负载平衡(用于从群集内部访问服务)的群集IP,从而从群集外部实现第4层的外部负载平衡。

服务发现

使用SkyDNS插件可以在Kubernetes上进行服务发现。这是作为群集内部服务提供的,可以在群集中访问,例如ClusterIP。通过BGP广播ClusterIP,名称解析可从群集外部进行。通过将图像创建工作流程和Kubernetes相结合,我们构建了以下工具链,使从代码推送到部署变得容易。

概要

总之,通过结合图像创建工作流程和 Kubernetes ,雅虎!日本,在 谷歌 索琳娜 ,成功构建了一个自动化工具链,可以轻松地从代码推送到部署,同时利用多租户,身份验证/身份验证,存储,网络,服务发现和其他生产部署所需的因素。我们希望您能找到有关用于构建CI / CD管道的生态系统工具,作为虚拟机/裸机上的部署平台的Kubernetes的讨论,以及有关Kubernetes体系结构的概述,以帮助您构建和部署自己的集群。感谢所有为这个项目提供帮助的人。 -松屋纪夫,市川弘隆,宫本雅治和木下佑太。 这篇文章经许可后经过翻译和编辑-最初发布在 雅虎!日本工程师博客 这是有关Kubernetes的一系列帖子中的一篇。