皇上,还记得我吗?我就是1999年那个Linux伊甸园啊-----24小时滚动更新开源资讯,全年无休!

苏宁云自动化部署统一平台 Hull

作者 孙凯歌      , 王晓飞

背景

现有解决方案思路

苏宁云是国内比较早使用 Kubernetes 和 Openstack 的公司,自动化部署 1.0 产品使用了比较传统的安装方式,主要的部署工具使用 Puppet。现有的自动化部署统一平台使用的是 ansible 为代表的 KubeSpray 以及 Kolla-Ansible。

苏宁云有一套成熟的部署思路,所以,在设计方案的兼顾了,不破坏社区版本的代码基础上,进行定制化开发,所有定制化的功能都是可插拔的。

统一平台可以让用户的对整体机器资源一目了然;参数统一,用户配置更加方便;同时加强了对部署过程中监控。

走近 Kubernetes KubeSpray

KubeSpray 整体介绍

KubeSpray 是 Kubenetes 社区孵化的一个方案,现在已经开源,KubeSpray 使用了 Ansible-playbook 进行了编排,依赖于 Kubeadm,可以将 Kubernetes 部署在 AWS、GCE、Azure、OpenStack、Vsphere、以及裸机。Kubenetes 可以快速部署一个高可用 Kubenetes 集群。可选的网络查件,KubeSpray 支持的网络插件非常多,包括 Flannel、Contiv、Weave、Calico 等。KubeSpray 也支持主流的操作系统发现版。

KubeSpray 定制开发非常简单,如果需要增加步骤,只需要修改 playbook 的入口文件即可,比如 cluster.yaml

使用 KubeSpray 快速搭建 Kubernetes 平台

是时候动手尝试一下 KubeSpray 了,他将会改变你对手动部署 Kubernetes 的繁琐的认识,特别是配置 SSL 认证。

(关于实验环境,全部是在 CentOS7 上进行,后续不再说明。)

上一节说了,KubeSpray 使用 Ansible-Playbook 编写,首先安装 Ansible,版本大于 2.4 版本,使用最简单的 pip。

$ pip install ansible

Clone 代码

$ git clone https://github.com/kubernetes-incubator/kubespray.git

进入代码目录

从 requiremens.txt 文件中安装依赖文件

$ pip install -r requiremens.txt

复制资产文件到自定义目录

$ cp -rfp inventory/sample/* inventory/demo_cluster

复制后在 demo_cluster 结构如下:

在 hosts.ini 中配置机器资产;

在 group_vars/all.yml 配置部署 Kubernetes 的通用参数

在 group_vars/k8s-cluster.yml 配置部署 Kubernetes 的版本,镜像库、端口、网络等。

开始部署 Kubernetes

$ ansible-playbook -i inventory/demo_cluster/hosts.ini cluster.yml

以上就是快速部署 Kubernetes 的步骤,由此看出,KubeSpray 上手非常简单。

如果想深入研究 KubeSpray,可以参照社区文档,优化 all.yml 和 k8s-cluster.yml 中的详细参数。

理解 OpenStack Kolla-Ansible

Kolla-Ansible 介绍

Kolla-ansible 的两大特性,开箱即用以及允许完整定制化。这针对于缺少 OpenStack 自动化部署的操作者来说,可以快速的部署生产级别的 OpenStack 环境出来。

使用 Kolla-Ansible 快速搭建 OpenStack 平台

下面我们就看看,使用 Kolla-Ansible 快速搭建一个 3 个控制节点 OpenStack 平台。由于部署时分为研发调试方式和生产方式,我们使用生产方式来部署 OpenStack。

(关于实验环境,全部是在 CentOS7 上进行,后续不再说明。)

本次实验使用是一台物理机,配置如下:

  • 32 核 CPU
  • 64GB 内存
  • 50GB root 盘 + 850GB 数据盘
  • 2 块千兆卡 + 2 块万兆卡

在正式安装部署之前,假设您对 AnsibleDocker 有了掌握和了解。

安装依赖

  1. 安装和升级最新版的 pip 工具

yum install epel-releaseyum install python-pip

pip install -U pip

  1. 安装依赖

yum install python-devel \libffi-devel \gcc \openssl-devel \libselinux-python

  1. 安装 Ansible

yum install ansible

  1. 使用 pip 安装或者升级最新版的 Ansible

当前为了更好的兼容 kolla,Ansible 版本要大于 2.4

pip install -U ansible

安装 Kolla-ansible

  1. 更改 Ansible 默认的配置

[defaults] host_key_checking=Falsepipelining=Trueforks=100

  1. 使用 pip 安装 kolla-ansible

pip install kolla-ansible

另外一种方式,使用源码安装 kolla-ansible

git clone https://github.com/openstack/kolla-ansible.gitcd kolla-ansible && python setup.py install

  1. 复制 yml 和 passwords.yml to /etc/kolla 目录,如果 kolla 目录不存在,请手动创建。

cp -r /usr/share/kolla-ansible/etc_examples/kolla /etc/

  1. 复制 all-in-one 和 multinode 资产文件到指定目录

cp /usr/share/kolla-ansible/ansible/inventory/* /home/demo_cluster

准备初始化配置

资产配置

在 Kolla-ansible 中有两个资产配置文件,all-in-one 和 mutilnode,这两个文件不同之处是 all-in-one 在 localhost 部署单个节点 OpenStack,multinode 部署多节点 OpenStack 环境,也就是生产级别的 OpenStack 环境。

  1. 编辑 mutilnode 文件
[control]
172.19.1.[10:12] ansible_user=root ansible_password=password ansible_become=true
# Ansible supports syntax like [10:12] - that means 10, 11 and 12.
# Become clause means "use sudo".

[network:children]
control
# when you specify group_name:children, it will use contents of group specified.

[compute]
172.19.1.[13:14] ansible_user=root ansible_password=password ansible_become=true

[monitoring]
172.19.1.18
# This group is for monitoring node.
# Fill it with one of the controllers' IP address or some others.

[storage:children]
compute

[deployment]
localhost       ansible_connection=local become=true
# use localhost and sudo
  1. 生成密码文件,密码文件其实是一组 key-value 值文件,用于各个组件认证的用户名密码。

密码文件默认存储在/etc/kolla/kolla-passwords.yml 中,直接执行。

kolla-genpwd

Kolla globals.yml 配置

globals.yml 是 kolla-ansible 非常重要的配置。下面是一些典型的配置选项:

使用哪种发行版的操作系统

kolla_base_distro: “centos”

使用哪种安装包方式

kolla_install_type: “source”

source 使用源码方式进行安装,依赖于 git

binary 使用包方式进行依赖 yum 或者 apt

指定 OpenStack 版本

openstack_release: “pike”

指定 OpenStack 版本分支

openstack_release: “master”

如果使用 source 安装的话,可以指定分支。

  1. 配置网络

配置管理网

network_interface: “eth0”

配置业务网

neutron_external_interface: “eth1”

配置 vip,用于 keepalived 提供高可用。

kolla_internal_vip_address: “10.1.0.250”

  1. 配置额外服务

比如是否启用 cinder

enable_cinder: “yes”

  1. 开始部署环境

一旦以上配置完成,我们就可以进行部署,首先我们要设置最基本的依赖,docker。

  • Bootstrap server

kolla-ansible -i ./multinode bootstrap-servers

  • 进行预检查

kolla-ansible -i ./multinode prechecks

  • 开始部署

kolla-ansible -i ./multinode deploy

以上就是部署一套多节点的 OpenStack 环境,过程比较简单,当时在上文提到,globals.yaml 文件是非常重要的文件,所以想要优化部署过程或者使用 openstack 更高级的功能,应该详细研究每一个参数代表的含义。

生产级 Kolla-Ansible

部署生产级别的 OpenStack 与上述步骤大致相同,但是设置的参数项会很多。

  • 节点角色划分,在生产中,要详细划分控制节点、网络节点、计算节点、存储节点以及监控节点。
  • 网络的配置,为了降低网络的延迟以及网络高可用,那么设置不同的 interface 是非常重要的,比如 network_interface、api_interface、storage_interface、cluster_interface 等。
  • Docker 相关的配置,在实际过程中,要规划好 docker 的存储,默认使用 devicemapper,所以在生产中要提前做好规划和调研。另外一项是日志,要规划好日志的目录,防止日志过多,导致 root 崩溃。

作为产品输出

在 1.0 版本使用了 Puppet 工具,利用 Puppet 进行安装,整个过程是流程化安装。Puppet 虽然满足现有的部署架构,但是也存在一下缺点:

  1. Puppet 工具本身的认证问题。
  2. Puppet 的 C/S 架构,会对用户机器有一定侵入。
  3. 如果考虑到升级维护,必须保留 Puppet server。
  4. Puppet 很难进行产品化,并且一旦部署过程变动,维护成本也比较高。
  5. Puppet 本身学习成本比较高。

综合 Puppet 一些劣势,我们选择了使用 Ansible 设计的 KubeSpray 以及 Kolla-Ansible。

如果作为产品输出,不是简单的进行定制开发,产品化的最终用户一定不是自家公司的运维工程师或者研发工程师,而是在大多数人看来,经过简单培训加以文档辅助,都可以完成 IaaS 设施的部署。

所以,我们将重新设计开发一个自动化部署产品,面向一般用户,简化部署流程,用户只需要填入一些参数以及选择不同的值,就可以完成自动化部署过程。过程不需要干预,并且对过程进行监控,发现问题,及时通知用户。

苏宁云的产品化思路

  1. 依赖 KubeSpray 和 Kolla-Ansible
  2. 设计标准的 Restful API,将复杂的用户参数配置以及命令执行,转化为友好的 API 调用。
  3. 定义 WorkFlow,WorkFlow 的含义本身具有可编排,Hull 定义了多种 WorkFlow,用户只需要选择对应的 WorkFlow,就可以启动部署流程。
  4. 提供可视化安装,Hull 将会提供一套完成的 UI 操作页面,UI 与 API 耦合度很低。
  5. 封装 Cobbler API,使用部署操作系统也加入到整个 Hull 过程中。
  6. 提供用户管理,即一套平台,可以部署多套 IaaS 设施。
  7. 同时加入 Data Center、Cluster、Region 等逻辑概念,更好的满足用户的部署需求。

苏宁云的解决方案

苏宁云新的自动化部署产品 Hull 给出的方案如下图。

  1. 用户首先进行基本信息注册
  2. 创建 data center、region、cluster
  3. 启动 WorkFlow,有四种可以选择:
  • Install OpenStack Dev All-IN-ONE
  • Install Kubernetes Dev All-IN-ONE
  • Install OpenStack Pro
  • Install Kubernetes Pro
  1. 控制平台接到部署 WorkFlow 指令时,启动对应的检查。
  2. 接下来调用 IPMI 接口进行 PXE 启动,引导至 PXE 安装。
  3. Cobbler 安装 basic OS,比如 CentOS7 或者 Ubuntu16
  4. 安装完成 Basic OS 后,Cobbler 也启动 post script 进行依赖包安装、内核替换、bond 配置、网卡制作等。
  5. 正式安装部署 OpenStack 或者 Kubernetes,接下来过程无需人工干预,在配置正确的前提下,可以自动化完成安装部署。并且安装过程中,会实时向 manager 平台推送当前安装的进度。
  6. 当安装完毕后,启动 Heath-Checker,检查当前安装环境是否正常,比如创建一个虚拟机或者一个 pod,并且检查虚拟机的状态或 pod 的状态。

第三方如何集成苏宁云 Hull

  • 统一注册部署管理方式

这种方式所有的集成商,将机器资源统一注册到苏宁云部署管理平台,用户必须登录认证之后,方可操作其下的机器资源。有平台下发部署指令,该种方式要求 IPMI IP、物理机器访问均可以被统一部署平台访问。

  • 私有化部署方式

该种方式最为理想,架构类似于在每个客户现场部署一套部署管理平台。

机器启动之后,向指定的 manage 注册自己。之后由该平台进行统一的指令下发以及部署状态收集。

  • 定制化开发

基于 Hull 定制化开发也很简单,Hull 有独立的 Restful API,任何集成商都可以在此产品的基础上再次进行产品化。

作者简介

王晓飞, 现担任苏宁云容器网络架构师职位,在针对 Openstack、Kubernetes、swarm 网络架构方面有着专业的研究和理解,在该领域拥有超过 5 年经验,现在负责苏宁云容器网络架构、Openstack 网络架构、容器集群监控,主导容器云监控系统开发、容器网络需求定制开发,自动化部署平台,PaaS 平台。对 DevOps 理念有很深的掌握。

孙凯歌 ,苏宁云高级研发工程师,精通 OpenStack,擅长 Nova、Cinder、Keystone。

转自 http://www.infoq.com/cn/articles/suning-hull-platform

分享到:更多 ()