Skip to main content
开放网络的先行者与推动者—星融元
加入我们技术支持(Support)  TEL:(+86)4000989811

配置指导:OpenStack Magnum 部署

OpenStack Magnum 部署方案

1 目标与物理网络拓扑

本文主要描述在现有OpenStack(stein版)平台上如何扩展安装Magnum功能组件,实现容器管理服务。
涉及物理拓扑,如图1所示:

图1:物理网络拓扑

部署过程中所涉及到的设备、接口及管理网口的IP地址如下表所示:

设备名称接口IP地址备注
Switch-A管理口192.168.0.254三层交换机
Switch-B管理口192.168.4.1二层交换机
Switch-C管理口192.168.5.1二层交换机
Server-1管理口192.168.4.144/
Server-2管理口192.168.5.145/

表1:设备管理口列表

2 硬件与软件环境

部署环境中涉及到的硬件和软件如表2和表3所示:

名称型号硬件指标数量备注
服务器1.至少8G内存
2.磁盘不少于500G
2Server-1计算节点+存储节点
Server-2 控制节点+网络节点

表2:硬件环境

软件版本备注
服务器Centos7.6安装时选择Compute Node 模式,根目录/至少500G
OpenStackstein

表3:软件环境

3 Magnum简介

Magnum项目是OpenStack中的容器编排服务引擎,向上提供统一API,向下异构兼容K8S,Mesos,Swarm等容器管理平台,是OpenStack与容器结合的官方正式项目

Magnum使用Heat部署一个包含Docker和Kubernetes的操作系统镜像,让容器集群运行在虚拟机(Virtual Machine)或者裸机(Bare Metal)中。

Magnum 由三个代码库组成:

  • Magnum: http://git.openstack.org/cgit/openstack/magnum
  • Python-magnumclient: http://git.openstack.org/cgit/openstack/python-magnumclient
  • Magnum-ui: http://git.openstack.org/cgit/openstack/magnum-ui

Magnum主要提供两个服务:

  • Magnum API 和 Magnum Conductor。
  • Magnum API是提供资源的Rest接口。

Magnum Conductor是整个项目的核心,首先通过Heat部署虚拟机实例或者裸机实例上,然后通过Cloud init在虚拟机实例或者裸机实例上,调用Kubernetes、Swarm或者Mesos部署容器集群。

Python-magnumclient封装Magnum Rest API向外提供Magnum的接口调用,同时提供CLI功能。

Magnum-ui提供一个Horizon的插件,使用Django和AngularJS实现Magnum的界面操作。

下面是Magnum的整体架构:

图2: Magnum架构图

主要概念:

  • Bay:Bay在magnum主要表示一个集群,新版改为Cluster,现在通过Magnum可以创建K8s和Swarm的Bay,也就是K8s和Swarm的集群。
  • Baymodel:Baymodel是Flavor的一个扩展,新版改为Cluster Template,Flavor主要是定义虚拟机或者物理机的规格,Baymodel主要是定义一个Docker集群的一些规格,例如这个集群的管理节点的Flavor,计算节点的Flavor,集群使用的Image等等,都可以通过Baymodel去定义。
  • Node:主要是指Bay中的某个节点。
  • Container:就是具体的某个Docker容器。

Pod、Replication Controller和Service的意思和在K8s的意思是一样的。

  • Pod:是Kubernetes最基本的部署调度单元,可以包含多个Container,逻辑上表示某种应用的一个实例。比如一个Web站点应用由前端、后端及数据库构建而成,这三个组件将运行在各自的容器中,那么我们可以创建包含三Pod,每个Pod运行一个服务。或者也可以将三个服务创建在一个Pod,这个取决于用户的应用需求。一个Pod会包含N个Container,多出来的那一个Container是Net Container,专门做路由的。
  • Service:可以理解为是Pod的一个路由,因为Pod在运行中可能被删除或者IP发生变化,Service可以保证Pod的动态变化对访问端是透明的。
  • Replication Controller:是Pod的复制抽象,用于解决Pod的扩容缩容问题。通常,分布式应用为了性能或高可用性的考虑,需要复制多份资源,并且根据负载情况动态伸缩。通过Replication Controller,我们可以指定一个应用需要几份复制,Kubernetes将为每份复制创建一个Pod,并且保证实际运行Pod数量总是与预先定义的数量是一致的(例如,当前某个Pod宕机时,自动创建新的Pod来替换)。

简单总结:Magnum自身作为一套 API 框架,本身调用其它的容器管理平台的 API 来实现功能。目前支持的后端包括 Kubernetes、Swarm和Mesos。

如果说 Nova 是一套支持不同 Hypervisor 虚拟机平台的API 框架,那么 Magnum 则是支持不同容器机制的 API 框架。

4 安装步骤

[root@controller ~] 表示在控制节点上执行

[root@compute ~] 表示在计算节点上执行

4.1 创建数据库

  • 创建数据库并授权:
[root@controller ~]# mysql -uroot -p
MariaDB [(none)]> CREATE DATABASE magnum;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON magnum.* TO magnum@'localhost' \
  IDENTIFIED BY 'magnum';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON magnum.* TO magnum@'%' \
  IDENTIFIED BY 'magnum';

注:帐号密码根据自己的情况修改

4.2 创建openstack用户、服务凭据、API端点

  • 在安装和配置Magnum之前,必须创建用户、服务凭据和API端点:
[root@controller ~]# . admin-openrc
[root@controller ~]# openstack user create --domain default --password-prompt magnum
[root@controller ~]# openstack role add --project service --user magnum admin
[root@controller ~]#openstack service create --name magnum \
  --description "OpenStack Container Infrastructure Management Service" \
  container-infra
[root@controller ~]#openstack endpoint create --region RegionOne \
  container-infra public http://controller:9511/v1
[root@controller ~]#openstack endpoint create --region RegionOne \
  container-infra internal http://controller:9511/v1
[root@controller ~]#openstack endpoint create --region RegionOne \
  container-infra admin http://controller:9511/v1
  • Magnum需要身份服务中的其他信息来管理COE群集

创建 magnum域

[root@controller ~]# openstack domain create --description "Owns users and projects \
  created by magnum" magnum

在magnum域中创建magnum_domain_admin用户

[root@controller ~]# openstack user create --domain magnum --password-prompt \
  magnum_domain_admin

添加admin角色到 magnum域 中的magnum_domain_admin用户

[root@controller ~]# openstack role add --domain magnum --user-domain magnum --user \
  magnum_domain_admin admin

4.3 在controller节点上安装magnum服务

  • 创建用户、组:
[root@controller ~]#groupadd --system magnum
[root@controller ~]#useradd --home-dir "/var/lib/magnum" \
      --create-home \
      --system \
      --shell /bin/false \
      -g magnum \
      magnum
  • 创建目录:
[root@controller ~]#mkdir -p /var/log/magnum
[root@controller ~]#mkdir -p /etc/magnum
[root@controller ~]#chown magnum:magnum /var/log/magnum
[root@controller ~]#chown magnum:magnum /var/lib/magnum
[root@controller ~]#chown magnum:magnum /etc/magnum
  • 安装软件包:
[root@controller ~]#yum install openstack-magnum-api openstack-magnum-conductor  \
python-magnumclient
  • 编辑配置文件:
[root@controller ~]#vi /etc/magnum/magnum.conf
[DEFAULT]
transport_url = rabbit://openstack:tera123@controller
log_dir = /var/log/magnum
[api]
host = 192.168.4.144
port = 9511
[certificates]
#生产环境建议用barbican,如果没有安装barbican则使用x509keypair
#cert_manager_type = barbican
cert_manager_type = x509keypair
[cinder_client]
region_name = RegionOne
[database]
connection = mysql+pymysql:://magnum:magnum@controller/magnum
[keystone_authtoken]
memcached_servers = controller:11211
auth_version = v3
www_authenticate_uri = http://controller:5000/v3
project_domain_id = default
project_name = service
user_domain_id = default
password = magnum
username = magnum
auth_url = http://controller:5000
auth_type = password
admin_user = magnum
admin_password = magnum
admin_tenant_name = service
[trust]
trustee_domain_name = magnum
trustee_domain_admin_name = magnum_domain_admin
trustee_domain_admin_password = magnum_domain_admin
# trustee_keystone_interface with either public or internal 取决于网络配置 默认public
trustee_keystone_interface = public
[oslo_messaging_notifications]
driver = messaging
[oslo_concurrency]
lock_path = /var/lib/magnum/tmp
  • 填充数据库:
[root@controller ~]#su -s /bin/sh -c "magnum-db-manage upgrade" magnum
  • 启动服务:
[root@controller ~]# systemctl enable openstack-magnum-api.service \
  openstack-magnum-conductor.service
[root@controller ~]# systemctl start openstack-magnum-api.service \
  openstack-magnum-conductor.service

4.4 在controller节点上安装magnum-ui服务

  • 安装magnum-ui:
[root@controller ~]#pip install magnum-ui==5.0.1
  • 复制文件:
[root@controller ~]#cd /usr/lib/python2.7/site-packages/magnum_ui
[root@controller ~]#cp enabled/*  \
 /usr/share/openstack-dashboard/openstack_dashboard/local/enabled/
  • 重启服务:
[root@controller ~]#systemctl restart httpd memcached

5 结果验证

在controller节点列出magnum服务

  • 列出服务
[root@controller ~]#source admin-openrc
[root@controller ~]#openstack coe service list
  • 启动实例

(1)创建一个外部网络

[root@controller ~]#openstack network create public --provider-network-type vxlan \
                                  --external \
                                  --project service
[root@controller ~]#openstack subnet create public-subnet --network public \
                                  --subnet-range 192.168.5.0/24 \
                                  --gateway 192.168.5.1 \
                                  --ip-version 4

(2)创建一个密钥对

[root@controller ~]#openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey

(3)创建一个卷类型

[root@controller ~]#openstack volume type create volumnType1

(4)上传集群必须的镜像

VM版本的Kubernetes和Docker Swarm驱动程序需要Fedora Atomic映像。以下是由Atomic团队构建并经过Magnum团队测试的Fedora Atomic原始图像。

a. 先下载镜像

[root@controller ~]#wget https://download.fedoraproject.org/pub/alt/atomic/stable/Fedora-Atomic-27-20180419.0/CloudImages/x86_64/images/Fedora-Atomic-27-20180419.0.x86_64.qcow2

b. 注册镜像到镜像服务并将os_distro 属性设为fedora-atomic

[root@controller ~]#openstack image create \
                      --disk-format=qcow2 \
                      --container-format=bare \
                      --file=Fedora-Atomic-27-20180419.0.x86_64.qcow2\
                      --property os_distro='fedora-atomic' \
                      fedora-atomic-latest

(5)设置Docker Swarm集群并且创建容器

a. 使用fedora-atomic-latest镜像为Docker Swarm集群创建集群模板:

[root@controller ~]#openstack coe cluster template create swarm-cluster-template \
                     --image fedora-atomic-latest \
                     --external-network public \
                     --dns-nameserver 8.8.8.8 \
                     --master-flavor m1.small \
                     --flavor m1.small \
                     --coe swarm

b. 使用一个master和一个node创建一个集群:

[root@controller ~]# openstack coe cluster create swarm-cluster \
                        --cluster-template swarm-cluster-template \
                        --master-count 1 \
                        --node-count 1 \
                        --keypair mykey  \
                        --labels docker_volume_type=volumnType1

c. 检查创建的集群状态

[root@controller ~]# openstack coe cluster list
[root@controller ~]#openstack coe cluster show swarm-cluster

d.将集群验证凭据添加到环境变量里:

[root@controller ~]#mkdir myclusterconfig
[root@controller ~]#$(openstack coe cluster config swarm-cluster --dir myclusterconfig)

上面的命令会将身份验证工件保存在 myclusterconfig目录中,导出环境以下变量:DOCKER_HOST,DOCKER_CERT_PATH和DOCKER_TLS_VERIFY

[root@controller ~]#export DOCKER_HOST=tcp://172.24.4.10:2376
[root@controller ~]#export DOCKER_CERT_PATH=myclusterconfig
[root@controller ~]#export DOCKER_TLS_VERIFY=True

e. 创建一个容器:

[root@controller ~]#docker run busybox echo "Hello from Docker!"

f. 删除集群

[root@controller ~]# openstack coe cluster delete swarm-cluster

(6)设置Kubernetes集群并且创建部署

本示列中,将会使用一个master和一个node创建一个k8s集群,然后用k8s原生命令kubectl来创建一个部署

a. 使用fedora-atomic-latest镜像为kubernetes集群创建集群模板:

[root@controller ~]# openstack coe cluster template create kubernetes-cluster-template \
                     --image fedora-atomic-latest \
                     --external-network public \
                     --dns-nameserver 8.8.8.8 \
--docker-volume-size=5  \
                     --master-flavor m1.small \
                     --flavor m1.small \
                     --coe kubernetes

b. 使用一个master和一个node创建一个集群:

[root@controller ~]# openstack coe cluster create kubernetes-cluster \
                        --cluster-template kubernetes-cluster-template \
                        --master-count 1 \
                        --node-count 1 \
                        --keypair mykey \
                        --labels docker_volume_type=volumnType1

c. 检查创建的集群状态

[root@controller ~]# openstack coe cluster list
[root@controller ~]#openstack coe cluster show kubernetes-cluster

d. 将集群验证凭据添加到环境变量里:

[root@controller ~]# mkdir -p ~/clusters/kubernetes-cluster
[root@controller ~]# $(openstack coe cluster config kubernetes-cluster --dir ~/clusters/kubernetes-cluster)

上面的命令会将身份验证工件保存在~/clusters/kubernetes-clusterg目录中,导出环境以下变量:KUBECONFIG

[root@controller ~]# export KUBECONFIG=/home/user/clusters/kubernetes-cluster/config

e. 检查k8s集群的控制器组件:

[root@controller ~]# kubectl -n kube-system get po

f. 验证部署一个nginx:

[root@controller ~]# kubectl run nginx --image=nginx --replicas=5
deployment "nginx" created
[root@controller ~]#kubectl get po

g. 删除集群:

[root@controller ~]#openstack coe cluster delete kubernetes-cluster

6 参考资料

https://wiki.openstack.org/wiki/Magnum
https://docs.openstack.org/magnum/latest/install/install.html
https://docs.openstack.org/python-magnumclient/latest/
https://docs.openstack.org/magnum-ui/latest/
https://releases.openstack.org/teams/magnum.html
https://docs.openstack.org/magnum/latest/admin/troubleshooting-guide.html

如有其它问题,请填写右侧需求表单联系我们。www.asterfusion.com

A-lab-云网络, A-lab-部署验证

对星融元产品感兴趣?

立即联系!

返回顶部

© 星融元数据技术(苏州)有限公司 苏ICP备17070048号-2