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

Kubernetes-Cilium部署方案

Kubernetes-Cilium部署方案

1 Kubernetes-Cilium项目简介

Kubernetes-Cilium是一个基于eBPF和XDP的高性能容器网络方案的开源项目,目标是为微服务环境提供网络、负载均衡、安全功能,主要定位是容器平台。

2 Kubernetes-Cilium项目优势

Kubernetes-Cilium主要是基于eBPF的特性来实现的,eBPF和Cilium适合应对新时代下的云发起挑战的原因主要有以下三个:

  • 可编程性:eBPF的可编程性使得Cilium能够适应云的快速发展并轻松应对云规模的快速增长,并且eBPF的通用性对于任何特定于网络的可编程性解决方案(Iptables、OpenVswitch或Nftables)相比都是一个巨大的优势。
  • 嵌入到Linux内核:eBPF的可编程的独特性已经嵌入到了Linux内核中。应用程序使用系统调用通过网络进行交互,Linux内核负责处理这些系统调用,而为了使用户空间网络框架对应用程序保持透明,仍然需要遍历Linux内核的套接字层。而eBPF通过完全保留在内核中来避免这种情况。
  • 安全高效:直接加载Linux内核模块也可以提供非常高效率的可编程性,但主要的缺点也很明显:加载内核模块运行有缺陷的代码会直接让内核崩溃。而通过eBPF程序的验证程序验证,会比直接加载内核模块安全的多。同时通过JIT(Just-In-Time)的编译,可以确保eBPF字节码在物理机上的执行速度。

3 Kubernetes-Cilium项目架构

Cilium位于容器编排系统和Linux Kernel之间,向上可以通过容器编排系统为容器进行网络以及相应的安全策略进行配置,向下可以在Linux内核hook点挂载eBPF程序,来控制容器网络数据的转发以及安全策略的实施。

Cilium项目架构

4 Kubernetes-Cilium项目组件

Cilium项目组件

在Cilium的架构中,除了Key-Value数据存储之外,主要组件包括Cilium Agent和Cilium Operator,还有一个客户端的命令行工具Cilium CLI。

  • Etcd:负责Key-Value数据存储,与Cilium和Kubernetes共用一个Etcd数据库。
  • Cilium Agent:Cilium Agent作为整个架构中最核心的组件,通过DaemonSet的方式,运行在集群的每个主机上。Cilium Agent作为用户空间的守护程序,通过插件与容器运行时和容器编排系统进行交互,进而为本机上的容器进行网络以及安全的相关配置。同时提供了开放的API,供其他组件调用。
  • Cilium Operator:Cilium Operator主要负责管理集群中的任务,尽可能的保证以集群为单位,而不是单独的以节点为单位进行任务处理。主要包括通过Etcd为节点之间同步资源信息、确保Pod的DNS可以被Cilium管理、集群NetworkPolicy的管理和更新等。
  • Cilium Client:客户端的命令行工具,与运行在同一节点上的Cilium Agent的Rest API交互。Cilium Client允许检查本地的Agent状态,它还提供了直接访问eBPF Maps以验证其状态的工具。

5 节点配置

操作系统版本:CentOS Linux release 7.7.1908 (Core)

服务器具体配置要求如下:

主机名IP地址处理器内存硬盘节点角色
Minkube-kubernetes192.168.4.2324C8G50G 系统盘All in one
  • 内核版本大于4.15
  • 至少8G内存
  • 磁盘至少50G

6 系统优化

主机的优化不单纯只是软硬件的优化,基于操作系统的性能优化也是多方面的,可以从几个方面进行衡量,以更好的提高主机的性能。

6.1 关闭SELinux

SELinux不关闭的情况下无法实现,会限制ssh免密码登录。

[root@minikube  ~]# setenforce 0
[root@minikube  ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

6.2 关闭防火墙

防止安装时出现各个组件的端口不能访问的问题。

[root@minikube  ~]#systemctl stop firewalld && systemctl disable firewalld                          

6.3 时间同步

同步时间可以有效解决因时间不同而造成的不同步。

[root@localshot  ~]# yum -y install ntp
[root@minikube  ~]# ntpdate ntp1.aliyun.com
[root@minikube  ~]# timedatectl set-timezone Asia/Shanghai

6.4 修改系统打开文件最大数量

放开系统打开文件最大数量,防止因达到上限值而导致的进程终止。

[root@minikube  ~]# vi /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

7 升级内核

操作系统CentOS Linux release 7.7.1908 (Core)默认的内核版本为3.10.0不满足本次部署的内核版本最低需求,需要将内核升级到4.15版本及以上。最新版的内核可以在https://www.kernel.org/上找到。

7.1 更新Yum仓库

替换阿里云Yum源,并升级。

[root@minikube  ~]# rm /etc/yum.repos.d/*.repo
[root@minikube  ~]# wget -O \ 
/etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@minikube  ~]# wget -O \
/etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo	
[root@minikube  ~]# yum clean all && yum -y update

7.2 启用elrepo仓库

导入elrepo软件源的GPG公钥以及软件源,可以自动下载最新的软件列表,无需修改地址。

[root@minikube  ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@minikube  ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

7.3 安装最新版内核

[root@minikube  ~]# yum -y --disablerepo=* --enablerepo=elrepo-kernel install kernel-ml
[root@minikube  ~]# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (5.14.2-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-1062.el7.x86_64) 7 (Core)
2 : CentOS Linux (0-rescue-a079ba97b7ea44e6b30e09b82f929e16) 7 (Core)

7.4 配置Grub配置文件

内核安装完成之后,需要将新内核设置为默认启动选项并重启后才会生效。

[root@minikube  ~]# vi /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=0
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

[root@minikube  ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.14.2-1.el7.elrepo.x86_64
Found initrd image: /boot/initramfs-5.14.2-1.el7.elrepo.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-1062.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1062.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-a079ba97b7ea44e6b30e09b82f929e16
Found initrd image: /boot/initramfs-0-rescue-a079ba97b7ea44e6b30e09b82f929e16.img
done

7.5 重启验证

[root@minikube  ~]# reboot
[root@minikube  ~]# uname -r
5.14.2-1.el7.elrepo.x86_64

8 安装环境

MiniKube是一个快速搭建单节点Kubernetes集群的工具,可以在里面创建Pods来创建对应的服务,专注于让Kubernetes易于学习和开发。

8.1 安装Docker

本次部署使用Docker作为驱动,Docker版本要大于18.09。

[root@minikube  ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@minikube  ~]# yum-config-manager\
 --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@minikube  ~]# yum install docker-ce docker-ce-cli containerd.io
[root@minikube  ~]# systemctl enable docker
[root@minikube  ~]# systemctl start docker
[root@minikube  ~]# docker -v
Docker version 20.10.8, build 3967b7d

8.2 下载MiniKube

本次部署使用二进制的方式在x86-64 Linux上安装最新MiniKube稳定版本。

[root@minikube  ~]# curl -LO https://storage.googleapis.com//releases/latest/-linux-amd64
[root@minikube  ~]# install -linux-amd64 /usr/local/bin/
[root@minikube  ~]# minikube version
minikube version: v1.23.0
commit: 5931455374810b1bbeb222a9713ae2c756daee10

8.3 启动集群

使用Docker作为驱动程序,将Kubernetes安装到现有的Docker中,避免使用虚拟化。

[root@minikube  ~]# minikube start --driver=docker
[root@minikube  ~]# minikube config set driver docker
[root@minikube  ~]# minikube kubectl -- get po -A
[root@minikube  ~]# kubectl get po -A
命令行展示

9 安装Cilium

使用Cilium的CLI工具在MiniKube上安装Cilium。Cilium将自动检测集群配置并为成功部署的集群选择合适的组件。

9.1 下载Cilium

下载Cilium二进制安装包。

[root@minikube  ~]# curl -LO \
https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-amd64.tar.gz
[root@minikube  ~]# tar xzvfC cilium-linux-amd64.tar.gz /usr/local/bin
[root@minikube  ~]# rm cilium-linux-amd64.tar.gz

9.2 安装Cilium

部署完Cilium的集群会将Pods添加到kube-system命名空间。

[root@minikube  ~]# cilium install
Auto-detected Kubernetes kind: 
Running "minikube" validation checks
Detected minikube version "1.23.0"
Cilium version not set, using default version "v1.10.0"
Auto-detected cluster name: 
Auto-detected IPAM mode: cluster-pool
Auto-detected datapath mode: tunnel
Generating CA...
2021/09/27 02:54:44 [INFO] generate received request
2021/09/27 02:54:44 [INFO] received CSR
2021/09/27 02:54:44 [INFO] generating key: ecdsa-256
2021/09/27 02:54:44 [INFO] encoded CSR
Generating certificates for Hubble...
2021/09/27 02:54:44 [INFO] generate received request
2021/09/27 02:54:44 [INFO] received CSR
2021/09/27 02:54:44 [INFO] generating key: ecdsa-256
2021/09/27 02:54:44 [INFO] encoded CSR
Creating Service accounts...
Creating Cluster roles...
Creating ConfigMap...
Creating Agent DaemonSet...
Creating Operator Deployment...
Waiting for Cilium to be installed...

9.3 验证Cilium组件

[root@minikube  ~]# kubectl get pods --namespace=kube-system -l k8s-app=cilium 
命令行展示
[root@minikube  ~]# kubectl get po -A
命令行展示

10 验证集群

创建一个Nginx Deployment并且通过服务暴露其端口来验证Kubernetes-Cilium集群的可用性。

10.1 创建Deployment Nginx

[root@minikube  ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created

10.2 创建Service Nginx

将Deployment Nginx的Service暴露出来。名为Nginx的Pod的Deployment和Service都位于Default命名空间中。

[root@minikube  ~]# kubectl expose deployment nginx --port 80
service/nginx exposed
[root@minikube  ~]# kubectl get svc,pod --namespace=default
命令行展示

10.3 通过Pod访问Nginx

创建一个其他的Pod访问Nginx服务,在Default命名空间中启动一个最小容器访问Nginx。

[root@minikube  ~]# kubectl run busybox --rm -ti --image=busybox /bin/sh
If you don't see a command prompt, try pressing enter.
/ # wget --spider --timeout=1 nginx
Connecting to nginx (10.106.113.251:80)
remote file exists
命令行展示

10.4 创建Service Nginx3

以Deployment方式创建Nginx3 Pod,并将Deployment Nginx3的Service以NodePort方式暴露出来使用浏览器访问。

[root@minikube  ~]# kubectl create deployment nginx3 --image=nginx
[root@minikube  ~]# kubectl expose deployment nginx3 --type=NodePort --port=80
service/nginx exposed
[root@minikube  ~]# kubectl get svc 
命令行展示

10.5 通过浏览器访问Nginx3

通过浏览器访问Nginx3

11 参考资料

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

更多产品信息:AsterNOS

OpenStack+K8s+Ironic网络通信部署方案

1 目标

本文的目标是通过安装配置OpenStack-Ironic和Kuryr-kubernetes组件,实现OpenStack裸机与虚机的共存,以及整合OpenStack和Kubernetes的网络,实现网络的互通。

2 OpenStack-Ironic简介

OpenStack-Ironic与OpenStack-compute都是OpenStack的计算节点,其中Ironic与OpenStack集成提供裸金属管理服务,允许用户像管理虚拟机一样管理裸金属节点,其部署的裸金属节点指没有部署操作系统的物理服务器,相对于虚拟机,裸金属节点具有更强的计算能力、资源独占以及安全隔离等优点。

3 Kuryr-kubernetes简介

Kuryr-Kubernetes是一个用Python编写的OpenStack项目,它作为一个容器网络接口(CNI)插件,通过使用OpenStack Neutron和Octavia为Kubernetes pods提供网络。Kuryr-Kubernetes的主要优点之一是不需要在OpenStack和Kubernetes中使用多个软件定义网络(SDN)进行网络管理。使用Kuryr-kubernetes,能够实现虚机、裸金属和容器网络的统一管理,实现不同计算实体的通信。

4 硬件配置

主机系统网卡1:eno1网卡2:eno2IPMI管理口IPMI信息
Controller/K8s-masterCentos7.6192.168.4.220192.168.5.220  
Compute/K8s-nodeCentos7.6192.168.4.221   
OpenStack-IronicCentos7.6192.168.4.222   
Bare Metal   192.168.5.33ADMIN/tera123

服务器具体配置要求如下:

  • 2个千兆网口
  • 至少8G内存
  • 磁盘至少40G
  • 计算节点的BISO中开启CPU嵌套虚拟化(INTEL叫VT-x,AMD的叫AMD-V)

5 系统优化

主机的优化不单纯只是软硬件的优化,基于操作系统的性能优化也是多方面的,可以从几个方面进行衡量,以更好的提高主机的性能。

5.1 关闭SELinux(控制节点、计算节点)

SELinux不关闭的情况下无法实现,会限制ssh免密码登录。

[root@controller  ~]# setenforce 0
[root@controller  ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

5.2 关闭防火墙(控制节点、计算节点)

防止安装时出现各个组件的端口不能访问的问题。

[root@controller  ~]#systemctl stop firewalld && systemctl disable firewalld                          

5.3 时间同步(控制节点、计算节点)

同步时间可以有效解决因时间不同而造成的不同步。

[root@controller  ~]# yum -y install ntp
[root@controller  ~]# ntpdate ntp1.aliyun.com
[root@controller  ~]# timedatectl set-timezone Asia/Shanghai

5.4 修改系统打开文件最大数量(计算节点、控制节点)

放开系统打开文件最大数量,防止因达到上限值而导致的进程终止。

[root@controller  ~]# vi /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

5.5 降低Swap分区使用率(控制节点、计算节点)

现在服务器的内存一般是上百GB,所以我们可以把这个参数值设置的低一些(如10-30之间),让操作系统尽可能的使用物理内存,降低系统对swap的使用,从而提高宿主机系统和虚拟机的性能。

[root@controller  ~]# echo 'vm.swappiness=10' >>/etc/sysctl.conf

6 安装Kuryr-kubernetes

6.1 设置主机名,hosts文件(控制节点、计算节点)

控制节点

[root@controller  ~]#hostnamectl set-hostname controller
[root@controller  ~]#echo "controller"> /etc/hostname

计算节点根据节点名称修改

[root@compute  ~]#vim /etc/hosts
192.168.4.220 controller
192.168.4.221 compute

6.2 安装PIP(控制节点、计算节点)

因为在安装的过程会自动升级PIP至最新版本21.0,而PIP21.0在2021年初官方已经停止维护并且不再支持Python2和Python3,所以使用PIP21.0在安装的过程中会发生报错,必须降级安装指定版本PIP20.3.4。

官方链接:https://pip.pypa.io/en/stable/

[root@controller  ~]# wget https://bootstrap.pypa.io/2.7/get-pip.py
[root@controller  ~]# python get-pip.py
[root@controller  ~]# pip -V
pip 20.3.4 from /usr/lib/python2.7/site-packages/pip (python 2.7)

6.3 安装PIP编译环境(控制节点、计算节点)

[root@controller  ~]# yum install -y python-devel libffi-devel gcc openssl-devel libselinux-python

6.4 安装docker repo包(控制节点、计算节点)

[root@controller  ~]# tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
[root@controller  ~]#yum install -y docker-engine docker-engine-selinux

6.5 Git clone Devstack(控制节点、计算节点)

Devstack不允许直接使用Root用户运行,git拉取之后要先创建stack用户。

[root@controller  ~]# yum -y install git
[root@controller  ~]# git clone https://opendev.org/openstack-dev/devstack
[root@controller  ~]# git clone https://opendev.org/openstack/kuryr-kubernetes
[root@controller  ~]# ./devstack/tools/create-stack-user.sh
[root@controller  ~]# sudo su stack

6.6 修改配置文件(控制节点、计算节点)

修改各组件用户密码。

[root@controller  ~]# cp kuryr-kubernetes/devstack/local.conf.sample devstack/local.conf 
[root@controller  ~]# cat devstack/local.conf
# Credentials
ADMIN_PASSWORD=tera123
DATABASE_PASSWORD=tera123
RABBIT_PASSWORD=tera123
SERVICE_PASSWORD=tera123
SERVICE_TOKEN=tera123
# Enable Keystone v3
IDENTITY_API_VERSION=3
# In pro of speed and being lightweight, we will be explicit in regards to
# which services we enable
SERVICE_HOST=192.168.4.220
MYSQL_HOST=192.168.4.220
RABBIT_HOST=192.168.4.220
GLANCE_HOSTPORT=192.168.4.220:9292
Q_HOST=192.168.4.220
KEYSTONE_AUTH_HOST=192.168.4.220
KEYSTONE_SERVICE_HOST=192.168.4.220
CEILOMETER_BACKEND=mongodb
DATABASE_TYPE=mysql
ENABLED_SERVICES=n-cpu,n-net,n-api-meta,c-vol

6.7 Git clone拉取超时(控制节点、计算节点)

官方给出的Devstack脚本在安装的过程中Git clone是通过https加密获取的,可能会发生超时的问题,需要通过修改stackrc这个文件解决。

[root@controller  ~]# vi devstack/stackrc
BASE=${GIT_BASE:-http://opendev.org}
CINDER_REPO=${CINDER_REPO:-${GIT_BASE}/openstack/cinder.git}
CINDER_BRANCH=${CINDER_BRANCH:-$TARGET_BRANCH}
# image catalog service
GLANCE_REPO=${GLANCE_REPO:-${GIT_BASE}/openstack/glance.git}
GLANCE_BRANCH=${GLANCE_BRANCH:-$TARGET_BRANCH}
# django powered web control panel for openstack
HORIZON_REPO=${HORIZON_REPO:-${GIT_BASE}/openstack/horizon.git}
HORIZON_BRANCH=${HORIZON_BRANCH:-$TARGET_BRANCH}
# unified auth system (manages accounts/tokens)
KEYSTONE_REPO=${KEYSTONE_REPO:-${GIT_BASE}/openstack/keystone.git}
KEYSTONE_BRANCH=${KEYSTONE_BRANCH:-$TARGET_BRANCH}
# neutron service
NEUTRON_REPO=${NEUTRON_REPO:-${GIT_BASE}/openstack/neutron.git}
NEUTRON_BRANCH=${NEUTRON_BRANCH:-$TARGET_BRANCH}
# compute service
NOVA_REPO=${NOVA_REPO:-${GIT_BASE}/openstack/nova.git}
NOVA_BRANCH=${NOVA_BRANCH:-$TARGET_BRANCH}
# object storage service
SWIFT_REPO=${SWIFT_REPO:-${GIT_BASE}/openstack/swift.git}
SWIFT_BRANCH=${SWIFT_BRANCH:-$TARGET_BRANCH}
PLACEMENT_REPO=${PLACEMENT_REPO:-${GIT_BASE}/openstack/placement.git}
PLACEMENT_BRANCH=${PLACEMENT_BRANCH:-$TARGET_BRANCH}

6.8 软件包Timeout

在安装etcd等组件时,可能会发生Timeout等报错,这是因为网络问题需要手动wget到本地。

[root@controller  ~]#wget -c https://github.com/coreos/etcd/releases/download/v3.1.10/etcd-v3.1.10-linux-amd64.tar.gz

6.9 PIP not found

做软链接到stack用户的bin目录下。

[root@controller  ~]# which pip
/usr/local/bin/pip
[root@controller  ~]# ln -s /usr/local/bin/pip /opt/stack/.vnc/bin/

6.10 修改脚本所支持的Linux版本

修改Devstack脚本支持的Linux版本,官方给出的Devstack不支持Centos7.6,只支持Centos8,需要手动添加Linux rhel7。

[root@controller  ~]# vi devstack/stack.sh
SUPPORTED_DISTROS="bionic|focal|f31|f32|opensuse-15.2|opensuse-tumbleweed|rhel8|rhel7"
if [[ ! ${DISTRO} =~ $SUPPORTED_DISTROS ]]; then
    echo "WARNING: this script has not been tested on $DISTRO"
    if [[ "$FORCE" != "yes" ]]; then
        die $LINENO "If you wish to run this script anyway run with FORCE=yes"
    fi
fi

6.11 执行Devstack脚本

执行Devsyack安装脚本,脚本执行完成后会输出安装信息以及操作系统的版本信息。

[root@controller  ~]# ./devstack/stack.sh
DevStack Component Timing
 (times are in seconds)  
=========================
run_process           28
test_with_retry         4
apt-get-update         17
async_wait             0
osc                   482
wait_for_service        14
dbsync                77
pip_install             98
apt-get                9
-------------------------
Unaccounted time      951
=========================
Total runtime        1680
This is your host IP address: 192.168.4.220
This is your host IPv6 address: ::1
Keystone is serving at http://192.168.4.220/identity/
The default users are: admin and demo
The password: tera123
Services are running under systemd unit files.
For more information see: 
https://docs.openstack.org/devstack/latest/systemd.html
DevStack Version: wallaby
Change: 83821a11ac1d6738b63cb10878b8aaa02e153374 Merge "Address feedback from glance-remote patch" 2021-03-23 16:56:21 +0000
OS Version: CentOS Linux release 7.8.2003 (Core)

7 配置OpenStack-ironic

7.1 上传Deploy Images(控制节点)

镜像通过disk-image-create命令构建。

[root@controller  ~]# glance image-create --name deploy-vmlinuz --visibility public --disk-format aki --container-format aki < coreos_production_pxe.vmlinuz
[root@controller ~]# glance image-create --name deploy-initrd --visibility public --disk-format ari --container-format ari < coreos_production_pxe_image-oem.cpio.gz
[root@controller ~]# glance image-create --name my-image.vmlinuz --visibility public --disk-format aki --container-format aki < my-image.vmlinuz
[root@controller ~]# glance image-create --name my-image.initrd --visibility public --disk-format ari --container-format ari < my-image.initrd
[root@controller ~]# export MY_VMLINUZ_UUID=$(openstack image list | awk '/my-image.vmlinuz/ { print $2 }')
[root@controller ~]# export MY_INITRD_UUID=$(openstack image list | awk '/my-image.initrd/ { print $2 }')
[root@controller ~]# glance image-create --name my-image --visibility \
public --disk-format qcow2 --container-format bare --property \
kernel_id=$MY_VMLINUZ_UUID --property ramdisk_id=$MY_INITRD_UUID < my-image.qcow2

7.2 创建Ironic Node(控制节点)

创建一个执行 IPMI 的 Ironic Node。

[root@controller ~]# export IRONIC_API_VERSION=1.11
[root@controller ~]# export OS_BAREMETAL_API_VERSION=1.11
[root@controller ~]# openstack baremetal node create --driver ipmi --name node1

7.3 设备部署接口类型(控制节点)

设置部署接口类型,现在可支持ISCSI、Direct、Ansible等类型。

[root@controller ~]# openstack baremetal node list
设置部署接口类型
[root@controller ~]# openstack baremetal --os-baremetal-api-version 1.31 \
node set c83162c6-748f-4c90-840b-d5e07df83c97  \ 
--deploy-interface iscsi      --raid-interface agent

7.4 设置IPMI Info(控制节点)

这里主要配置IPMI的登录账户信息。

[root@controller ~]# openstack baremetal node set c83162c6-748f-4c90-840b-d5e07df83c97 \
                   --driver-info ipmi_username=ADMIN \
                   --driver-info ipmi_password=tera123 \
                   --driver-info ipmi_address=192.168.5.33

7.5 设置Deploy Images(控制节点)

通过RAMDisk的方式启动。

[root@controller ~]# openstack baremetal node set c83162c6-748f-4c90-840b-d5e07df83c97 \
                   --driver-info deploy_kernel=fcce4694-3955-40c8-be2f-c5ba890071ec \
                   --driver-info deploy_ramdisk= 0fbd622c-bb9e-4729-8cab-f2aae07a5814

7.6 设置Provisioning/Cleaning Network(控制节点)

[root@controller ~]# openstack baremetal node set c83162c6-748f-4c90-840b-d5e07df83c97 \
                   --driver-info cleaning_network= 3793d3bd-5a26-4dd2-a637-007b8ed7c2b0 \
--driver-info provisioning_network= 3793d3bd-5a26-4dd2-a637-007b8ed7c2b0

7.7 设置PXE网卡MAC地址(控制节点)

在Provisioning网络中通过这个MAC地址为Node分配IP地址。

[root@controller ~]# openstack baremetal port create ac:1f:6b:da:d9:c0 \
 --node c83162c6-748f-4c90-840b-d5e07df83c97

7.8 配置Resource Class(控制节点)

为Ironic node设置Placement筛选候选人的Resource Class类型,Nova-compute for Ironic会自动为其创建Placement Resource Provider。

[root@controller ~]# openstack --os-baremetal-api-version 1.21 baremetal node set c83162c6-748f-4c90-840b-d5e07df83c97 --resource-class BAREMETAL_TEST

7.9 设置Ironic Node基础信息(控制节点)

[root@controller ~]# openstack baremetal node set c83162c6-748f-4c90-840b-d5e07df83c97 \
--property cpus=48 --property memory_mb=131072 --property local_gb=1000
[root@controller ~]# openstack baremetal node set c83162c6-748f-4c90-840b-d5e07df83c97 \
--property capabilities='boot_mode:bios'

7.10 验证Ironic Node纳管(控制节点)

[root@controller ~]# openstack baremetal --os-baremetal-api-version 1.11 node manage c83162c6-748f-4c90-840b-d5e07df83c97
[root@controller ~]# openstack baremetal --os-baremetal-api-version 1.11 node provide c83162c6-748f-4c90-840b-d5e07df83c97
[root@controller ~]# openstack baremetal node show c83162c6-748f-4c90-840b-d5e07df83c97\
| grep provision_state
| provision_state        | available

7.11 创建实例Flavor(控制节点)

[root@controller ~]# openstack flavor create --ram 131072 --vcpus 48 --disk 100 my-baremetal-flavor
[root@controller ~]# openstack flavor set --property resources:CUSTOM_BAREMETAL_TEST=1 my-
baremetal-flavor
[root@controller ~]# openstack flavor set --property resources:VCPU=0 my-baremetal-flavor 
[root@controller ~]# openstack flavor set --property resources:MEMORY_MB=0 my-baremetal-flavor 
[root@controller ~]# openstack flavor set --property resources:DISK_GB=0 my-baremetal-flavor

8 实例部署

8.1 部署Baremetal Node(控制节点)

[root@controller ~]# openstack server create --flavor my-baremetal-flavor \ 
--nic net-id=3793d3bd-5a26-4dd2-a637-007b8ed7c2b0 \
--image 08e111be-d256-4c43-bb07-ea65a1219f77 Bare

8.2 部署VM(控制节点)

[root@controller ~]# openstack server create –flavor my-vm-flavor\ 
--nic net-id=38795737-afc4-4ecf-b023-434ee4e327f9 \
--image fd697710-f267-429e-8bdd-62870f86291e VM

8.3 部署Pod(控制节点)

[root@controller ~]# kubect create deployment demo --image=celebdor/kuryr-demo
Deployment “demo” created
[root@controller ~]# kubectl scale deploy/demo --deplices=2
deployment.apps/demo scaled

8.4 验证部署结果(控制节点)

[root@controller ~]# openstack server list
 openstack server list
[root@controller ~]# kubectl get pod -o wide 
kubectl get pod -o wide
[root@controller ~]# openstack port list |awk '/10.0.0.106|10.0.0.109/'
openstack port list

9 验证通信

9.1 Pod与Pod(控制节点)

[root@controller ~]# kubect create deployment demo --image=celebdor/kuryr-demo
Deployment “demo” created
[root@controller ~]# kubectl scale deploy/demo --deplices=2
deployment.apps/demo scaled
[root@controller ~]# kubectl exec -it demo-cdb8599db-blv8j -- ping 10.0.0.109
 Pod与Pod(控制节点)

9.2 Pod与VM(控制节点)

[root@controller ~]# kubectl exec -it demo-cdb8599db-blv8j -- ping 10.0.0.49
Pod与VM(控制节点)

9.3 Pod与Bare Metal(控制节点)    

[root@controller ~]# kubectl exec -it demo-cdb8599db-blv8j -- ping 192.168.4.8
Pod与Bare Metal(控制节点)    

10 参考资料

更多内容请参考:A-Lab

OpenStack-Helm部署方案——AIO模式

1 目标

本文档以Ubuntu 18为基础操作环境,简要介绍OpenStack-Helm项目的基本概念,以及以All in one模式部署的具体方法。

2 概要介绍

OpenStack项目各组件本已纷繁复杂,再使用Kubernetes去部署承载OpenStack的各组件就更加复杂了。而Helm最大的优势就是对Kubernetes复杂应用的管理,Helm就相当于Linux的包管理工具YUM,只是它管理的“程序包”是一些互相耦合、打包后的YAML配置文件与资源文件。使用一个更容理解的类比,即在Kubernetes中使用Helm来部署管理Chart,就相当于在安卓手机中使用应用商店来安装管理APP。

Helm相关组件、概念以及原理:

Helm包含两个重要组件,分别是Helm客户端和Tiller服务器。

  • Helm是一个命令行工具,用于本地开发及管理Chart、Chart仓库等;
  • Tiller是Helm的服务端。Tiller负责接收Helm的请求,与K8S的 APIServer进行交互,根据Chart来生成 Release并管理Release的整个生命周期;
  • ChartHelm的打包格式叫做Chart,所谓Chart就是一系列配置文件, 它描述了一组相关的K8S集群资源;
  • Release使用helm install命令在Kubernetes集群中部署的Chart称为Release;
  • RepoistoryHelm Chart的仓库,Helm客户端通过HTTP协议来访问仓库中Chart的索引文件和压缩包。

下图描述了Helm的几个关键组件Helm、Tiller、Repository、Chart之间的关系以及它们之间的工作流程。

Helm的关键组件

OpenStack-Helm这个项目最主要的工作就是进行OpenStack各组件的Chart开发,将各个组件封装为不同的Chart,在运维OpenStack的过程中,不再管理具体的程序进程、容器或者是K8S的Pod,而是直接管理更粗粒度的Release,以尽可能降低OpenStack在K8S上的部署、运维的复杂度。

3 环境准备

3.1 系统版本

  • 操作系统:Ubuntu 18.04.5 LTS (bionic);

3.2 节点配置与部署模式

主机名IP地址处理器内存硬盘节点角色
noone-virtual-machine192.168.2.233 管理口16C32G200G 系统盘All in one
表3.1:各节点配置与角色

为了OpenStack-Helm项目的快速部署、验证与研究,本次部署采用AIO(All in one)模式,因此需要注意的是,若要安装所有的功能模块至少保证服务器的内存资源不小于16G,否则可能会导致部署失败。

3.3 实施部署前的环境准备

进行实施部署前的环境准备工作,包括系统基础环境和网络代理配置。

  • 配置Sudo免密:
noone@noone-virtual-machine:~$ chmod +w /etc/sudoers
noone@noone-virtual-machine:~$ sudo vim /etc/sudoers
noone@noone-virtual-machine:~$ sudo cat /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults	env_reset
Defaults	mail_badpass
Defaults	secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root	ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo	ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:
noone	ALL=(ALL) NOPASSWD:ALL

#includedir /etc/sudoers.d
noone@noone-virtual-machine:~$
  • 配置Ubuntu的软件源列表、更新系统中的软件包:
noone@noone-virtual-machine:~$ cd /etc/apt/
noone@noone-virtual-machine:/etc/apt$ cat sources.list
deb http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse
noone@noone-virtual-machine:/etc/apt$ sudo apt update
noone@noone-virtual-machine:/etc/apt$ sudo apt upgrade
  • 安装Git工具,拉取项目文件:
noone@noone-virtual-machine:~$ mkdir openstack
noone@noone-virtual-machine:~/openstack$ sudo apt-get install git
noone@noone-virtual-machine:~/openstack$ vim git-clone-helm.sh
noone@noone-virtual-machine:~/openstack$ cat git-clone-helm.sh
#!/bin/bash
set -xe

git clone https://opendev.org/openstack/openstack-helm-infra.git
git clone https://opendev.org/openstack/openstack-helm.git
noone@noone-virtual-machine:~/openstack$ bash git-clone-helm.sh
  • 安装配置代理工具,用于代理终端命令行工具产生的流量(Docker镜像拉取):

安装代理软件:

noone@noone-virtual-machine:~$ sudo apt install privoxy

编辑代理软件的配置文件:

noone@noone-virtual-machine:~$ sudo vim /etc/privoxy/config
......
#      Suppose you are running Privoxy on an IPv6-capable machine and
#      you want it to listen on the IPv6 address of the loopback
#      device:
#
#        listen-address [::1]:8118
#
listen-address  127.0.0.1:8118
listen-address  [::1]:8118
#
......
#      To chain Privoxy and Tor, both running on the same system, you
#      would use something like:
#
#        forward-socks5t   /               127.0.0.1:9050 .
#
注释:
此处的配置,将本地转发到8118端口的流量,转发到192.168.0.60:10808,此接口是局域网中代理软件提供的
forward-socks5 / 192.168.0.60:10808 .
#
#      Note that if you got Tor through one of the bundles, you may
#      have to change the port from 9050 to 9150 (or even another
#      one). For details, please check the documentation on the Tor
#      website.
#
#      The public Tor network can't be used to reach your local
#      network, if you need to access local servers you therefore
#      might want to make some exceptions:
#
#        forward         192.168.*.*/     .
#        forward            10.*.*.*/     .
#        forward           127.*.*.*/     .
#
forward         192.168.*.*/     .
forward            10.*.*.*/     .
forward           127.*.*.*/     .
forward           172.24.*.*/    .
#
......
#  Examples:
#
#      forwarded-connect-retries 1
#
forwarded-connect-retries  1
#
......

重启代理软件并设置为开机自启:

noone@noone-virtual-machine:~$ sudo systemctl enable privoxy
noone@noone-virtual-machine:~$ sudo systemctl restart privoxy

在.bashrc文件末尾追加环境变量配置,使得命令行工具产生的流量转发给Privoxy软件进行处理:

noone@noone-virtual-machine:~$ vim ~/.bashrc 
export ftp_proxy="127.0.0.1:8118"
export http_proxy="127.0.0.1:8118"
export https_proxy="127.0.0.1:8118"
export no_proxy="localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,172.24.0.0/12,192.168.0.0/16,172.17.0.1,
.svc.cluster.local"

命令行工具流量代理的效果测试:

noone@noone-virtual-machine:/tmp$ wget www.google.com
--2021-03-24 10:21:45--  http://www.google.com/
Connecting to 127.0.0.1:8118... connected.
Proxy request sent, awaiting response... 200 OK
Length: 12823 (13K) [text/html]
Saving to: ‘index.html’

index.html                                                  100%[=====>]  12.52K  --.-KB/s    in 0s      

2021-03-24 10:21:47 (187 MB/s) - ‘index.html’ saved [12823/12823]

noone@noone-virtual-machine:/tmp$
  • 修改NSSwitch配置文件指定行:
noone@noone-virtual-machine:~$ cat /etc/nsswitch.conf 
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.
……

hosts:          files dns

……
noone@noone-virtual-machine:~$

4 安装步骤

此次为AIO模式部署,因此所有的OpenStack组件的容器都部署在同一节点,由于网络环境影响,即使配置了代理也会经常有网络抖动、中断,因此在执行脚本过程中若因网络导致失败,可以多重复执行几次。工作目录如下:

noone@noone-virtual-machine:~$ cd openstack/openstack-helm
noone@noone-virtual-machine:~/openstack/openstack-helm$ pwd
/home/noone/openstack/openstack-helm

4.1 部署Kubernetes、Helm

./tools/deployment/developer/common/010-deploy-k8s.sh
./tools/deployment/developer/common/020-setup-client.sh

4.2 部署Ingress Controller

./tools/deployment/component/common/ingress.sh

4.3 部署NFS Provisioner

./tools/deployment/developer/nfs/040-nfs-provisioner.sh

4.4 部署MariaDB

./tools/deployment/developer/nfs/050-mariadb.sh

4.5 部署RabbitMQ

./tools/deployment/developer/nfs/060-rabbitmq.sh

4.6 部署Memcached

./tools/deployment/developer/nfs/070-memcached.sh

4.7 部署Keystone

编辑此脚本文件,注释掉replace_variables函数的所有调用:

/home/noone/openstack/openstack-helm/tools/deployment/common/get-values-overrides.sh

然后,再执行相关脚本:

./tools/deployment/developer/nfs/080-keystone.sh

4.8 部署Heat

./tools/deployment/developer/nfs/090-heat.sh

4.9 部署Horizon

./tools/deployment/developer/nfs/100-horizon.sh

4.10 部署Glance

./tools/deployment/developer/nfs/120-glance.sh

4.11 部署OpenvSwitch

./tools/deployment/developer/nfs/140-openvswitch.sh

4.12 部署Libvirt

./tools/deployment/developer/nfs/150-libvirt.sh

4.13 部署Compute Kit (Nova and Neutron)

./tools/deployment/developer/nfs/160-compute-kit.sh

4.14 配置外部网络访问网关

./tools/deployment/developer/nfs/170-setup-gateway.sh

4.15 部署结果验证

确保各个OpenStack组件的Pod都达到预期状态,如果有部分容器启动失败,可以借助Kuboard进一步调试。

noone@noone-virtual-machine:~/openstack/openstack-helm$ kubectl -n openstack get deployment
NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
glance-api                    1/1     1            1           8d
glance-registry                1/1     1            1           8d
heat-api                      1/1     1            1           9d
heat-cfn                      1/1     1            1           9d
heat-engine                   1/1     1            1           9d
horizon                       1/1     1            1           9d
ingress                       1/1     1            1           9d
ingress-error-pages            1/1     1            1           9d
keystone-api                  1/1     1            1           9d
mariadb-ingress               2/2     2            2           9d
mariadb-ingress-error-pages    1/1     1            1           9d
memcached-memcached       1/1     1            1           9d
neutron-server                 1/1     1            1           8d
nova-api-metadata             1/1     1            1           8d
nova-api-osapi                 1/1     1            1           8d	
nova-conductor                1/1     1            1           8d
nova-consoleauth              1/1     1            1           8d
nova-novncproxy               1/1     1            1           8d
nova-scheduler                1/1     1            1           8d
placement-api                 1/1     1            1           8d
noone@noone-virtual-machine:~/openstack/openstack-helm$

在确认各个容器启动成功后,使用Ingress提供的URL访问OpenStack Horizon。

noone@noone-virtual-machine:~/openstack/openstack-helm$ kubectl -n openstack get ingress
……
horizon        <none>        horizon,horizon.openstack,horizon.openstack.svc.cluster.local
……
OpenStack Horizon的Web界面

为进一步确保OpenStack基础功能运行正常,创建两台虚拟机,进行通讯测试。

创建两台虚拟机进行通讯测试
测试结果

成功创建了两台虚拟机,虚拟机可以正常启动,并在使用VxLAN网络创建的VPC下成功互通,结果符合预期。

5 Kubernetes可视化管理面板安装

在整个部署过程中,会产生各种意料之外的容器错误,为了方便排错,安装可视化管理面板进行日志分析错误定位。

noone@noone-virtual-machine:~/openstack$ vim deploy-kuboard.sh
noone@noone-virtual-machine:~/openstack$ cat deploy-kuboard.sh
#!/bin/bash

sudo docker run -d \
  --restart=unless-stopped \
  --name=kuboard \
  -p 10080:80/tcp \
  -p 10081:10081/udp \
  -p 10081:10081/tcp \
  -e KUBOARD_ENDPOINT="http://192.168.2.233:10080" \
  -e KUBOARD_AGENT_SERVER_UDP_PORT="10081" \
  -e KUBOARD_AGENT_SERVER_TCP_PORT="10081" \
  -v /root/kuboard-data:/data \
  eipwork/kuboard:v3
# 国内可以使用镜像 swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3 ,以更快地完成下载
# 请不要使用 127.0.0.1 或者 localhost 作为内网 IP,默认用户名密码:admin/Kuboard123
noone@noone-virtual-machine:~/openstack$ bash deploy-kuboard.sh

待所有Kuboard容器正常启动后,使用默认用户名密码进行登录,界面如下图所示,集群导入管理等操作不再赘述。

Kubernetes多集群管理登录界面
集群导入管理

6 参考资料

【1】 OpenStack-Helm Document

【2】 External DNS to FQDN/Ingress

【3】 Privoxy在Ubuntu-18中的安装与配置

【4】 Fix(script): removes replacement overrides

更多内容请参考:A-Lab

Harbor容器镜像仓库高可用方案

1 Harbor简介

Docker容器应用的开发和运行离不开可靠的镜像管理,Docker官方提供了原生的Registry,但其功能比较简单,而且没有可视化界面,自然无法满足企业级的需求。虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署私有环境内的Registry也是非常必要的。

为了解决以上需求,VMware公司推出了Harbor,Harbor 是为企业用户设计的容器镜像仓库开源项目,包括了权限管理(RBAC)、LDAP、安全漏洞扫描、镜像验真、管理界面、自我注册、HA 等企业必需的功能。

2 Harbor架构图

Harbor架构图

3 Harbor必要组件

  • Proxy:用于转发用户的请求到后端的反向代理,通过Nginx官方镜像实现
  • Registry:原生的Docker镜像仓库,负责存储镜像文件,实现Pull/Push等功能
  • Database:保存项目/用户/角色/复制策略等信息到数据中,这里使用的镜像是Postgres数据库,而不是传统的Mariadb/Mysql
  • Core Service:提供图形化操作界面,帮助用户管理Registry上的镜像,并对用户进行授权
  • Job Services:镜像复制,用户可以配置在Harbor实例之间进行镜像的复制和同步等操作
  • Log Collector:日志收集,负责收集各个镜像的日志进行统一管理

4 Harbor虚机配置

主机系统IP地址节点角色
Harbor-1Centos7.6192.168.4.200Master
Harbor-2Centos7.6192.168.4.201Worker

服务器具体配置要求如下:

  • 至少2G内存
  • 至少2核CPU
  • 磁盘至少100G

5 系统优化

主机的优化不单纯只是软硬件的优化,基于操作系统的性能优化也是多方面的,可以从几个方面进行衡量,以更好的提高主机的性能。

5.1 关闭SELinux(Master、Worker)

SELinux不关闭的情况下无法实现,会限制ssh免密码登录。

[root@harbor ~]# setenforce 0
[root@harbor ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

5.2 关闭防火墙(Master、Worker)

防止安装时出现各个组件的端口不能访问的问题。

[root@harbor ~]# systemctl stop firewalld && systemctl disable firewalld       

5.3 时间同步(Master、Worker)

同步时间可以有效解决因时间不同而造成的不同步。

[root@harbor ~]# yum -y install ntp
[root@harbor ~]# ntpdate ntp1.aliyun.com
[root@harbor ~]# timedatectl set-timezone Asia/Shanghai

5.4 修改系统打开文件最大数量(Master、Worker)

放开系统打开文件最大数量,防止因达到上限值而导致的进程终止。

[root@harbor ~]# vi /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

6 环境准备

两台机器需要事先安装好Docker、Docker-compose,并且将Harbor安装脚本下载到本地。

6.1 安装Docker(Master、Worker)

添加Docker Yum源,安装Docker组件。

[root@harbor ~]# yum install -y yum-utils
[root@harbor ~]# yum-config-manager --add-repo \
               https://download.docker.com/linux/centos/docker-ce.repo
[root@harbor ~]# yum -y install docker-ce docker-ce-cli containerd.io
[root@harbor ~]# systemctl start docker
[root@harbor ~]# systemctl enable docker

6.2 下载Harbor离线安装包(Master、Worker)

在Github下载离线安装包:https://github.com/goharbor/harbor/releases(推荐使用迅雷下载)

下载离线安装包

7 部署Harbor

7.1 配置Harbor(Master、Worker)

将下载的Harbor压缩包上传到Master和Woker节点,修改Harbor配置文件。

[root@harbor ~]# tar -zxvf harbor-offline-installer-v2.0.2.tgz
[root@harbor ~]# cd harbor
[root@harbor harbor]# cp harbor.yml.tmpl  harbor.tml
[root@harbor harbor]# vi harbor.yml
# 修改为当前所在节点的ip
hostname: 192.168.4.200
# 登录界面的密码
harbor_admin_password: tera123
# harbor的版本号
_version: 2.0.2
# 将https相关的配置给注释掉,这里为了简单只使用http,而且也可以在nginx那一层去做https
#https related config
# https:
#  https port for harbor, default is 443
#  port: 443
#  The path of cert and key files for nginx
#  certificate: /your/certificate/path
#  private_key: /your/private/key/path

7.2 安装Harbor(Master、Worker)

准备好配置文件后,安装docker-compose,因为Harbor的安装脚本基于docker-compose去安装的。

[root@harbor harbor]# curl -L \
 "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
[root@harbor harbor]# chmod 755 /usr/local/bin/docker-compose
[root@harbor harbor]# ./install.sh

7.3 访问Harbor

安装完成之后,使用浏览器访问Harbor,可以进入登录页面。默认账户admin。

进入登录页面
项目界面

8 Harbor高可用方案

本次采用的高可用方案是Harbor的主备复制,需要两个Harbor节点。Master和Worker之间能够互相复制,然后通过Nginx代理Harbor Master节点提供外部访问。这里采用的高可用方案是分钟级的,主要是通过Nginx代理Master节点,当Master节点挂掉后手动的修改Nginx配置文件去代理另一个可用节点。

高可用方案一般选用开源的Keepalived+Nginx,而本次方案并没有采用Keepalived的原因主要有两个:

  • 我们的虚机是部署在OpenStack上的,云环境基本无法使用Keepalived,云服务商一般也不支持自定义外网可访问的虚拟IP,当然部署在内网物理服务器上是可以使用Keepalived的。
  • 两个Harbor节点之间的同步是存在延时的,而且镜像通常都比较大,所以这个延迟会非常的明显。一般镜像推送完马上就会调度拉取,所以这个延迟时间一般是不可接受的。如果让Nginx代理两个节点就会出现一会请求A一会请求B的问题,造成镜像Pull/Push不成功。但由于Harbor是给公司内部的开发人员使用,通常可以允许分钟级别的不可用。

9 Harbor高可用部署

Harbor在部署好之后组件中包含了Nginx并且占用了宿主机的80端口,我们通过修改Harbor安装脚本的YAML文件来修改Nginx占用宿主机端口,并且拉取新的Nginx容器反向代理Master节点。Master节点和Worker节点之间配置主从复制,以达到Harbor分钟级高可用的目的。

9.1 删除Harbor容器(Master)

强制删除Master节点创建的所有Harbor容器,容器在创建之前已经做了文件夹的映射,数据不会丢失。

[root@harbor harbor]# docker rm -f `docker ps  |awk '{print $1}' |grep -v CON`

9.2 修改部署文件(Master)

修改YAML文件中Proxy组件Nginx服务的端口映射。

[root@harbor harbor]# vi docker-compose.yml
  proxy:
    image: goharbor/nginx-photon:v2.0.2
    container_name: nginx
    restart: always
    cap_drop:
      - ALL
    cap_add:
      - CHOWN
      - SETGID
      - SETUID
      - NET_BIND_SERVICE
    volumes:
      - ./common/config/nginx:/etc/nginx:z
      - type: bind
        source: ./common/config/shared/trust-certificates
        target: /harbor_cust_cert
    networks:
      - harbor
    dns_search: .
    ports:
      - 8888:8080
    depends_on:
      - registry
      - core
      - portal
      - log
    logging:
      driver: "syslog"
      options:
        syslog-address: "tcp://127.0.0.1:1514"
        tag: "proxy"

9.3 重新部署Harbor容器(Master)

手动使用docker-compose重新部署Harbor容器,不能使用安装脚本部署。

[root@harbor harbor]# docker-compose up -d

9.4 部署Nginx反向代理(Master)

[root@harbor ~]# mkdir nginx
[root@harbor ~]# cd nginx
[root@harbor nginx]# vi nginx.conf
user nginx;
worker_processes 2;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
    worker_connections 1024;
}
stream {
    upstream hub{
        server 192.168.4.200:8888;
    }
    server {
        listen 80;
        proxy_pass hub;
        proxy_timeout 300s;
        proxy_connect_timeout 5s;
    }
} 
[root@harbor nginx]# docker run -itd --net=host --name harbor-nginx \
 -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf nginx

9.5 配置Harbor节点主从复制

浏览器登录Harbor,配置Harbor节点之间的复制功能,使两个节点能够同步镜像数据。

首先到Master节点的”仓库管理”界面中创建一个新的目标,目标是Worker节点。

创建一个新的目标

然后到”复制管理”界面中新建复制规则。

新建复制规则

10 验证

搭建好Harbor之后,测试能否正常使用。将默认的Library项目删除掉,然后创建新的项目。

10.1 创建项目

填写项目名称、访问级别以及项目仓库的存储容量。

新建项目

10.2 Pull/Push镜像(Master、Worker)

在服务器上测试镜像的Pull和Push。由于搭建的私有仓库默认是不受Docker信任的,所以需要修改配置文件让Docker信任该Registry。

[root@harbor ~]# vi /etc/docker/daemon.json
{
  "insecure-registries": ["192.168.4.200"]
}
[root@harbor ~]# systemctl restart docker
[root@harbor ~]# docker login 192.168.4.200
Username: admin
Password: 
Login Succeeded
[root@harbor ~]# docker tag nginx:latest 192.168.4.200/asterfusion/nginx:latest
[root@harbor ~]# docker push nginx:latest 192.168.4.200/asterfusion/nginx:latest

11 Harbor权限管理

11.1 创建用户

在Harbor管理页面创建用户,并且填写相关信息。创建完成之后可以选择设置用户为管理员,之后就可以通过登录此用户来配置管理Harbor。

创建用户
设置管理员

11.2    登录用户拉取镜像

使用刚创建的用户登录,拉取镜像会失败。因为Harbor的权限管理机制,没有经过授权无法随意拉取镜像,我们需要将创建的用户添加到镜像仓库中去,才可以拉取镜像。

[root@harbor ~]# docker login 192.168.4.200
Username: asterfusion
Password: 
Login Succeeded
[root@harbor ~]# docker pull \
192.168.4.200/asterfusion/redis@sha256:2510920e4faef376509a41bbfe58ea62f3e3e1c0dbcfca579581909b279ebaaa
Trying to pull repository 192.168.4.200/asterfusion/redis ... 
unauthorized: unauthorized to access repository: asterfusion/redis, action: pull: unauthorized to access repository: asterfusion/redis, action: pull

11.3    镜像仓库添加用户

在镜像仓库中添加新用户,并且选择用户的角色,在这里我们需要对镜像作Push和Pull操作。

新建成员

11.4    验证

[root@harbor ~]# docker login 192.168.4.200
Username: asterfusion
Password: 
Login Succeeded
[root@harbor ~]# docker pull\
192.168.4.200/asterfusion/redis@sha256:2510920e4faef376509a41bbfe58ea62f3e3e1c0dbcfca579581909b279ebaaa
Trying to pull repository 192.168.4.200/asterfusion/redis ... 
sha256:2510920e4faef376509a41bbfe58ea62f3e3e1c0dbcfca579581909b279ebaaa: Pulling from 192.168.4.200/asterfusion/redis
07cd1d2c25e7: Pull complete 
4319f9523628: Pull complete 
286473b88c0c: Pull complete 
d42081d9071a: Pull complete 
f945dcaa9608: Pull complete 
Digest: sha256:2510920e4faef376509a41bbfe58ea62f3e3e1c0dbcfca579581909b279ebaaa
Status: Downloaded newer image for     
 192.168.4.200/asterfusion/redis@sha256:2510920e4faef376509a41bbfe58ea62f3e3e1c0dbcfca579581909b279ebaaa

12 Harbor镜像漏洞扫描

镜像安全是容器化建设中一个很重要的环节,在Harbor中集成了开源项目Clair的扫描功能,可以帮助用户发现容器镜像中的安全漏洞,及时采取防范措施。

12.1 添加扫描模块(Master)

[root@harbor harbor]# ./prepare –with-clair
[root@harbor harbor]# docker-compose -f docker-compose.yml up -d

12.2 新建扫描器

在审查服务中新建扫描器。

编辑扫描器

12.3 测试扫描

编辑好定时规则之后,我们可以手动进行漏洞扫描

漏洞扫描

12.4 查看扫描结果

可以看到我们的测试镜像中有一个发现了漏洞,通过日志可以看到具体的ERROR信息。

查看扫描结果
日志信息

13 参考文献

Harbor官方文档:https://goharbor.io/docs/2.0.0/install-config/

Docker官方文档:https://docs.docker.com/engine/install/centos/

GitHub仓库地址:https://github.com/goharbor/harbor/wiki

更多内容请参考:A-Lab

Rancher-Kubernetes容器化部署方案

1 Rancher简介

Rancher是一套容器管理平台,它可以帮助组织在生产环境中轻松快捷的部署和管理容器。 Rancher可以轻松地管理各种环境的Kubernetes,满足IT需求并为DevOps团队提供支持。

Kubernetes手动部署非常复杂,Rancher容器化部署相对来说比较简单,并且Rancher支持Web端管理Kubernetes,而Kubernetes原生的Dashboard只提供监控。

2 Kubernetes简介

Kubernetes已成为容器集群管理标准,通过YAML文件来管理配置应用程序容器和其他资源。Kubernetes执行诸如调度,扩展,服务发现,健康检查,密文管理和配置管理等功能。

3 组件

  一个Rancher-Kubernetes集群由多个节点组成:

  • Etcd database:通常在一个节点上运行一个etcd实例,存储K8s中IP地址等信息
  • Rancher-server:Rancher管理平台,用户通过Rancher Web端配置K8s集群
  • Master nodes:K8s主节点是无状态的,用于运行API Server,调度服务和控制器服务
  • Worker nodes:K8s工作负载节点,运行容器

4 Rancher-K8s对比源码K8s

优点:

  • 采用图形化方式:易用的Web管理界面,在Docker易用性的基础上,再一次降低了使用容器技术部署容器应用的难度
  • 支持多种调度器:通过环境模板,很容易地创建和部署Swarm、K8S容器集群管理调度平台
  • 管理主机集群:管理对象是多台主机的集群,而不仅仅是单台容器主机,创建和管理几台、几十台应用服务器集群,只需要复制粘贴就解决了
  • 内置应用商店:使用其中的应用模板,创建一个WordPress博客系统,只需点点鼠标,部署简单
  • 资源弹性分配内置应用负载均衡器,“服务”最小只需1个容器实例,当负载不够/或过剩时,只需点点鼠标,增加/减少“服务”中容器的实例数,即可解决问题,应用系统具有天生的弹性扩容能力。

缺点:

  • K8S部署的问题由于国内网络和国外网络访问的问题,在国内部署K8S集群,有点不方便
  • 应用商店的问题默认的Rancher官方认证和社区贡献的应用商店内容有限,应用还不够丰富,基本上都是网络和存储等基础的应用;个别应用部署后,无法通过相同的操作,再部署同样的另一套应用,比如Rancher NFS
  • 故障拍错的问题:因为Rancher-K8s是一键打包部署好的,组件容器化,如果遇到问题会为排障带来很大的困难

5 环境准备

本次部署三台Server,一台作为Rancher-server,一台作为Master,另一台为Worker节点。服务器具体配置如下:

  • 1个千兆网口
  • 至少8G内存
  • 磁盘至少40G
  • Rancher-server:192.168.4.210
  • Master:192.168.4.211
  • Worker:192.168.4.212

6 部署过程

6.1 关闭SELinux 【所有节点】

SeLinux不关闭会发生无法访问的情况。

[root@localhost  ~]# setenforce 0
[root@localhost  ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

6.2 关闭防火墙【所有节点】

防止安装时出现各个组件的端口不能访问的问题。

[root@localhost  ~]#systemctl stop firewalld && systemctl disable firewalld                          

6.3 设置主机名【所有节点】

Rancher-server。

[root@localhost ~]# hostname rancher
[root@localhost ~]# echo “rancher” > /etc/hostname

Master

[root@localhost ~]# hostname master
[root@localhost ~]# echo “master” > /etc/hostname

Worker

[root@localhost ~]# hostname worker
[root@localhost ~]# echo “worker” > /etc/hostname

6.4 安装Git【Rancher节点】

安装Git拉取GitHub文件。

[root@localhost  ~]# yum -y install epel-release
[root@localhost  ~]# yum -y install git
[root@localhost  ~]# git clone https://github.com/yx464050145/Ansible-Rancher.git

6.5 安装Ansible【Rancher节点】

Rancher使用Ansible脚本自动化安装,并且修改Ansible配置文件。

[root@localhost  ~]# yum -y install ansible
[root@localhost  ~]# vi /etc/ansible/ansible.cfg
[defaults]
host_key_checking = False

6.6 修改Rancher-ansible配置文件【Rancher节点】

[root@localhost  ~]# vi /root/Ansible-Rancher/inventory/hosts
[rancher]
192.168.4.210 ansible_ssh_user='root' ansible_ssh_pass='tera123'   
[master]
192.168.4.211 ansible_ssh_user='root' ansible_ssh_pass='tera123'
[worker]
192.168.4.212 ansible_ssh_user='root' ansible_ssh_pass='tera123'

[root@localhost  ~]# vi /root/Ansible-Rancher/rancher_server/vars/main.yml
# defaults file for rancher
rancher_name: 'rancher_server'
rancher_port: 80
rancher_image: rancher/rancher:stable
rancher_data: /var/rancher
rancher_ssl_ports: 443
rancher_url: https://192.168.4.210
rancher_admin_password: "tera123"
validate_certs: false

[root@localhost  ~]# vi /root/Ansible-Rancher/rancher_master/vars/main.yml
# defaults file for rancher
rancher_url: https://192.168.4.210
rancher_admin_password: "tera123"
validate_certs: false
rancher_network_provider: "calico"
rancher_cluster_name: asterfusion
rancher_master_role: "--etcd --controlplane"
rancher_project_name: "asterfusion"

[root@localhost  ~]# vi /root/Ansible-Rancher/rancher_worker/vars/main.yml
rancher_url: "https://192.168.4.210"
rancher_admin_password: "tera123"
validate_certs: false
rancher_network_provider: "calico"
rancher_cluster_name: asterfusion
rancher_worker_role: "--worker"

6.7 Ansible-playbook部署Rancher集群【Rancher节点】

[root@localhost  ~]# cd /root/Ansible-Rancher
[root@localhost  ~]# ansible-playbook -i inventory/hosts rancher.yml

6.8 Rancher Web

Rancher Web

6.9 Rancher K8s集群

图中可以看出K8s集群部署完成,Master上部署了etcd、control,Worker部署容器。

K8s集群部署

6.10 部署Pod

  • 名称:Pod名字(必填)
  • Docker镜像:容器镜像(必填)
  • 端口映射:端口映射规则和网络模式,如果不需要外网访问可以不填(选填)
  • 类型:Pod类型(必填)

下图Nginx Pod已经部署好了

Nginx Pod部署

6.11 Kubelet命令行

Kubelet命令行

6.12 报错问题

部署过程中如果速度太慢并且报错,是因为网络原因导致拉取镜像失败或者超时。可以选择拷贝镜像到各个节点中免去拉取镜像的过程。在部署完成后耐心等待所有容器组件状态正常才可部署Pod。

7 参考资料

  1. Rancher官网:https://rancher.com/docs/rancher/v2.x/en
  2. Kubernetes官网:https://kubernetes.io/

更多内容请参考:A-Lab

OpenStack Zun部署方案

1 目标与物理网络拓扑

本文主要描述在现有OpenStack(rocky版)平台上如何扩展安装Zun功能组件,实现容器管理服务。

涉及物理拓扑,如图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
OpenStackRocky 
表3:软件环境

3 Zun简介

Zun是OpenStack容器服务。它旨在为运行应用程序容器提供API服务,而无需管理服务器或集群。

它集成了Neutron、Cinder、Keystone等核心OpenStack服务,实现了 容器的快速普及。通过这种方式,OpenStack的所有原始网络、存储和识别验证工具都应用于容器系统,使容器能够满足安全性和合规性要求。

目前,OpenStack拥有以下支持容器技术的主流解决方案:

  • Nova Docker驱动程序

该解决方案将容器作为VM运行。添加Nova Docker驱动程序以执行与常规VM类似的操作, 以启动、停止或创建Docker容器。由于Docker和VM之间的差异,这种操作模式将禁用容器的许多功能,例如容器相关和端口映射。

  • Magnum

Magnum是一个OpenStack服务,提供容器集群部署功能。Magnum通过Heat部署VM和裸金属,形成集群,然后调用COE接口完成容器的部署。在Magnum成立之初,该项目以“容器即服务”(CaaS)为目标。在以后的开发过程中,Magnum的大部分功能都集中在容器的集群部署上。

  • Zun

Zun将容器作为一种OpenStack资源进行管理,并集成了OpenStack的其他服务,为用户提供统一、简化的API。用户可以通过API创建和管理容器,而不需要考虑不同容器技术之间的差异。

集成OpenStack服务的优点是用户可以借助OpenStack的现有功能扩展容器的功能。例如,默认情况下,Zun容器可以使用Neutron分配的IP地址,并可以使用Keystone提供的身份验证服务。使用Zun和Neutron,用户可以在Nova实例所在的隔离网络环境中创建容器。VM的Neutron功能(安全组、QoS)也可用于Zun容器。在实际业务中,经常有需要长时间保存数据的场景。常用方法是使用外部服务为容器提供持久卷。Zun通过与OpenStack Cinder 集成解决了这个问题。创建容器时,用户可以选择将Cinder卷安装到容器中。Cinder卷可以是租户中现有的或新创建的卷。每个卷都将绑定到容器文件系统路径,并且将保留该路径下存储的数据。对于编排,与提供内置编排的其他容器平台不同,Zun使用外部编排系统来实现此目的,例如Heat和Kubernetes。借助外部编排工具,最终用户可以使用该工具提供的DSL来定义容器化应用程序。使用Heat,用户还可以定义由容器资源和OpenStack资源组成的资源,例如Neutron负载均衡器、浮动IP、Nova实例等。

Zun和Kubernetes是互补的。事实上,Zun社区正在积极推动与Kubenetes的整合。目前,Zun与COE的整合工作主要集中在Kubenetes上,这将使容器更易于部署、管理和扩展。但是,在OpenStack上使用Kubernetes仍然需要用户手动部署底层基础设施,例如虚拟服务器集群。用户负责初始容量规划,例如确定VM集群的大小和维护正在运行的VM集群。

无服务器容器技术或解决方案(如AWS Fargate、Azure Container Instance(ACI)和 OpenStack Zun)的出现为在云上运行容器提供了可行的替代方案。无服务器方法允许用户按需运行容器,而无需事先创建或管理自己的集群。

Zun将使用Kubernetes作为业务流程层,Kubernetes将使用OpenStack Zun提供“无服务器”容器。

Zun提出了Container和Capsule的概念。Container负责集成Docker或其他容器引擎技术。 Capsule的概念有点像Kubernetes Pod,它代表一组容器。Capsule用于对需要彼此紧密合作 以实现服务目标的多个容器进行分组。

Zun不准备实现COE提供的许多高级功能(例如容器保持活动、负载均衡),而是专注于提供基本容器操作(CRUD)并保持与OpenStack的紧密集成。

与Nova Docker驱动程序比较,Zun旨在解决Nova Docker驱动程序解决方案的问题。它独立于Nova实现了Docker的部署调度框架,并与Glance、Neutron、Cinder和其他组件集成,但没有实现Container Orchestration Engines(COE)的部署调度。Nova-docker通过 Nova API访问容器,Zun不受Nova API的限制。

与Magnum相比,Zun和Magnum之间的区别在于Zun专注于提供用于管理容器的API,而 Magnum提供部署和管理容器编排引擎(COE)的API。

Zun 的 基 本 架 构 的 基 本 架 构 以下Zun架构图很好地说明了Zun和OpenStack组件之间的关系。

Zun架构图
图2: Zun架构图

解释:

  • Zun API:处理REST请求和检查输入参数
  • Zun Compute:资源调度和容器管理
  • Keystone:OpenStack的认证组件
  • Neutron:为容器提供网络
  • Glance:存储docker镜像(如果不使用glance,可以使用DockerHub)
  • Kuryr:连接容器网络和Neutron的插件

4 安装步骤

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

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

4.1   创建数据库

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

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

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

  • 在安装和配置Zun之前,必须创建用户、服务凭据和API端点:
[root@controller ~]#source admin-openrc
[root@controller ~]#openstack user create --domain default --password-prompt zun
[root@controller ~]#openstack role add --project service --user zun admin
[root@controller ~]#openstack service create --name zun \
--description "Container Service" container
[root@controller ~]#openstack endpoint create --region RegionOne \
container public http://controller:9517/v1
[root@controller ~]#openstack endpoint create --region RegionOne \
container internal http://controller:9517/v1
[root@controller ~]#openstack endpoint create --region RegionOne \
container admin http://controller:9517/v1

4.3 在controller节点上添加kuryr-libnetwork用户

  • 创建kuryr用户
[root@controller ~]#source admin-openrc
[root@controller ~]#openstack user create --domain default --password-prompt kuryr
  • 添加角色
[root@controller ~]#openstack role add --project service --user kuryr admin

4.4 在compute节点安装kuryr-libnetwork

kuryr-libnetwork是运行在Libnetwork框架下的一个plugin。Libnetwork定义了一个灵活的模型,使用local或者remotedriver来向container提供网络服务。kuryr-libnetwork就是Libnetwork的一个remotedriver实现。

kuryr-libnetwork主要实现了两个功能:NetworkDriver和IPAMDriver。

  • 添加内核参数
[root@compute ~]# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1 
[root@compute ~]#sysctl -p
net.ipv4.ip_forward = 1
  • 安装启动docker
[root@compute ~]# yum -y install yum-utils 
[root@compute ~]# yum-config-manager --add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
[root@compute ~]#yum install docker-ce
[root@compute ~]# systemctl enable docker
[root@compute ~]#systemctl start docker
  • 创建用户
[root@controller ~]#groupadd --system kuryr
[root@controller ~]#useradd --home-dir "/var/lib/kuryr" --create-home --system --shell /bin/false -g kuryr kuryr
  • 创建目录
[root@controller ~]#mkdir -p /etc/kuryr
[root@controller ~]#chown kuryr:kuryr /etc/kuryr
  • 安装kuryr-libnetwork
[root@compute ~]#cd /var/lib/kuryr
[root@compute ~]#git clone -b stable/rocky https://opendev.org/openstack/kuryr-libnetwork.git
[root@compute ~]#chown -R kuryr:kuryr kuryr-libnetwork
[root@compute ~]#cd kuryr-libnetwork
[root@compute ~]#pip install -r requirements.txt 
[root@compute ~]#python setup.py install
  • 生成示例配置文件
[root@compute ~]# su -s /bin/sh -c "./tools/generate_config_file_samples.sh" kuryr
[root@compute ~]# su -s /bin/sh -c "cp etc/kuryr.conf.sample /etc/kuryr/kuryr.conf" kuryr
  • 编辑配置文件,添加以下内容
[root@compute ~]#vi /etc/kuryr/kuryr.conf
[DEFAULT]
bindir = /usr/libexec/kuryr
[neutron]
www_authenticate_uri = http://controller:5000
auth_url = http://controller:5000 
username = kuryr
user_domain_name = default
password = kuryr
project_name = service
project_domain_name = default
auth_type = password
  • 创建启动文件
[root@compute ~]#vi /etc/systemd/system/kuryr-libnetwork.service
[Unit]
Description = Kuryr-libnetwork - Docker network plugin for Neutron

[Service]
ExecStart = /usr/bin/kuryr-server --config-file /etc/kuryr/kuryr.conf
CapabilityBoundingSet = CAP_NET_ADMIN

[Install]
WantedBy = multi-user.target
  • 启动服务
[root@compute ~]#systemctl enable kuryr-libnetwork
[root@compute ~]#systemctl start kuryr-libnetwork
[root@compute ~]#systemctl restart docker

4.5   在controller节点上安装zun服务

  • 创建用户、组:
[root@controller ~]#groupadd --system zun
[root@controller ~]#useradd --home-dir "/var/lib/zun"  \
--create-home \
--system  \
--shell /bin/false  \
-g zun  \
zun
  •  创建目录
[root@controller ~]#mkdir -p /etc/zun
[root@controller ~]# chown zun:zun /etc/zun
  • 安装zun
[root@controller ~]# yum install python-pip git python-devel libffi-devel gcc git
[root@controller ~]#cd /var/lib/zun
[root@controller ~]#git clone -b stable/rocky  https://opendev.org/openstack/zun.git
[root@controller ~]#chown -R zun:zun zun
[root@controller ~]#cd zun
[root@controller ~]#pip install pbr --no-index -f file:///var/lib/zun/zun/base/
[root@controller ~]# pip install -r requirements.txt 
[root@controller ~]# python setup.py install
[root@compute ~]#pip install zun==2.1.0
  • 生成示例配置文件
[root@controller ~]#su -s /bin/sh -c "oslo-config-generator --config-file etc/zun/zun-config-generator.conf" zun
[root@controller ~]#su -s /bin/sh -c "cp etc/zun/zun.conf.sample /etc/zun/zun.conf" zun
  • 复制api-paste.ini配置文件
[root@controller ~]#su -s /bin/sh -c "cp etc/zun/api-paste.ini /etc/zun" zun
  • 编辑配置文件
[root@controller ~]#vi /etc/zun/zun.conf
[DEFAULT]
transport_url = rabbit://openstack:tera123@controller
log_dir = /var/log/zun
[api]
Host_ip = 192.168.4.144
port = 9517
[database]
connection = mysql+pymysql://zun:ZUN_PASS@controller/zun
[keystone_auth]
memcached_servers = controller:11211
www_authenticate_uri = http://controller:5000
project_domain_name = default
project_name = service
user_domain_name = default
password = zun
username = zun
auth_url = http://controller:5000
auth_type = password
auth_version = v3
auth_protocol = http
service_token_roles_required = True
endpoint_type = internalURL
[keystone_authtoken]
memcached_servers = controller:11211
www_authenticate_uri = http://controller:5000
project_domain_name = default
project_name = service
user_domain_name = default
password = zun
username = zun
auth_url = http://controller:5000
auth_type = password
auth_version = v3
auth_protocol = http
service_token_roles_required = True
endpoint_type = internalURL
[oslo_concurrency]
lock_path = /var/lib/zun/tmp
[oslo_messaging_notifications]
driver = messaging
[websocket_proxy]
wsproxy_host = 192.168.4.144
wsproxy_port = 6784
  • 创建日志目录
[root@controller ~]#mkdir -p /var/log/zun
[root@controller ~]#chown zun:zun -R /var/log/zun
  • 填充数据库
[root@controller ~]#su -s /bin/sh -c "zun-db-manage upgrade" zun
  • 创建启动文件
[root@controller ~]#vi /etc/systemd/system/zun-api.service
[Unit]
Description = OpenStack Container Service API

[Service]
ExecStart = /usr/bin/zun-api
User = zun

[Install]
WantedBy = multi-user.target

[root@controller ~]# vi /etc/systemd/system/zun-wsproxy.service
[Unit]
Description = OpenStack Container Service Websocket Proxy

[Service]
ExecStart = /usr/bin/zun-wsproxy
User = zun

[Install]
WantedBy = multi-user.target
  • 启动服务
[root@controller ~]# systemctl enable zun-api  zun-wsproxy
[root@controller ~]# systemctl start zun-api  zun-wsproxy
[root@controller ~]# systemctl status zun-api  zun-wsproxy

4.6 在compute节点上安装zun服务

  • 创建用户、组:
[root@compute ~]#groupadd --system zun
[root@compute ~]#useradd --home-dir "/var/lib/zun"  \
--create-home \
--system  \
--shell /bin/false  \
-g zun  \
zun
  •  创建目录
[root@compute ~]#mkdir -p /etc/zun
[root@compute ~]#chown zun:zun /etc/zun
  • 安装zun
[root@compute ~]# yum install python-pip git python-devel libffi-devel gcc numactl  
[root@compute ~]#cd /var/lib/zun
[root@compute ~]#git clone -b stable/rocky https://opendev.org/openstack/zun.git 
[root@compute ~]#chown -R zun:zun zun
[root@compute ~]#cd zun
[root@compute ~]#pip install -r requirements.txt
[root@compute ~]#python setup.py install
[root@compute ~]#pip install zun==2.1.0
  • 生成示例配置文件
[root@compute ~]#su -s /bin/sh -c "oslo-config-generator --config-file etc/zun/zun-config-generator.conf" zun
[root@compute ~]#su -s /bin/sh -c "cp etc/zun/zun.conf.sample /etc/zun/zun.conf" zun
[root@compute ~]#su -s /bin/sh -c "cp etc/zun/rootwrap.conf /etc/zun/rootwrap.conf" zun
[root@compute ~]#su -s /bin/sh -c "mkdir -p /etc/zun/rootwrap.d" zun
[root@compute ~]#su -s /bin/sh -c "cp etc/zun/rootwrap.d/* /etc/zun/rootwrap.d/" zun
  • 配置zun用户
[root@compute ~]#echo "zun ALL=(root) NOPASSWD: /usr/local/bin/zun-rootwrap /etc/zun/rootwrap.conf *" | sudo tee /etc/sudoers.d/zun-rootwrap
  • 编辑配置文件
[root@compute ~]#vi /etc/zun/zun.conf
[DEFAULT]
transport_url = rabbit://openstack: tera123@controller
state_path = /var/lib/zun
log_dir = /var/log/zun
[database]
connection = mysql+pymysql://zun:ZUN_PASS@controller/zun
[keystone_auth]
memcached_servers = controller:11211
www_authenticate_uri = http://controller:5000
project_domain_name = default
project_name = service
user_domain_name = default
password = zun
username = zun
auth_url = http://controller:5000
auth_type = password
auth_version = v3
auth_protocol = http
service_token_roles_required = True
endpoint_type = internalURL
[keystone_authtoken]
memcached_servers = controller:11211
www_authenticate_uri= http://controller:5000
project_domain_name = default
project_name = service
user_domain_name = default
password = zun
username = zun
auth_url = http://controller:5000
auth_type = password
[websocket_proxy]
base_url = ws://controller:6784/
[oslo_concurrency]
lock_path = /var/lib/zun/tmp

注意:如果想把容器和实例都运行在这台计算节点上,上面的配置文件要添加这项配置

[compute]

host_shared_with_nova = true

  • 创建日志目录
[root@controller ~]#mkdir -p /var/log/zun
[root@controller ~]#chown zun:zun -R /var/log/zun
  • 配置docker和kury

创建docker配置文件夹

[root@compute ~]#mkdir -p /etc/systemd/system/docker.service.d

创建docker配置文件

[root@compute ~]# vi /etc/systemd/system/docker.service.d/docker.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --group zun -H tcp://compute:2375 -H unix:///var/run/docker.sock --cluster-store etcd://controller:2379

重启docker

[root@compute ~]#systemctl daemon-reload
[root@compute ~]#systemctl restart docker

编辑kuryr配置文件

[root@compute ~]#mkdir -p /etc/kuryr
[root@compute ~]#vi  /etc/kuryr/kuryr.conf
[DEFAULT]
capability_scope = global
process_external_connectivity = False

重启kuryr

[root@compute ~]#systemctl restart kuryr-libnetwork
  • 配置containerd

生成containerd配置文件

[root@compute ~]# containerd config default > /etc/containerd/config.toml

编辑容器配置文件

将[grpc]项目中的gid配成zun用户的组id

[root@compute ~]#vi /etc/containerd/config.toml
[grpc]
  ...
  gid = ZUN_GROUP_ID

说明:获取用户组id的方法

getent group zun | cut -d: -f3

重启containerd

[root@compute ~]#systemctl restart containerd
  • 创建启动文件
[root@compute ~]#vi /etc/systemd/system/zun-compute.service
[Unit]
Description = OpenStack Container Service Compute Agent

[Service]
ExecStart = /usr/bin/zun-compute
User = zun

[Install]
WantedBy = multi-user.target
  • 启动zun-compute
[root@compute ~]#systemctl enable zun-compute 
[root@compute ~]#systemctl start zun-compute 
[root@compute ~]#systemctl status zun-compute

4.7 在controller节点安装zun-ui

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

5 结果验证

在compute节点创建kuryr网络及创建容器

  • 创建kuryr网络
[root@controller ~]#docker network create --driver kuryr --ipam-driver kuryr --subnet 10.10.0.0/16 --gateway=10.10.0.1  test_net
  • 查看网络
[root@controller ~]#docker network ls
  • 创建容器
[root@controller ~]#docker run --net test_net cirros ifconfig

在controller节点验证

  • 准备验证
[root@controller ~]# pip install python-zunclient
[root@controller ~]#source admin-openrc
  • 查看网络
[root@controller ~]#openstack network list
  • 获取网络id
[root@controller ~]#export NET_ID=$(openstack network list | awk '/ selfservice / { print $2 }')
  • 创建容器
[root@controller ~]#openstack appcontainer run --name container --net network=$NET_ID cirros ping 8.8.8.8
  • 查看容器列表
[root@controller ~]#openstack appcontainer list
  • 执行sh命令
[root@controller ~]#openstack appcontainer exec --interactive container /bin/sh
  • 停止容器
[root@controller ~]#openstack appcontainer stop container
  • 删除容器
[root@controller ~]#openstack appcontainer delete container

6 参考资料

更多内容请参考:A-Lab

DPU智能网卡VNF功能卸载验证

——OVS、vFW与SSL加解密的卸载

Helium智能网卡VNF功能卸载验证

1 验证方案介绍

本篇Helium智能网卡(下文统一简称为“智能网卡”)解决方案,是为了验证其对VNF功能的卸载能力。整个验证过程涵盖三个功能点,即:1.智能网卡对OVS的卸载;2.智能网卡对基于虚拟机的VNF(vFW)功能卸载;3.智能网卡对基于容器的VNF(SSL加解密)功能卸载。

2 硬件与软件环境

验证过程中涉及到的硬件和软件环境如表2-1和表2-2所示。

验证方案物理拓扑
图2-1:验证方案物理拓扑
名称型号硬件指标数量备注
智能网卡EC2004Y【参见产品彩页】1/
服务器X86需兼容全高尺寸网卡2/
光模块25GSFP282/
光纤多模10G/25G适用1/
表2-1:硬件环境

软件版本备注
宿主机操作系统CentOS 7.8.2003
智能网卡操作系统debian10_ec96_V1.1R6.tar
DPDKEC96_DPDK19.11_V1.1R5.tar.gz
ovsovs_V1.1R6.bin智能网卡的应用
智能网卡驱动EC96_Driver_V1.1R5.tar.gz宿主机的驱动
vhost-uservhost-ec2004Y宿主机的驱动
表2-2:软件环境

3 验证思路与结果

3.1 将OVS卸载到智能网卡

参考研发提供的用户手册《EC2004Y网卡安装手册VX.Y.Z》,将智能网卡正确安装到服务器中,在智能网卡的操作系统安装完毕后,进行管理网口配置、驱动安装调试等基本配置操作。

OVS卸载验证拓扑
图3.1-1:OVS卸载验证拓扑

完成以上基本配置后,在智能网卡侧运行OVS,创建测试网桥,然后在宿主机侧启动两台虚拟机连接到测试网桥上。经过验证测试,两台虚拟机之间可以通过位于智能网卡侧的OVS网桥进行通信,证明OVS卸载到智能网卡后可以正常提供服务。

3.2 基于虚拟机的vFW卸载

为了验证智能网卡对基于虚拟机的VNF卸载能力,本方案将在宿主机侧启动两台虚拟机作为租户的业务实例,在智能网卡侧运行CentOS虚拟机,配置相应的iptables规则作为VPC网关与防火墙。

基于虚拟机的vFW卸载拓扑
图3.2-1:基于虚拟机的vFW卸载拓扑

经过验证测试,成功地将防火墙功能卸载至智能网卡。由上图可知,租户的VPC网段为172.0.0.0/24,实例的网关设置为VPC网关172.0.0.1。当智能网卡上运行的防火墙收到业务实例访问其他网段的流量时,会对流量按预设规则进行过滤转发,而且在转发到业务网络前会进行一次SNAT,使得租户VPC内的实例可以访问到业务网络。

3.3 基于容器的SSL加解密卸载

为了验证智能网卡对基于容器的VNF卸载能力,本方案将在宿主机侧启动两台虚拟机作为WEB后端,在智能网卡侧运行nginx容器作为SSL加解密的前端和负载均衡器,用https://10.0.0.50/这个域名对业务网的其他用户提供HTTPS服务。

基于容器的SSL加解密卸载拓扑
图3.3-1:基于容器的SSL加解密卸载拓扑

经过验证测试,成功地将SSL加解密功能卸载至智能网卡。当nginx容器从智能网卡的25G业务口收到来自客户端10.0.0.1访问https://10.0.0.50/的HTTPS流量时,会将其转换为HTTP流量发送至位于宿主机的WEB节点中,后端WEB节点的选择采用轮询算法,因此在客户端10.0.0.1上多次访问,会交替收到WEB-00和WEB-01响应的页面。

4 验证方案的详细配置流程

4.1 将OVS卸载到智能网卡

  • 4.1.1 安装并对智能网卡进行基本配置

参考研发提供的用户手册《EC2004Y网卡安装手册VX.Y.Z》,将智能网卡正确安装到服务器中,并在智能网卡的操作系统安装完毕后,进行管理网口配置、驱动安装调试等基本配置操作。

# 本方案中配置num_vfs参数为4,因此在宿主机上可以看到如下四个PCIe网络设备。
[root@asterfusion ~]# lspci -nn -d 177d:b203
03:02.0 Network controller [0280]: Cavium, Inc. Device [177d:b203]
03:02.1 Network controller [0280]: Cavium, Inc. Device [177d:b203]
03:02.2 Network controller [0280]: Cavium, Inc. Device [177d:b203]
03:02.3 Network controller [0280]: Cavium, Inc. Device [177d:b203]

# 智能网卡的管理网口接入管理网192.168.5.0/24,配置的管理IP为192.168.5.45。
  • 4.1.2 安装OVS
# 拷贝OVS安装文件到网卡data目录,进行安装。
root@OCTEONTX:/data# chmod +x ovs_V1.1R6.bin
root@OCTEONTX:/data# ./ovs_V1.1R6.bin
  • 4.1.3 验证OVS
# 启动OVS 
root@OCTEONTX:/data# cd ovs_install 
root@OCTEONTX:/data/ovs_install# chmod +x ovs_start.sh
root@OCTEONTX:/data/ovs_install# ./ovs_start.sh

# 验证OVS和DPDK的版本
root@OCTEONTX:/data/ovs_install# ovs-vsctl get Open_vSwitch . dpdk_initialized
true
root@OCTEONTX:/data/ovs_install# ovs-vsctl get Open_vSwitch . dpdk_version
"DPDK 19.11.0"
root@OCTEONTX:/data/ovs_install# ovs-vswitchd --version
ovs-vswitchd (Open vSwitch) 2.11.1
DPDK 19.11.0
  • 4.1.4 在智能网卡侧配置管理网与业务网的网桥
# 创建并配置管理网的网桥,并将智能网卡的管理网IP放到此网桥上
root@OCTEONTX:~# ovs-vsctl add-br br-m -- set bridge br-m datapath_type=netdev
root@OCTEONTX:~# ip add del dev eth4 192.168.5.45/24
root@OCTEONTX:~# ovs-vsctl add-port br-m eth4
root@OCTEONTX:~# ip link set dev br-m up
root@OCTEONTX:~# ip add add dev br-m 192.168.5.45/24
root@OCTEONTX:~# ip route add default via 192.168.5.1 dev br-m

# 创建并配置业务网的网桥,将智能网卡的物理网口eth0连接到此网桥上
root@OCTEONTX:~# ovs-vsctl add-br br-net -- set bridge br-net datapath_type=netdev
root@OCTEONTX:~# ovs-vsctl add-port br-net eth0 -- set Interface eth0 type=dpdk options:dpdk-devargs=0002:02:00.0
root@OCTEONTX:~# ip link set dev br-net up
  • 4.1.5 在宿主机侧创建两台虚拟机,连接到智能网卡侧的业务网桥
# 将vhost-ec2004Y驱动上传到宿主机,并在screen中保持运行状态。
[root@asterfusion ~]# screen -S vhost-ec96
[root@asterfusion ~]# ./vhost-ec2004Y -l0-7 -w 0000:03:02.0 -w 0000:03:02.1 -- -s /tmp/vhost-user-0.sock -s /tmp/vhost-user-1.sock -c --mergeable 1 --stats 1 -t 0
使用组合键Ctrl + A,然后再使用Ctrl + D将screen保存到后台继续运行。
[root@asterfusion ~]# ls -lh /tmp/vhost-user-*
srwxrwxr-x 1 qemu qemu 0 Aug 23 14:33 /tmp/vhost-user-0.sock
srwxrwxr-x 1 qemu qemu 0 Aug 23 15:08 /tmp/vhost-user-1.sock

# 修改虚拟机的xml配置文件,添加一个vhost-user的虚拟网卡。
# centos-00:
<domain type='kvm'>
  <name>centos-00</name>
  <devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
……
    <interface type='vhostuser'>
      <mac address='52:54:00:c7:ac:00'/>
      <source type='unix' path='/tmp/vhost-user-0.sock' mode='server'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x03' slot='0x02' function='0x0'/>
</interface>
……
  </devices>
</domain>
# centos-01:
<domain type='kvm'>
  <name>centos-01</name>
  <devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
……
    <interface type='vhostuser'>
      <mac address='52:54:00:c7:ac:01'/>
      <source type='unix' path='/tmp/vhost-user-1.sock' mode='server'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
……
  </devices>
</domain>

# 创建两台CentOS7虚拟机并启动。
[root@asterfusion ~]# virsh define centos-00.xml
[root@asterfusion ~]# virsh define centos-01.xml
[root@asterfusion ~]# virsh start centos-00
[root@asterfusion ~]# virsh start centos-01
[root@asterfusion ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 13    centos-00                      running
 14    centos-01                      running

# 将虚拟机连接到宿主机侧的管理网桥。
[root@asterfusion ~]# ip link add centos-00-m type veth peer name centos-00-m-s
[root@asterfusion ~]# ip link add centos-01-m type veth peer name centos-01-m-s
[root@asterfusion ~]# ovs-vsctl add-br br-m
[root@asterfusion ~]# ip link set dev br-m up
[root@asterfusion ~]# ip add add dev br-m 192.168.5.145/24
[root@asterfusion ~]# ip route add default via 192.168.5.1 dev br-m
[root@asterfusion ~]# ovs-vsctl add-port br-m centos-00-m-s
[root@asterfusion ~]# ovs-vsctl add-port br-m centos-01-m-s
[root@asterfusion ~]# virsh attach-interface centos-00 --type direct --source centos-00-m --config
[root@asterfusion ~]# virsh attach-interface centos-00 --type direct --source centos-00-m --live
[root@asterfusion ~]# virsh attach-interface centos-01 --type direct --source centos-01-m --config
[root@asterfusion ~]# virsh attach-interface centos-01 --type direct --source centos-01-m --live
[root@asterfusion ~]# ip link set dev centos-00-m up
[root@asterfusion ~]# ip link set dev centos-01-m up
[root@asterfusion ~]# ip link set dev centos-00-m-s up
[root@asterfusion ~]# ip link set dev centos-01-m-s up

# 分别给两台虚拟机配置业务IP。
# centos-00:
[root@centos-00 ~]# ip link set dev eth0 up
[root@centos-00 ~]# ip add add dev eth0 172.0.0.100/24
# centos-01:
[root@centos-01 ~]# ip link set dev eth0 up
[root@centos-01 ~]# ip add add dev eth0 172.0.0.200/24

# 分别给两台虚拟机配置管理IP。
# centos -00:
[root@centos-00 ~]# ip link set dev eth1 up
[root@centos-00 ~]# ip add add dev eth1 192.168.5.155/24
[root@centos-00 ~]# ip route add default via 192.168.5.1 dev eth1
# centos-01:
[root@centos-01 ~]# ip link set dev eth1 up
[root@centos-01 ~]# ip add add dev eth1 192.168.5.165/24
[root@centos-01 ~]# ip route add default via 192.168.5.1 dev eth1

# 在智能网卡侧将虚拟机使用的两个VF绑定到业务网桥br-net。
root@OCTEONTX:~# ovs-vsctl add-port br-net sdp1 -- set Interface sdp1 type=dpdk options:dpdk-devargs=0002:0f:00.2 mtu_request=9000  
root@OCTEONTX:~# ovs-vsctl add-port br-net sdp2 -- set Interface sdp2 type=dpdk options:dpdk-devargs=0002:0f:00.3 mtu_request=9000
  • 4.1.6 验证宿主机侧两台虚拟机的连通性
# 经过验证两台虚拟机能够经过智能网卡侧的网桥br-net正常通信。
# centos-00:
[root@centos-00 ~]# ping 172.0.0.200 -c 4
PING 172.0.0.200 (172.0.0.200) 56(84) bytes of data.
64 bytes from 172.0.0.200: icmp_seq=1 ttl=64 time=0.220 ms
64 bytes from 172.0.0.200: icmp_seq=2 ttl=64 time=0.164 ms
64 bytes from 172.0.0.200: icmp_seq=3 ttl=64 time=0.140 ms
64 bytes from 172.0.0.200: icmp_seq=4 ttl=64 time=0.132 ms

--- 172.0.0.200 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.132/0.164/0.220/0.034 ms
[root@centos-00 ~]#
# centos-01:
[root@centos-01 ~]# ping 172.0.0.100 -c 4
PING 172.0.0.100 (172.0.0.100) 56(84) bytes of data.
64 bytes from 172.0.0.100: icmp_seq=1 ttl=64 time=0.159 ms
64 bytes from 172.0.0.100: icmp_seq=2 ttl=64 time=0.163 ms
64 bytes from 172.0.0.100: icmp_seq=3 ttl=64 time=0.179 ms
64 bytes from 172.0.0.100: icmp_seq=4 ttl=64 time=0.180 ms

--- 172.0.0.100 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.159/0.170/0.180/0.013 ms
[root@centos-01 ~]#

4.2 基于虚拟机的vFW卸载

本小节的所有操作,都是基于4.1小节的配置环境进行,因此基础的操作步骤不再赘述。

  • 4.2.1 在智能网卡侧配置网桥vm-net,并将宿主机侧的两台虚机连接到此网桥
# 在智能网卡侧创建网桥vm-net。
root@OCTEONTX:~# ovs-vsctl add-br vm-net -- set bridge vm-net datapath_type=netdev
	
# 将VF从br-net网桥上删除。
root@OCTEONTX:~# ovs-vsctl del-port br-net sdp1
root@OCTEONTX:~# ovs-vsctl del-port br-net sdp2

# 将VF连接到vm-net网桥。
root@OCTEONTX:~# ovs-vsctl add-port vm-net sdp1 -- set Interface sdp1 type=dpdk options:dpdk-devargs=0002:0f:00.2 mtu_request=9000
root@OCTEONTX:~# ovs-vsctl add-port vm-net sdp2 -- set Interface sdp2 type=dpdk options:dpdk-devargs=0002:0f:00.3 mtu_request=9000
  • 4.2.2 在智能网卡侧创建虚拟机,并分别连接到网桥vm-net和br-net
# 在智能网卡侧安装虚拟化软件包。
root@OCTEONTX:~# apt install -y qemu qemu-utils qemu-efi-arm qemu-efi-aarch64 qemu-system-arm qemu-system-common qemu-system-data qemu-system-gui
	
# 准备虚拟机的镜像和xml文件,结果如下。
root@OCTEONTX:/data# mkdir libvirt && cd libvirt
root@OCTEONTX:/data/libvirt# tree
.
|-- images
|   |-- CentOS-7-aarch64-GenericCloud-2009.qcow2
|   `-- QEMU_EFI.fd
`-- xml
    |-- centos-00.xml
    `-- default-net.xml

2 directories, 4 files
root@OCTEONTX:/data/libvirt# cat xml/centos-00.xml
<domain type='qemu'>
  <name>centos-00</name>
  <uuid>dc042799-4e06-466f-8fce-71ac2105f786</uuid>
  <metadata>
    <libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
      <libosinfo:os id="http://centos.org/centos/7.0"/>
    </libosinfo:libosinfo>
  </metadata>
  <memory unit='KiB'>2097152</memory>
  <currentMemory unit='KiB'>2097152</currentMemory>
  <vcpu placement='static'>2</vcpu>
  <os>
    <type arch='aarch64' machine='virt-4.2'>hvm</type>
    <loader readonly='yes' type='pflash'>/usr/share/AAVMF/AAVMF_CODE.fd</loader>
    <nvram>/var/lib/libvirt/qemu/nvram/centos-00_VARS.fd</nvram>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <gic version='2'/>
  </features>
  <cpu mode='custom' match='exact' check='none'>
    <model fallback='allow'>cortex-a57</model>
  </cpu>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/bin/qemu-system-aarch64</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/data/libvirt/images/CentOS-7-aarch64-GenericCloud-2009.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
    </disk>
    <controller type='pci' index='0' model='pcie-root'/>
    <controller type='pci' index='1' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='1' port='0x8'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0' multifunction='on'/>
    </controller>
    <controller type='pci' index='2' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='2' port='0x9'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <controller type='pci' index='3' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='3' port='0xa'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
    </controller>
    <controller type='pci' index='4' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='4' port='0xb'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x3'/>
    </controller>
    <controller type='pci' index='5' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='5' port='0xc'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x4'/>
    </controller>
    <controller type='pci' index='6' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='6' port='0xd'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x5'/>
    </controller>
    <controller type='pci' index='7' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='7' port='0xe'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x6'/>
    </controller>
    <controller type='virtio-serial' index='0'>
      <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
    </controller>
    <serial type='pty'>
      <target type='system-serial' port='0'>
        <model name='pl011'/>
      </target>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <channel type='unix'>
      <target type='virtio' name='org.qemu.guest_agent.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
    </memballoon>
    <rng model='virtio'>
      <backend model='random'>/dev/urandom</backend>
      <address type='pci' domain='0x0000' bus='0x06' slot='0x00' function='0x0'/>
    </rng>
  </devices>
</domain>

# 创建虚拟机并启动。
root@OCTEONTX:/data/libvirt# virsh define centos-00.xml
root@OCTEONTX:/data/libvirt# virsh start centos-00
root@OCTEONTX:/data/libvirt# virsh list --all
Id   Name        State
---------------------------
30   centos-00   running

# 将虚拟机分别连接网桥vm-net、br-net和br-m。
root@OCTEONTX:/data/libvirt# ip link add centos-if-in type veth peer name centos-if-in-sw
root@OCTEONTX:/data/libvirt# ip link add centos-if-ou type veth peer name centos-if-ou-sw
root@OCTEONTX:/data/libvirt# ip link add centos-m type veth peer name centos-m-sw
root@OCTEONTX:/data/libvirt# ip link set dev centos-m up
root@OCTEONTX:/data/libvirt# ip link set dev centos-m-sw up
root@OCTEONTX:/data/libvirt# ip link set dev centos-if-in up
root@OCTEONTX:/data/libvirt# ip link set dev centos-if-in-sw up
root@OCTEONTX:/data/libvirt# ip link set dev centos-if-ou up
root@OCTEONTX:/data/libvirt# ip link set dev centos-if-ou-sw up
root@OCTEONTX:/data/libvirt# ovs-vsctl add-port vm-net centos-if-in-sw
root@OCTEONTX:/data/libvirt# ovs-vsctl add-port br-net centos-if-ou-sw
root@OCTEONTX:/data/libvirt# ovs-vsctl add-port br-m centos-m-sw
root@OCTEONTX:/data/libvirt# virsh attach-interface centos-00 --type direct --source centos-if-in --config
root@OCTEONTX:/data/libvirt# virsh attach-interface centos-00 --type direct --source centos-if-in --live
root@OCTEONTX:/data/libvirt# virsh attach-interface centos-00 --type direct --source centos-if-ou -m --config
root@OCTEONTX:/data/libvirt# virsh attach-interface centos-00 --type direct --source centos-if-ou -m –live
root@OCTEONTX:/data/libvirt# virsh attach-interface centos-00 --type direct --source centos-m -m --config
root@OCTEONTX:/data/libvirt# virsh attach-interface centos-00 --type direct --source centos-m -m --live
  • 4.2.3 在智能网卡侧的虚拟机上配置防火墙规则
# 配置虚拟机各个网卡的IP地址。
root@OCTEONTX:~# virsh console centos-00
Connected to domain centos-00
Escape character is ^]

[root@firewall ~]# ip link set dev eth0 up
[root@firewall ~]# ip link set dev eth1 up
[root@firewall ~]# ip link set dev eth2 up
[root@firewall ~]# ip add add dev eth0 172.0.0.1/24
[root@firewall ~]# ip add add dev eth1 10.0.0.45/24
[root@firewall ~]# ip add add dev eth2 192.168.5.155/24
[root@firewall ~]# ip route add default via 10.0.0.1 dev eth1

# 开启虚拟机的报文转发功能。
[root@firewall ~]# echo '1' > /proc/sys/net/ipv4/ip_forward

# 设置防火墙的测试规则:丢弃实例172.0.0.100的所有报文。
[root@firewall ~]# iptables -nvL
Chain INPUT (policy ACCEPT 332K packets, 135M bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 7158 packets, 545K bytes)
 pkts bytes target     prot opt in     out     source               destination         
 7305  544K DROP       all  --  *      *       172.0.0.100          0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 20823 packets, 1740K bytes)
 pkts bytes target     prot opt in     out     source               destination         

# 设置防火墙的SNAT规则。
[root@firewall ~]# iptables -nvL -t nat
Chain PREROUTING (policy ACCEPT 11048 packets, 828K bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 16 packets, 784 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 9639 packets, 725K bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 9639 packets, 725K bytes)
 pkts bytes target     prot opt in     out     source               destination         
 6188  470K SNAT       all  --  *      eth1    172.0.0.0/24         0.0.0.0/0            to:10.0.0.45
  • 4.2.4 验证卸载结果
# 在centos-00上Ping位于业务网络上的“外网网关”10.0.0.1,无法通信。
[root@centos-00 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.0.0.1       0.0.0.0         UG    0      0        0 eth0
172.0.0.0       0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.5.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
[root@centos-00 ~]# ping 10.0.0.1 -c 4
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.

--- 10.0.0.1 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 2999ms
[root@centos-00 ~]#

# 在centos-01上Ping位于业务网络上的“外网网关”10.0.0.1,通信正常。
[root@centos-01 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.0.0.1       0.0.0.0         UG    0      0        0 eth0
172.0.0.0       0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.5.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
[root@centos-01 ~]# ping 10.0.0.1 -c 4
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=63 time=1.07 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=63 time=1.04 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=63 time=1.04 ms
64 bytes from 10.0.0.1: icmp_seq=4 ttl=63 time=1.04 ms

--- 10.0.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 1.042/1.052/1.075/0.041 ms
[root@centos-01 ~]# 

4.3 基于容器的SSL加解密卸载

本小节的所有操作,都是基于4.1小节的配置环境进行,因此基础的操作步骤不再赘述。

  • 4.3.1 在宿主机侧启动两台虚拟机,并分别连接到管理网和业务网
# 修改xml文件,将4.1小节创建的虚拟机重命名后用作WEB后端。
[root@asterfusion ~]# virsh define WEB-00.xml
[root@asterfusion ~]# virsh define WEB-01.xml
[root@asterfusion ~]# virsh start WEB-00
[root@asterfusion ~]# virsh start WEB-01
[root@asterfusion ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 13    WEB-00                      running
 14    WEB-01                      running
[root@asterfusion ~]# 
  • 4.3.2 将宿主机侧的两台虚拟机配置为WEB后端
# 分别在两台虚拟上安装httpd服务并创建index页面。
# WEB-00:
[root@WEB-00 ~]# getenforce 
Disabled
[root@WEB-00 ~]# yum update && yum install -y httpd
[root@WEB-00 ~]# cd /var/www/html/
[root@WEB-00 html]# echo "I'm end server: 172.0.0.100" > index.html
[root@WEB-00 html]# systemctl restart httpd
[root@WEB-00 html]# systemctl enable httpd
# WEB-01:
[root@WEB-01 ~]# getenforce 
Disabled
[root@WEB-01 ~]# yum update && yum install -y httpd
[root@WEB-01 ~]# cd /var/www/html/
[root@WEB-01 html]# echo "I'm end server: 172.0.0.200" > index.html
[root@WEB-01 html]# systemctl restart httpd
[root@WEB-01 html]# systemctl enable httpd
  • 4.3.3 在智能网卡侧创建两个网桥用于前后端网络IP的挂载
# 将卸载SSL的容器前端IP设为10.0.0.50/24,后端IP设为172.0.0.50/24。
root@OCTEONTX:~# ip link add nginx-host type veth peer name nginx-ovs
root@OCTEONTX:~# ip link set dev nginx-host up 
root@OCTEONTX:~# ip link set dev nginx-ovs up 
root@OCTEONTX:~# ip link add proxy-host type veth peer name proxy-ovs
root@OCTEONTX:~# ip link set dev proxy-host up 
root@OCTEONTX:~# ip link set dev proxy-ovs up 
root@OCTEONTX:~# ovs-vsctl add-port br-net proxy-host
root@OCTEONTX:~# ovs-vsctl add-port br-net proxy-ovs

root@OCTEONTX:~# ovs-vsctl add-br Proxy-B -- set bridge Proxy-B datapath_type=netdev
root@OCTEONTX:~# ovs-vsctl add-br Proxy-F -- set bridge Proxy-F datapath_type=netdev
root@OCTEONTX:~# ovs-vsctl add-port Proxy-B nginx-host
root@OCTEONTX:~# ovs-vsctl add-port Proxy-F proxy-host
root@OCTEONTX:~# ip link set dev Proxy-B up 
root@OCTEONTX:~# ip link set dev Proxy-F up 
root@OCTEONTX:~# ip add add dev Proxy-B 172.0.0.50/24
root@OCTEONTX:~# ip add add dev Proxy-F 10.0.0.50/24
  • 4.3.4 在智能网卡侧进行基于容器的SSL加解密卸载
# 准备nginx的目录以及配置文件。
root@OCTEONTX:~# cd /data/
root@OCTEONTX:/data# mkdir nginx && cd nginx
root@OCTEONTX:/data/nginx# mkdir config data logs ssl
root@OCTEONTX:/data/nginx# ll
total 20K
drwxr-xr-x 3 root root 4.0K Sep 18 01:54 config
drwxr-xr-x 2 root root 4.0K Sep 17 08:06 data
drwxr-xr-x 2 root root 4.0K Sep 18 02:15 logs
drwxr-xr-x 2 root root 4.0K Sep 18 02:02 ssl

# 创建自签名证书。
root@OCTEONTX:/data/nginx# cd ssl/
root@OCTEONTX:/data/nginx/ssl# openssl genrsa -des3 -out server.key 2048
root@OCTEONTX:/data/nginx/ssl# openssl req -new -key server.key -out server.csr
root@OCTEONTX:/data/nginx/ssl# openssl rsa -in server.key -out server_nopwd.key
root@OCTEONTX:/data/nginx/ssl# openssl x509 -req -days 365 -in server.csr -signkey 

# 准备完成后的nginx目录以及相关配置。
root@OCTEONTX:/data/nginx# tree
.
|-- config
|   |-- conf.d
|   |   `-- default.conf
|   `-- nginx.conf
|-- data
|   `-- index.html
|-- logs
|   |-- access.log
|   `-- error.log
|-- ssl
|   |-- server.crt
|   |-- server.csr
|   |-- server.key
|   `-- server_nopwd.key
`-- start-n.sh

5 directories, 10 files
root@OCTEONTX:/data/nginx# cat data/index.html 
I'm SSL Proxer
root@OCTEONTX:/data/nginx# cat config/conf.d/default.conf 
upstream end_server {                                                         
    server 172.0.0.100:80 weight=1 max_fails=3 fail_timeout=15s;                                                
    server 172.0.0.200:80 weight=1 max_fails=3 fail_timeout=15s;                                                
}
server {
    listen 443 ssl;
    server_name	localhost;

    ssl_certificate /ssl/server.crt;
    ssl_certificate_key /ssl/server_nopwd.key;

    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;

     ssl_protocols SSLv2 SSLv3 TLSv1.2;

     ssl_ciphers HIGH:!aNULL:!MD5;
     ssl_prefer_server_ciphers  on;

     location / {
        root /usr/share/nginx/html;
        index index.html index.htm;
        proxy_pass http://end_server/;
        proxy_set_header Host $host:$server_port;
     }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
    
    proxy_ignore_client_abort on;    
}

# 在智能网卡的操作系统上运行nginx容器。
root@OCTEONTX:/data/nginx# docker run -d --network host --name nginx-00 -v /data/nginx/data:/usr/share/nginx/html:rw -v /data/nginx/config/nginx.conf:/etc/nginx/nginx.conf/:rw -v /data/nginx/config/conf.d/default.conf:/etc/nginx/conf.d/default.conf:rw -v /data/nginx/logs:/var/log/nginx/:rw -v /data/nginx/ssl:/ssl/:rw nginx
  • 4.3.5 卸载结果验证
# 从业务网中的一台服务器访问https://10.0.0.50/,卸载成功则会返回后端WEB提供的页面。
[root@compute-01 ~]# ip a | grep -i "enp2s0f0"
8: enp2s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet 10.0.0.1/24 scope global enp2s0f0
[root@compute-01 ~]# curl --insecure https://10.0.0.50/
I'm end server: 172.0.0.100
[root@compute-01 ~]# curl --insecure https://10.0.0.50/
I'm end server: 172.0.0.200

5 在服务器与智能网卡中运行VNF的异同

VNF通常以虚拟机或者容器的形式进行部署。关于安装部署,对于服务器与Helium智能网卡基本没区别,只要有对应版本的可以安装运行,配置方式、命令行等基本一致。

关于软件资源,由于目前x86架构的服务器占比极高,各种操作系统、容器服务、Hypervisor软件、镜像、应用等均会提供x86版本。对于Helium智能网卡这个arm架构平台,在操作系统、容器服务、Hypervisor等方面,大多数流行的产品也已经提供了arm版本。但是,对于各种应用软件、容器镜像等只有少部分支持arm版本,如果客户原先跑在x86平台的VNF软件没有arm版本,则需要先由研发完成移植、测试等工作。

移植工作涉及到代码层面,因此一定是需要研发进行的。因为从x86向arm进行代码移植有两个方面的问题,一是这两种CPU在处理某些类型的溢出时,行为不同,二是这两种CPU采用不同的指令集,即复杂指令集与精简指令集,因此他们的机器指令不能完全一一对应,如果项目嵌入汇编进行加速,则代码的移植会更麻烦。

6 验证总结与建议

6.1 智能网卡VNF卸载解决方案的验证总结

通过前文所述的验证测试操作,证明Helium智能网卡可以完成对OVS的卸载、对基于虚拟机的VNF(vFW)功能的卸载、对基于容器的VNF(SSL加解密)功能的卸载。未来再配合Helium智能网卡SoC的协处理器,不仅能对VNF进行卸载,还能进一步提升VNF应用的处理性能。

6.2 智能网卡在运维体验方面的一些建议

1.智能网卡操作系统的默认硬盘分区给根目录的空间不够,很容易用满,建议系统给根目录更大的容量,或者引入逻辑卷机制方便客户根据情况灵活调整各分区容量。

命令行展示

2.初始化网络配置与安装智能网卡驱动程序的过程,是否可以进一步优化,对运维人员将一步步的命令行操作屏蔽掉,使用交互的命令行或图形化脚本的方式进行安装。

#现有安装方式的部分步骤:

步骤展示

#交互式命令行或图形化脚本示例(使用交互式命令行安装的vmware-tools与图形化示例):

交互式命令行示例
图形化示例

3.在宿主机上卸载智能网卡的驱动时,会使得智能网卡重启,是否可以进一步优化,在宿主机上进行卸载或更新驱动的操作时不用让智能网卡重启一次。

卸载驱动及程序

4.目前智能网卡中OVS安装后,进程的启停操作通过定制的脚本完成,是否进一步优化,当完成OVS的安装后使用systemd来管理OVS的服务进程。

# 目前OVS服务进程的启停通过Shell脚本完成:

Shell脚本完成的命令行展示

# 智能网卡系统中,使用systemd管理的服务示例(SSH服务):

systemd管理的服务示例

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

更多产品信息:Helium DPU网卡

OpenStack-Ironic源码安装部署方案

OpenStack-Ironic源码安装部署方案

1 Ironic简介

裸金属节点特指没有部署操作系统的物理服务器,相对于虚拟机,裸金属节点具有更强的计算能力、资源独占以及安全隔离等优点。Ironic旨在为用户提供自助式的裸金属管理服务,Ironic既可以独立使用,也可以与 OpenStack集成。Ironic与OpenStack集成提供裸金属管理服务,允许用户像管理虚拟机一样管理裸金属节点,部署裸机就像是部署虚拟机一样简单,为用户提供了多租户网络的裸金属云基础设施。

2 Ironic架构图

Ironic架构图

3 Ironic必要组件

  • Ironic API:提供北向RESTful API
  • Ironic Conductor:完成裸机管理服务的绝大部分工作:添加、编辑、删除裸机;开/关裸机电源;提供、部署清理裸机等
  • Ironic Python Agent:简称IPA,是一个运行在RAMDisk之上的Python服务,暴露RESTful API接收Ironic Conductor的远程访问,完成裸机的相关操作

4 Ironic依赖服务

  • TFTP:TFTP是用来下载远程文件的最简单网络协议,它基于UDP协议而实现
  • PXE:PXE是一种引导方式,进行PEX安装的必要条件是在要安装的计算机中必须包含一个PXE支持的网卡,PXE协议可以使计算机通过网络启动
  • IPMI:IPMI是智能型平台管理接口,其核心是一个专用芯片BMC,其并不依赖于服务器的处理器、BIOS或操作系统来工作,是一个单独在系统内运行的无代理管理子系统,只要有BMC与IPMI固件便可开始工作,而BMC通常是一个安装在服务器主板上的独立的板卡。用户可以利用IPMI监视服务器的物理健康特征,如温度、电压、风扇工作状态、电源状态等

5 硬件配置

服务器具体配置要求如下:

  • 2个千兆网口
  • 至少8G内存
  • 磁盘至少40G

6 系统优化

主机的优化不单纯只是软硬件的优化,基于操作系统的性能优化也是多方面的,可以从几个方面进行衡量,以更好的提高主机的性能。

6.1 关闭SELinux(控制节点、BareMetal节点)

SELinux不关闭的情况下无法实现,会限制ssh免密码登录。

[root@localhost  ~]#setenforce 0
[root@localhost  ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

6.2 关闭防火墙(控制节点、BareMetal节点)

防止安装时出现各个组件的端口不能访问的问题。

[root@localhost  ~]#systemctl stop firewalld && systemctl disable firewalld                          

6.3 时间同步(控制节点、BareMetal节点)

同步时间可以有效解决因时间不同而造成的不同步。

[root@localshot  ~]# yum -y install ntp
[root@localhost  ~]# ntpdate ntp1.aliyun.com
[root@localhost  ~]# timedatectl set-timezone Asia/Shanghai

6.4 修改系统打开文件最大数量(控制节点、BareMetal节点)

放开系统打开文件最大数量,防止因达到上限值而导致的进程终止。

[root@localhost  ~]# vi /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

6.5 安装OpenStack国内yum源(BareMetal节点)

安装阿里的OpenStack yum源可以加快各组件的下载速度。

[root@localhost  ~]# cat << EOF >> /etc/yum.repos.d/openstack.repo
[openstack-rocky]
name=openstack-rocky
baseurl=https://mirrors.aliyun.com/centos/7/cloud/x86_64/openstack-rocky/
enabled=1
gpgcheck=0
[qume-kvm]
name=qemu-kvm
baseurl= https://mirrors.aliyun.com/centos/7/virt/x86_64/kvm-common/
enabled=1
gpgcheck=0
EOF

6.6 降低Swap分区使用率(控制节点、BareMetal节点)

现在服务器的内存一般是上百GB,所以我们可以把这个参数值设置的低一些(如10-30之间),让操作系统尽可能的使用物理内存,降低系统对swap的使用,从而提高宿主机系统和虚拟机的性能。

[root@localhost  ~]# cat << EOF >> /etc/yum.repos.d/openstack.repo
[openstack-rocky]
name=openstack-rocky
baseurl=https://mirrors.aliyun.com/centos/7/cloud/x86_64/openstack-rocky/
enabled=1
gpgcheck=0
[qume-kvm]
name=qemu-kvm
baseurl= https://mirrors.aliyun.com/centos/7/virt/x86_64/kvm-common/
enabled=1
gpgcheck=0
EOF

7 OpenStack环境验证(控制节点)

Bare Metal服务是各个组件的集合,这些组件为管理和配置物理机提供支持,在部署Bare Metal之前必须要确保已经设置了Keystone、Image、Nova、Neutron等服务。Bare Metal通常在一个独立的计算节点上运行。

7.1 验证Keystone

[root@controller ~]# source admin-openrc
[root@controller ~ ]# openstack user list

命令行展示

7.2 验证Glance

[root@controller ~]# wget http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img
[root@controller ~]# openstack image create "cirros" --file cirros-0.3.4-x86_64-disk.img --disk-format qcow2 --container-format bare --public

7.3 验证Nova

[root@controller ~]# openstack compute service list
命令行展示

7.4 验证Endpoint

[root@controller ~]# openstack endpoint list
命令行展示

7.5 验证Neutron

[root@controller ~]# openstack  network agent list
命令行展示

8 部署Ironic(控制节点、Bare Metal)

8.1 MySQL中创建库和权限(控制节点)

在数据库中创建Ironic库,并且授予用户访问库的权限。

[root@localhost ~]# mysql -uroot -p
MariaDB [(none)]> CREATE DATABASE ironic CHARACTER SET utf8;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON ironic.* TO 'ironic'@'localhost' identified by 'tera123';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON ironic.* TO 'ironic'@'%' identified by 'tera123';

8.2 添加Ironic用户及其鉴权信息(控制节点)

[root@controller ~]# openstack service create --name ironic \
--description "Ironic baremetal provisioning service" baremetal
[root@controller ~ ]# openstack user create --domain default --password-prompt ironic
[root@controller ~]# openstack role add --project service --user ironic admin
[root@controller ~]# openstack endpoint create --region RegionOne baremetal admin\
http://192.168.5.221:6385
[root@controller ~]#openstack endpoint create –region RegionOne baremetal public \
http://192.168.5.221:6385
[root@controller ~]#openstack endpoint create --region RegionOne baremetal internal \
http://192.168.5.221:6385

8.3 安装软件包(Bare Metal)

[root@bare ~]# yum install openstack-ironic-api openstack-ironic-conductor python-ironicclient -y

8.4 配置Ironic配置文件(Bare Metal)

此次Ironic-api和Ironic-conductor同节点部署。

[root@localhost ~]# vi /etc/ironic/ironic.conf
[DEFAULT]
my_ip=192.168.4.221
transport_url = rabbit://openstack:tera123@192.168.4.220
auth_strategy = keystone
[database]
connection=mysql+pymysql://ironic:tera123@192.168.4.220/ironic?charset=utf8
[conductor]
automated_clean = false
clean_callback_timeout = 1800
rescue_callback_timeout = 1800
soft_power_off_timeout = 600
power_state_change_timeout = 30
power_failure_recovery_interval = 300
[glance]
url = http://192.168.4.220:9292
auth_url = http://192.168.4.220:5000
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = glance
password = tera123
[service_catalog]
region_name = RegionOne
project_domain_id = default
user_domain_id = default
project_name = service
password = tera123
username = ironic
auth_url = http://192.168.4.220:5000
auth_type = password
[keystone_authtoken]
auth_type=password
www_authenticate_uri = http://192.168.4.220:5000
auth_url = http://192.168.4.220:5000
username=ironic
password=tera123
project_name=service
project_domain_name=default
user_domain_name=default
[neutron]
auth_type = password
auth_url = http://192.168.4.220:5000
username=ironic
password=tera123
project_name=service
project_domain_id=default
user_domain_id=default
region_name = RegionOne
valid_interfaces=public

8.5 同步Ironic数据库并启动服务(Bare Metal)

[root@bare ~]# ironic-dbsync --config-file /etc/ironic/ironic.conf create_schema
[root@bare ~]# systemctl enable openstack-ironic-api openstack-ironic-conductor 
[root@bare ~]# systemctl start openstack-ironic-api openstack-ironic-conductor 

8.6 安装Nova Compute(Bare Metal)

[root@bare ~]# yum install openstack-nova-compute -y

8.7 配置Nova配置文件(Bare Metal、控制节点)

修改控制节点和Bare Metal的nova.conf配置文件。

Bare Metal:
[DEFAULT]
transport_url = rabbit://openstack:tera123@192.168.5.220
my_ip=192.168.5.221
use_neutron=true
compute_driver=ironic.IronicDriver
firewall_driver=nova.virt.firewall.NoopFirewallDriver
reserved_host_cpus=0
[filter_scheduler]
track_instance_changes=False
[scheduler]
discover_hosts_in_cells_interval=120
[ironic]
api_retry_interval = 5
api_max_retries = 300
auth_type=password
auth_url=http://192.168.5.220:5000/v3
project_name=service
username=ironic
password=tera123
project_domain_name=default
user_domain_name=default
[placement]
region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://192.168.5.220:5000/v3
username = placement
password = tera123
[neutron]
url = http://192.168.5.220:9696
auth_url = http://192.168.5.220:5000
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = neutron
password = tera123

控制节点:
[DEFAULT]
my_ip=192.168.5.220
use_neutron=true
firewall_driver=nova.virt.firewall.NoopFirewallDriver
enabled_apis=osapi_compute,metadata
transport_url=rabbit://openstack:tera123@192.168.5.220
compute_driver=ironic.IronicDriver
reserved_host_memory_mb=0
[scheduler]
discover_hosts_in_cells_interval=120
[api]
auth_strategy=keystone
[api_database]
connection=mysql+pymysql://nova:tera123@192.168.5.220/nova_api
[database]
connection= mysql+pymysql://nova:tera123@192.168.5.220/nova
[glance]
api_servers= http://192.168.5.220:9292
[keystone_authtoken]
www_authenticate_uri = http://192.168.5.220:5000
auth_url=http://192.168.5.220:5000/v3
memcached_servers= 192.168.5.220:11211
auth_type=password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = tera123
[placement]
region_name = RegionOne
user_domain_name = Default
auth_type=password
auth_url=http://192.168.5.220:5000/v3
project_name=service
project_domain_name=Default
username=placement
password=tera123
[placement_database]
connection= mysql+pymysql://placement:tera123@192.168.5.220/placement
[scheduler]
discover_hosts_in_cells_interval= 300         
[vnc]
enabled=true
server_listen=$my_ip
server_proxyclient_address=$my_ip
[neutron]
url=http://192.168.5.220:9696
auth_type=password
auth_url=http://192.168.5.220:5000
project_name=service
project_domain_name=default
username=neutron
user_domain_name=default
password=tera123
region_name=RegionOne
service_metadata_proxy = true
metadata_proxy_shared_secret = tera123
[ironic]
auth_type=password
auth_url=http://192.168.5.220:5000/v3
project_name=service
username=ironic
password=tera123
project_domain_name=Default
user_domain_name=Default

8.8 注册Cell并启动Nova服务(控制节点、Bare Metal)

[root@controller ~]# nova-manage cell_v2 discover_hosts --by-service
[root@bare ~]# systemctl enable openstack-nova-compute.service
[root@bare ~]# systemctl start openstack-nova-compute.service
[root@controller ~]# systemctl restart openstack-nova-scheduler

8.9 验证Bare Metal节点(控制节点)

[root@bare ~]# openstack compute service list
命令行展示

9 部署Ironic Network(控制节点、Bare Metal)

Ironic由以下三种网络组成:

  • Provisioning Network:用来注册并部署裸金属实例的网络,所以要求连通IPMI、DHCP、PXE以及裸金
    属服务器,有Flat、VLAN、SDN等多种方案,此次部署采用Flat网络
  • Cleaning Netowork:用于初始化裸金属节点,完成抹盘、初始化配置信息等工作。要求连通IPMI以及
    裸金属服务器
  • Tenant Netowork:常规的Neutron租户网络

9.1 部署Ovs Agent(Bare Metal)

这里已经有一个完善的OpenStack Neutron环境,所以只需配置Bare Metal节点即可。

[root@bare ~]# yum install openstack-neutron-openvswitch ipset -

9.2 配置Ovs Agent(Bare Metal)

[root@bare ~]# vi /etc/neutron/plugins/ml2/openvswitch_agent.ini
[agent]
l2_population = true
arp_responder = true
[ovs]
bridge_mappings = provider:br-provider
datapath_type = system
local_ip = 192.168.5.221
[securitygroup]
enable_security_group = True
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver

9.3 启动OpenvSwitch服务(Bare Metal)

[root@bare ~]# systemctl enable neutron-openvswitch-agent
[root@bare ~]# systemctl start neutron-openvswitch-agent

9.4 手动创建网桥绑定网卡(Bare Metal)

因为我们这里选择的是Flat网络模式,所以需要Ovs网桥和物理网卡绑定用来访问外网。

[root@bare ~]# ovs-vsctl add-br br-provider
[root@bare ~]# ovs-vsctl add-port br-provider ens192

9.5 验证Ovs网桥(Bare Metal)

[root@bare ironic]# ovs-vsctl show
7c01fc3a-3aca-4a08-bf0d-76d1b6703f87
    Manager "ptcp:6640:127.0.0.1"
        is_connected: true
    Bridge br-provider
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        fail_mode: secure
        Port "ens192"
            Interface "ens192"
        Port br-provider
            Interface br-provider
                type: internal
        Port phy-br-provider
            Interface phy-br-provider
                type: patch
                options: {peer=int-br-provider}
    Bridge br-int
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        fail_mode: secure
        Port int-br-provider
            Interface int-br-provider
                type: patch
                options: {peer=phy-br-provider}
        Port br-int
            Interface br-int
                type: internal
ovs_version: "2.11.0"

9.6 控制节点Neutron配置(控制节点)

控制节点Neutron是提前配置好的,这里检查一下配置文件。

[root@controller ~]# vi /etc/neutron/neutron.conf 
[DEFAULT]
state_path = /var/lib/neutron
auth_strategy = keystone
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True
notify_nova_on_port_status_changes = true
notify_nova_on_port_data_changes = true
transport_url = rabbit://openstack:tera123@192.168.5.220
[database]
connection = mysql+pymysql://neutron:tera123@192.168.5.220/neutron
[keystone_authtoken]
www_authenticate_uri = http://192.168.5.220:5000
auth_url = http://192.168.5.220:5000
memcached_servers = 192.168.5.220:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = tera123
[nova]
auth_url = http://192.168.5.220:5000
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = nova
password = tera123

[root@controller ~]# vi /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
type_drivers = flat,vlan,vxlan
tenant_network_types = vxlan,flat
mechanism_drivers = openvswitch,l2population,baremetal
extension_drivers = port_security
[ml2_type_vxlan]
vni_ranges = 1:1000
[ml2_type_flat]
flat_networks = provider
[securitygroup]
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
enable_ipset = true
enable_security_group = true

[root@controller ~]# vi /etc/neutron/plugins/ml2/openvswitch_agent.ini
[agent]
tunnel_types = vxlan
l2_population = true
arp_responder = true
[ovs]
bridge_mappings = provider:br-provider
datapath_type = system
local_ip = 192.168.5.220
[securitygroup]
enable_security_group = True
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver

9.7 安装Ironic Neutron Agent(控制节点)

[root@controller ~]# yum install -y python2-ironic-neutron-agent
[root@controller ~]# vi /etc/neutron/plugins/ml2/ironic_neutron_agent.ini
[DEFAULT]
debug = true
[agent]
log_agent_heartbeats = true
[ironic]
project_domain_name = default
project_name = service
user_domain_name = default
password = tera123
username = ironic
auth_url = http://192.168.5.220:5000/v3
auth_type = password

9.8 启动Ironic Neutron Agent(控制节点)

[root@controller ~]# systemctl enable ironic-neutron-agent 
[root@controller ~]# systemctl start ironic-neutron-agent 

9.9 安装Baremetal插件(控制节点)

以往使用Flat网络接口时创建的裸机Port状态会一直处于DOWN,但裸机操作系统的部署依然能够成功且正常工作。而 Networking-baremetal项目正是希望解决裸机Port状态不正常的问题,该项目提供了网络服务和裸机服务深度集成的功能,不仅能完成裸机Port状态变更,还能提供Routed Networks功能。

[root@controller ~]# yum install python2-networking-baremetal -y
[root@controller ~]# systemctl restart neutron-server

9.10 创建Provisioning Network(控制节点)

创建一个 Flat 类型的 Provisioning Network,该网络通过虚拟二层直接与物理二层网络通信,通过物理交换机连通到裸金属服务器,使得裸金属服务器可以借助该网络DHCP服务获取到IP地址和PXE服务器的信息。所以Subnet一定要Enable DHCP。

[root@controller ~]# openstack network create --project admin flat --share --provider-network-type flat --provider-physical-network provider
[root@controller ~]# openstack subnet create subnet \
--network flat --subnet-range 192.168.4.0/24 --ip-version 4 \
--gateway 192.168.4.1 --allocation-pool start=192.168.4.230,end=192.168.4.240 --dhcp

9.11 Ironic使用Neutron Network(Bare Metal)

配置Ironic使用Cleaning Network和Provisioning Network。

[root@controller ~]# openstack network list
命令行展示
[root@controller ~]# openstack security group list
命令行展示
[root@bare ~]# vi /etc/ironic/ironic.conf
[neutron]
cleaning_network=3793d3bd-5a26-4dd2-a637-007b8ed7c2b0
cleaning_network_security_groups=42263b5f-cdff-4374-a04c-506cc22eee70
provisioning_network=3793d3bd-5a26-4dd2-a637-007b8ed7c2b0
provisioning_network_security_groups=42263b5f-cdff-4374-a04c-506cc22eee70
[root@bare ~]# systemctl restart openstack-ironic-conductor openstack-ironic-api 

10 构建镜像(控制节点)

Ironic镜像分为Deploy镜像和User镜像两种,Deploy镜像用来给裸机使用,来引导最终的OS,User镜像则是用户最终会使用到的镜像。

10.1 构建Deploy Images

这里我们没有定制镜像的需求,所以直接下载。

[root@controller ~]# wget \ 
https://tarballs.openstack.org/ironic-python-agent/coreos/files/coreos_production_pxe.vmlinuz
[root@controller ~]#wget \
https://tarballs.openstack.org/ironic-python-agent/coreos/files/coreos_production_pxe_image-oem.cpio.gz 

10.2 上传Deploy Images

[root@controller ~]# glance image-create --name deploy-vmlinuz --visibility public --disk-format aki --container-format aki < coreos_production_pxe.vmlinuz
[root@controller ~]# glance image-create --name deploy-initrd --visibility public --disk-format ari --container-format ari < coreos_production_pxe_image-oem.cpio.gz

10.3 构建User Images

这里要自定义用户名和密码,需要传递变量,注意镜像的用户不能为root。

[root@controller ~]# export DIB_CLOUD_INIT_DATASOURCES="ConfigDrive, OpenStack"
[root@controller ~]# export DIB_DEV_USER_USERNAME=centos
[root@controller ~]# export DIB_DEV_USER_PWDLESS_SUDO=yes 
[root@controller ~]# export DIB_DEV_USER_PASSWORD=tera123
[root@controller~]# disk-image-create my-initrd baremetal dhcp-all-interfaces grub2 install-static devuser -o centos7 cloud-init-datasources

10.4 上传User Images

[root@controller ~]# glance image-create --name my-image.vmlinuz --visibility public --disk-format aki --container-format aki < my-image.vmlinuz
[root@controller ~]# glance image-create --name my-image.initrd --visibility public --disk-format ari --container-format ari < my-image.initrd
[root@controller ~]# export MY_VMLINUZ_UUID=$(openstack image list | awk '/my-image.vmlinuz/ { print $2 }')
[root@controller ~]# export MY_INITRD_UUID=$(openstack image list | awk '/my-image.initrd/ { print $2 }')
[root@controller ~]# glance image-create --name my-image --visibility \
public --disk-format qcow2 --container-format bare --property \
kernel_id=$MY_VMLINUZ_UUID --property ramdisk_id=$MY_INITRD_UUID < my-image.qcow2

11 配置Bare Metal驱动(Bare Metal)

本次部署采用的是PEX+IPMI的驱动来支持,IPMI控制硬件设备,PXE实施部署。需要提前配置好裸机带外管理口IP地址。

11.1 修改Ironic配置文件

[root@bare ~]# vi /etc/ironic/ironic.conf
[DEFAULT]
my_ip=192.168.5.220
transport_url = rabbit://openstack:tera123@192.168.5.220
auth_strategy = keystone
enabled_hardware_types = ipmi
enabled_boot_interfaces = pxe
enabled_console_interfaces = ipmitool-socat,no-console
enabled_deploy_interfaces = iscsi
enabled_inspect_interfaces = inspector
enabled_management_interfaces = ipmitool
enabled_power_interfaces = ipmitool
enabled_raid_interfaces = agent
enabled_vendor_interfaces = ipmitool, no-vendor
enabled_storage_interfaces = cinder, noop
enabled_network_interfaces = flat,neutron

11.2 配置PXE服务器

[root@bare ~]# vi /etc/ironic/ironic.conf
[ipmi]
retry_timeout=60
[pxe]
ipxe_enabled = False
pxe_append_params=nofb nomodeset vga=normal console=ttyS0 systemd.journald.forward_to_console=Yes
tftp_root=/tftpboot
tftp_server=192.168.5.221

11.3 重启服务并验证

[root@bare ~]# systemctl restart openstack-ironic-conductor
[root@bare ~]# openstack baremetal driver list
命令行展示

11.4 安装IPMI Tool并验证

IPMI Tool要确保能够和目标主机带外管理口通信。

[root@bare ~]# yum -y install ipmitool 
[root@bare ~]# ipmitool -I lanplus -H 192.168.5.33 -U ADMIN -P tera123 chassis power status
Chassis Power is on

11.5 配置TFTP服务

[root@bare ~]# mkdir /tftpboot
[root@bare ~]# chown -R ironic.ironic /tftpboot
[root@bare ~]# yum -y install tftp-server syslinux-tftpboot xinetd 
[root@bare ~]# vi /etc/xinetd.d/tftp
service tftp
{
  protocol        = udp
  port            = 69
  socket_type     = dgram
  wait            = yes
  user            = root
  server          = /usr/sbin/in.tftpd
  server_args     = -v -v -v -v -v --map-file /tftpboot/map-file /tftpboot
  disable         = no
  flags           = IPv4
}
[root@bare ~]# cp /usr/share/syslinux/pxelinux.0 /tftpboot
[root@bare ~]# cp /usr/share/syslinux/chain.c32 /tftpboot
[root@bare ~]# echo 're ^(/tftpboot/) /tftpboot/\2' > /tftpboot/map-file 
echo 're ^/tftpboot/ /tftpboot/' >> /tftpboot/map-file 
echo 're ^(^/) /tftpboot/\1' >> /tftpboot/map-file 
echo 're ^([^/]) /tftpboot/\1' >> /tftpboot/map-file

11.6 启动TFTP并验证

[root@bare ~]# systemctl enable xinetd
[root@bare ~]# systemctl start xinetd
[root@bare ~]# echo 'tftp' > /tftpboot/1
[root@controller ~]# tftp 192.168.5.221 -c get 1
[root@controller ~]# cat 1
Tftp

11.7 安装ISCSI Deploy支持工具

因为使用 iSCSI Deploy 方式的话,Ironic Conductor 节点会作为 iSCSI Client 并执行镜像的注入,所以需要安装 qemu-img 和 iscsiadm 指令行工具。

[root@bare ~]# yum -y install qemu-img iscsi-initiator-utils

12 注册裸机(控制节点)

12.1 创建Ironic Node

创建一个执行 IPMI 的 Ironic Node。

[root@controller ~]# export IRONIC_API_VERSION=1.11
[root@controller ~]# export OS_BAREMETAL_API_VERSION=1.11
[root@controller ~]# openstack baremetal node create --driver ipmi --name node1

12.2 设备部署接口类型

设置部署接口类型,现在可支持ISCSI、Direct、Ansible等类型,每种类型都有不同的行为模型,可根据实际情况选择,这里我们选择最简单的、但却在生产环境中并不特别友好(占用 Provisioning Network 的带宽)的 ISCSI类型。

[root@controller ~]# openstack baremetal node list
命令行展示
[root@controller ~]# openstack baremetal --os-baremetal-api-version 1.31 \
node set c83162c6-748f-4c90-840b-d5e07df83c97  \ 
--deploy-interface iscsi      --raid-interface agent

12.3 设置IPMI Info

这里主要配置IPMI的登录账户信息。

[root@controller ~]# openstack baremetal node set c83162c6-748f-4c90-840b-d5e07df83c97 \
                   --driver-info ipmi_username=ADMIN \
                   --driver-info ipmi_password=tera123 \
                   --driver-info ipmi_address=192.168.5.33

12.4 设置Deploy Images

通过RAMDisk的方式启动。

[root@controller ~]# openstack baremetal node set c83162c6-748f-4c90-840b-d5e07df83c97 \
                   --driver-info deploy_kernel=fcce4694-3955-40c8-be2f-c5ba890071ec \
                   --driver-info deploy_ramdisk= 0fbd622c-bb9e-4729-8cab-f2aae07a5814

12.5 设置Provisioning/Cleaning Network

[root@controller ~]# openstack baremetal node set c83162c6-748f-4c90-840b-d5e07df83c97 \
                   --driver-info cleaning_network= 3793d3bd-5a26-4dd2-a637-007b8ed7c2b0 \
--driver-info provisioning_network= 3793d3bd-5a26-4dd2-a637-007b8ed7c2b0

12.6 设置PXE网卡MAC地址

在Provisioning网络中通过这个MAC地址为Node分配IP地址。

[root@controller ~]# openstack baremetal port create ac:1f:6b:da:d9:c0 \
 --node c83162c6-748f-4c90-840b-d5e07df83c97

12.7 配置Resource Class

为Ironic node设置Placement筛选候选人的Resource Class类型,Nova-compute for Ironic会自动为其创建Placement Resource Provider。

[root@controller ~]# openstack --os-baremetal-api-version 1.21 baremetal node set c83162c6-748f-4c90-840b-d5e07df83c97 --resource-class BAREMETAL_TEST

12.8 设置Ironic Node基础信息

[root@controller ~]# openstack baremetal node set c83162c6-748f-4c90-840b-d5e07df83c97 \
--property cpus=48 --property memory_mb=131072 --property local_gb=1000
[root@controller ~]# openstack baremetal node set c83162c6-748f-4c90-840b-d5e07df83c97 \
--property capabilities='boot_mode:bios'

12.9 验证Ironic Node纳管

[root@controller ~]# openstack baremetal --os-baremetal-api-version 1.11 node manage c83162c6-748f-4c90-840b-d5e07df83c97
[root@controller ~]# openstack baremetal --os-baremetal-api-version 1.11 node provide c83162c6-748f-4c90-840b-d5e07df83c97
[root@controller ~]# openstack baremetal node show c83162c6-748f-4c90-840b-d5e07df83c97\
| grep provision_state
| provision_state        | available

12.10 创建实例Flavor

[root@controller ~]# openstack flavor create --ram 131072 --vcpus 48 --disk 100 my-baremetal-flavor
[root@controller ~]# openstack flavor set --property resources:CUSTOM_BAREMETAL_TEST=1 my-
baremetal-flavor
[root@controller ~]# openstack flavor set --property resources:VCPU=0 my-baremetal-flavor 
[root@controller ~]# openstack flavor set --property resources:MEMORY_MB=0 my-baremetal-flavor 
[root@controller ~]# openstack flavor set --property resources:DISK_GB=0 my-baremetal-flavor

13 实例部署(控制节点)

13.1 执行部署

[root@controller ~]# openstack server create --flavor my-baremetal-flavor \ 
--nic net-id=3793d3bd-5a26-4dd2-a637-007b8ed7c2b0 \
--image 08e111be-d256-4c43-bb07-ea65a1219f77 test

13.2 验证结果

[root@controller ~]# openstack server list
命令行展示
[root@controller ~]# openstack baremetal port show eb97e31d-5200-4f1a-beef-75a1c91cc1b6
命令行展示
[root@controller ~]# openstack port show baed8d7c-b6fc-48e8-8cc8-b16b7b55d4a2
命令行展示
[root@controller ~]# ssh root@192.168.4.236
命令行展示

14 常见问题

14.1 获取swift_temp_url报错

MissingAuthPlugin: An auth plugin is required to determine endpoint URL。因为我们选择了Direct的部署方式,裸机服务器的IPA会从Swift Object Storage将User Image拉到本地,在裸机端完成镜像注入,但是我们环境中没有部署Swift,所以需要改为ISCSI的部署方式。

[root@controller ~]# openstack baremetal --os-baremetal-api-version 1.31\
 node set c83162c6-748f-4c90-840b-d5e07df83c97 \
 --deploy-interface iscsi   --raid-interface agent

14.2 DHCP报错

PXE-E51: No DHCP or proxyDHCP offers were received。这是在为裸机MAC地址分配IP地址时发生的报错,主要原因是因为DHCP服务器与裸机网络不通,需要确保DHCP服务器与裸机之间可以通信。检查Neutron的配合文件,测试Provisioning网络的可用性。

14.3 TFTP Time out

PXE-E32 TFTP open timeout。

TFTP…这是在裸机分配到IP地址之后,下载Deploy Images时发生的报错,因为已经分配到IP地址,所以provisioning网络是没有问题的,发生这个报错可能是因为TFTP服务没有启动或者是TFTP服务器和裸机两者之间路由不通,本次部署是因为路由不通导致的TFTP超时。

14.4 Unexpected error while running commad

dd: error writing '/dev/disk/by-path/ip-192.168.4.234:3260-iscsi-iqn.2008-10.org.openstack:c83162c6-748f-4c95e07df83c97-lun-1-part1': InstanceDeployFailure: Deploy failed for instance 7837119e-a626-45d9-8233-21ebcb19aa28. Error: Unexpected error while running command.

这个报错发生在Deploy的最后一步注入用户镜像,起初以为是裸机硬盘损坏无法注入完整镜像,通过更换物理硬盘没有解决问题。后来发现在注入用户镜像的过程中会发生Bare Metal节点和裸机之间网络不通的问题,因为给裸机注入镜像是通过ISCSI方式连接3260端口挂载裸机硬盘到本地注入,网络不通直接就会导致挂载硬盘失败。此时观察裸机网络发现居然有两个IP,一个是通过部署的DHCP分配的4网段IP也就是我们Provisioning网络的IP与Bare Metal不通,第二个网段IP是其他DHCP分配,但是和Bare Metal之间可以互通,猜测可能是因为两个IP导致4段IP不是主路由IP。拔掉5网段网线,再次部署,注入镜像成功。

14.5 Ping不通裸机

裸机部署完成之后,PING/SSH裸机失败。是因为没有指定安全组,默认安全组没有放行。

[root@bare ~]# vi /etc/ironic/ironic.conf
[neutron]
cleaning_network=3793d3bd-5a26-4dd2-a637-007b8ed7c2b0
cleaning_network_security_groups=42263b5f-cdff-4374-a04c-506cc22eee70
provisioning_network=3793d3bd-5a26-4dd2-a637-007b8ed7c2b0
provisioning_network_security_groups=42263b5f-cdff-4374-a04c-506cc22eee70

14.6 获取Deploy Image报错

ERROR while preparing to deploy to node : MissingAuthPlugin: An auth plugin is required to determine endpoint URL,这是一个Bug。获取Image的时候MissingAuthPlugin是因为没有配置Glance。

[root@bare ~]# vi /etc/ironic/ironic.conf
[glance]
url = http://192.168.5.220:9292
auth_url = http://192.168.5.220:5000
auth_type = password
project_domain_name = default
user_domain_name = default	
region_name = RegionOne
project_name = service
username = glance
password = tera123

15 参考文献

OpenStack官网:https://docs.openstack.org/

6 参考资料

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

OpenStack-OpenvSwitch源码安装部署方案

1 OpenStack简介

OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。OpenStack支持几乎所有类型的云环境,项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenStack通过各种互补的服务提供了基础设施即服务(IaaS)的解决方案,每个服务提供API以进行集成。

2 OpenStack架构图

整个OpenStack是由控制节点,计算节点,网络节点,存储节点四大部分组成。控制节点负责对其余节点的控制,包含虚拟机建立,迁移,网络分配,存储分配等等。计算节点负责虚拟机运行网络节点负责对外网络与内网络之间的通信存储节点负责对虚拟机的额外存储管理。其中各组件架构图如下:

OpenStack架构图

3 OpenStack必要组件

  • 认证管理服务,提供了Openstack其余所有组件的认证信息/令牌的管理、创建、修改等等,使用MySQL等数据库存储认证信息
  • 计算管理服务,是Openstack计算的弹性控制,提供虚拟机的创建、运行、迁移、快照等围绕虚拟机的服务,并提供API与控制节点对接,由控制节点下发任务,使用nova-api进行通信
  • 网络管理服务,提供了对网络节点的网络拓扑管理,负责管理私有网络与公有网络的通信,以及管理虚拟机网络之间通信/拓扑、管理虚拟机之上的防火墙等,同时提供Neutron在Horizon的管理界面
  • 镜像管理服务,用于管理虚拟机部署时所能提供的镜像,包含镜像的导入、格式以及制作相应的模板,是一套虚拟机镜像发现、注册、检索系统,所有计算实例都是从Glance镜像启动的
  • 控制台服务,是一个用以管理、控制Openstack服务的Web控制面板,它可以管理实例、镜像、创建密匙对,对实例添加卷、操作Swift容器等,用户还可以在控制面板中使用终端(console)或VNC直接访问实例

4 OpenStack基础服务

  • OpenStack使用SQL数据库来存储信息。该数据库通常在控制器节点上运行
  • OpenStack使用消息队列来协调服务之间的操作和状态信息。消息队列服务通常在控制器节点上运行
  • 服务的身份服务、身份验证机制使用Memcached来缓存令牌。Memcached服务通常在控制器节点上运行
  • OpenStack服务使用Etcd(分布式可靠的键值存储)进行分布式键锁定,存储配置,跟踪服务活动性和其他情况

5 硬件配置

主机系统网卡1:eno1网卡2:eno2
openstackCentos7.6192.168.4.145192.168.5.145
computeCentos7.6192.168.4.144192.168.5.144

服务器具体配置要求如下:

  • 2个千兆网口
  • 至少8G内存
  • 磁盘至少40G
  • 计算节点的BISO中开启CPU嵌套虚拟化(INTEL叫VT-x,AMD的叫AMD-V)

6 系统优化

主机的优化不单纯只是软硬件的优化,基于操作系统的性能优化也是多方面的,可以从几个方面进行衡量,以更好的提高主机的性能。

6.1 关闭SELinux(控制节点、计算节点)

SELinux不关闭的情况下无法实现,会限制ssh免密码登录。

[root@localhost  ~]# setenforce 0 
[root@localhost  ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

6.2 关闭防火墙(控制节点、计算节点)

防止安装时出现各个组件的端口不能访问的问题。

[root@localhost  ~]#systemctl stop firewalld && systemctl disable firewalld                          

6.3 时间同步(控制节点、计算节点)

同步时间可以有效解决因时间不同而造成的不同步。

[root@localshot  ~]# yum -y install ntp
[root@localhost  ~]# ntpdate ntp1.aliyun.com
[root@localhost  ~]# timedatectl set-timezone Asia/Shanghai

6.4 内核隔离(控制节点、计算节点)

OpenStack部分机器用于做控制节点,大部分机器都是需要运行虚拟化软件,虚拟化平台有大量VM,而宿主机本身的系统也会跑一些服务,那么这就势必会造成VM与宿主机系统之间资源的抢占。我们可以通过修改内核参数指定操作系统使用指定的几个核,解决抢占问题。

[root@localhost  ~]# vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="isolcpus=8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47"
[root@localhost  ~]# update-grub

6.5 关闭KVM内存共享(计算节点)

内存配置方面,关闭KVM内存共享,打开透明大页,提升主机CPU性能。

[root@localhost  ~]# echo 0>/sys/kernel/mm/ksm/pages_shared
echo 0>/sys/kernel/mm/ksm/pages_sharing
echo always > /sys/kernel/mm/transparent_hugepage/enabled
echo always>/sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
[root@localhost  ~]# echo 0>/sys/kernel/mm/ksm/pages_shared
echo 0>/sys/kernel/mm/ksm/pages_sharing
echo always > /sys/kernel/mm/transparent_hugepage/enabled
echo always>/sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo 0 > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag

6.6 修改系统打开文件最大数量(计算节点、控制节点)

放开系统打开文件最大数量,防止因达到上限值而导致的进程终止。

[root@localhost  ~]# vi /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

6.7 降低Swap分区使用率(控制节点、计算节点) 

现在服务器的内存一般是上百GB,所以我们可以把这个参数值设置的低一些(如10-30之间),让操作系统尽可能的使用物理内存,降低系统对swap的使用,从而提高宿主机系统和虚拟机的性能。

[root@localhost  ~]# echo 'vm.swappiness=10' >>/etc/sysctl.conf

7 基础服务部署

7.1 安装OpenStack国内yum源(控制节点、计算节点)

安装阿里的OpenStack yum源可以加快各组件的下载速度。

[root@localhost  ~]# cat << EOF >> /etc/yum.repos.d/openstack.repo
[openstack-rocky]
name=openstack-rocky
baseurl=https://mirrors.aliyun.com/centos/7/cloud/x86_64/openstack-rocky/
enabled=1
gpgcheck=0
[qume-kvm]
name=qemu-kvm
baseurl= https://mirrors.aliyun.com/centos/7/virt/x86_64/kvm-common/
enabled=1
gpgcheck=0
EOF

7.2 部署OpenStackClient(控制节点)

[root@localhost  ~]# yum upgrade -y
[root@localhost  ~]# yum install -y python-openstackclient openstack-selinux

7.3 部署MySQL(控制节点)

部署MySQL并且通过修改配置文件更改存储路径。

[root@localhost  ~]# yum install -y mariadb mariadb-server python2-PyMySQL
[root@localhost  ~]# vi /etc/my.cnf.d/openstack.cnf
[mysqld]
bind-address=192.168.4.145
default-storage-engine = innodb
innodb_file_per_table = on
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8
[root@localhost  ~]# vi /etc/my.cnf
[client-mariadb]
socket=/var/lib/mysql/mysql.sock
[mysqld]
query_cache_size = 0
query_cache_type = OFF
max_connections = 4096
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

7.4 启动MySQL(控制节点)、

修改MySQL用户密码,并且system管理MySQL。

[root@localhost  ~]# systemctl enable mariadb
[root@localhost  ~]# systemctl start mariadb
[root@localhost  ~]# mysql -uroot 
MariaDB [(none)]> update mysql.user set password=password('tera123') where user = 'root';
MariaDB [(none)]> flush privileges;

7.5 部署RabbitMq(控制节点)

部署RabbitMq来协调服务之间的操作和状态信息,并且修改RabbitMq存储路径。

[root@localhost  ~]# yum -y install rabbitmq-server
[root@localhost  ~]# vi /etc/rabbitmq/rabbitmq-env.conf
RABBITMQ_MNESIA_BASE=/var/lib/rabbitmq/mnesia
RABBITMQ_LOG_BASE=/var/lib/rabbitmq/log
[root@localhost  ~]# mkdir -p /var/lib/rabbitmq/mnesia
[root@localhost  ~]# mkdir -p /var/lib/rabbitmq/log
[root@localhost  ~]# chmod -R 755 /var/lib/rabbitmq
[root@localhost  ~]# systemctl enable rabbitmq-server.service
[root@localhost  ~]# systemctl start rabbitmq-server.service

7.6 配置RabbitMq用户 (控制节点)

添加OpenStack用户并且配置用户权限

[root@localhost  ~]# rabbitmqctl add_user openstack tera123
Creating user “openstack” …
[root@localhost  ~]# rabbitmqctl set_permissions openstack ".*" ".*" ".*"
Setting permissions for user “openstack” in vhost “/”…

7.7 部署Memcached(控制节点)

部署Memcached,并修改配置文件。

[root@localhost  ~]# yum -y install memcached
[root@localhost  ~]# vi /etc/sysconfig/memcached
OPTIONS="-l 127.0.0.1,::1,192.168.4.145"
[root@localhost  ~]# systemctl enable memcached
[root@localhost  ~]# systemctl start memcached

7.8 部署Etcd(控制节点)

部署Etcd,修改配置文件,并且使用system管理。

[root@localhost  ~]# yum -y install etcd
[root@localhost  ~]# vi /etc/etcd/etcd.conf
ETCD_LISTEN_PEER_URLS=http://192.168.4.145:2380
ETCD_LISTEN_CLIENT_URLS="http://192.168.4.145:2379,http://127.0.0.1:2379"
ETCD_NAME="controller"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.4.145:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.4.145:2379"
ETCD_INITIAL_CLUSTER="controller=http://192.168.4.145:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
[root@localhost  ~]# systemctl enable etcd
[root@localhost  ~]# systemctl start etcd

8 Keystone(控制节点)

OpenStack Identity服务提供了一个集成点,用于管理身份验证,授权和服务目录。

Keystone通常是用户与之交互的第一项服务。身份验证后,最终用户可以使用其身份访问其他OpenStack服务。同样,其他OpenStack服务利用Keystone来确保用户是他们所说的人,并发现其他服务在部署中的位置用户和服务可以使用由Keystone管理的服务目录来查找其他服务。

服务目录是OpenStack部署中可用服务的集合。每个服务可以具有一个或多个端点,并且每个端点可以是以下三种类型之一:admin,internal或public。在生产环境中,出于安全原因,不同的终结点类型可能驻留在暴露给不同类型用户的单独网络上。

8.1 MySQL中创建库和权限

在数据库中创建Keystone用户,并且授予用户访问库的权限。

[root@localhost  ~]# mysql -uroot -p
MariaDB [(none)]> create database keystone;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' identified by 'tera123';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' identified by 'tera123';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'openstack' identified by 'tera123';

8.2 安装Keystone组件服务

部署openstack-keystone、http、http模块,配置Keystone。

[root@localhost  ~]# yum install openstack-keystone httpd mod_wsgi
[root@localhost  ~]# vi /etc/keystone/keystone.conf
[database]
connection=mysql+pymysql://keystone:tera123@192.168.4.145/keystone
[token]
provider=fernet

8.3 配置keystone库

导入keytone库SQL,初始化Fernet秘钥库存储,引导身份服务。

[root@localhost  ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone
[root@localhost ~]# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
[root@localhost~]# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
[root@localhost  ~]# keystone-manage bootstrap --bootstrap-password tera123\ 
--bootstrap-admin-url http://192.168.4.145:5000/v3/ \
--bootstrap-internal-url http://192.168.4.145:5000/v3/ \
--bootstrap-public-url http://192.168.4.145:5000/v3/ \
--bootstrap-region-id RegionOne

8.4 配置Apache HTTP服务器

[root@localhost  ~]# vi /etc/httpd/conf/httpd.conf
ServerName 192.168.4.145
[root@localhost  ~]# ln -s /usr/share/keystone/wsgi-keystone.conf  /etc/httpd/conf.d/

8.5 完成部署

System管理Keystone并且配置管理账户。

[root@localhost  ~]# systemctl enable httpd.service
[root@localhost  ~]# systemctl start httpd.service
[root@localhost  ~]# vi admin-openrc
export OS_USERNAME=admin
export OS_PASSWORD=tera123
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_AUTH_URL=http://192.168.4.145:5000/v3
export OS_IDENTITY_API_VERSION=3

8.6 创建Service项目

[root@localhost  ~]# openstack project create --domain default \
                    --description "Service Project" service
[root@localhost  ~]# openstack role create user

8.7 验证Keystone

[root@localhost  ~]# openstack user list
+----------------------------------------------------------------+--------------+
| ID                                  | Name  |
| 57341d3e37eb4dc997624f9502495e44 | admin  |
+-----------------------------------------------------------------+--------------+

9 Glance(控制节点)

Glance使用户可以发现、注册和检索虚拟机镜像。它提供了 REST API,使您可以查询虚拟机镜像元数据并检索实际镜像。您可以将通过Image服务提供的虚拟机存储在从简单文件系统到对象存储系统(如OpenStack Object Storage)的各种位置。Glance由以下部分组成:

  • glance-api:用于接收Glance发现、检索和存储的Image API调用
  • glance-registry:存储、处理和检索有关Glance的元数据。元数据包括大小和类型等项目

9.1 MySQL中创建库和权限

在数据库中创建Glance用户,并且授予用户访问库的权限。

[root@localhost  ~]# mysql -uroot -p
MariaDB [(none)]> create database glance;
MariaDB [(none)]>GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' identified by 'tera123';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' identified by 'tera123';
MariaDB [(none)]>GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'openstack' identified by 'tera123';

9.2 创建用户、服务

创建Glance用户,并且给Glance授权Admin role,创建服务向Keystone暴露Endpoint。

[root@localhost  ~]# openstack user create --domain default --password-prompt glance
[root@localhost  ~]# openstack role add --project service --user glance admin
[root@localhost  ~]# openstack service create --name glance \
 --description "OpenStack Image" image
[root@localhost  ~]# openstack endpoint create --region RegionOne image public \
                    http://192.168.4.145:9292
[root@localhost  ~]# openstack endpoint create --region RegionOne image internal \
                    http://192.168.4.145:9292
[root@localhost  ~]# openstack endpoint create --region RegionOne image admin \
                    http://192.168.4.145:9292


9.3 安装Glance组件服务

安装软件包,编辑Glance配置文件。

[root@localhost  ~]# yum install -y openstack-glance
[root@localhost  ~]# vi /etc/glance/glance-api.conf
[database]
connection = mysql+pymysql://glance:tera123@192.168.4.145/glance
[glance_store]
stores = file,http
default_store = file
[keystone_authtoken]
www_authenticate_uri = http://192.168.4.145:5000
auth_url = http://192.168.4.145:5000
memcached_servers = 192.168.4.145:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = glance
password = 123456
[paste_deploy]
flavor = keystone
[root@loaclhost  ~]# vi /etc/glance/glance-registry.conf
[database]
connection = mysql+pymysql://glance:tera123@192.168.4.145/glance
[keystone_authtoken]
www_authenticate_uri = http://192.168.4.145:5000
auth_url = http://192.168.4.145:5000
memcached_servers = 192.168.4.145:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = glance
password = 123456
[paste_deploy]
flavor = keystone

9.4 同步数据库

导入Glance库的SQL文件,启动Glance服务。

[root@localhost  ~]# su -s /bin/sh -c "glance-manage db_sync" glance
[root@localhost  ~]# systemctl start openstack-glance-api openstack-glance-registry
[root@localhost  ~]# systemctl enable openstack-glance-api openstack-glance-registry

9.5 验证Glance服务

上传镜像验证Glance服务可用性。

[root@localhost  ~]# wget http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img
[root@localhost  ~]# openstack image create "cirros" --file cirros-0.3.4-x86_64-disk.img --disk-format qcow2 --container-format bare --public
[root@localhost  ~]# openstack image list
+------------------------------------------------------------------+----------------------------+------------+
| ID                                   | Name          | Status  |
+------------------------------------------------------------------+----------------------------+------------+
| 6a1ba286-5ef2-409f-af11-5135e21adb4d | cirros          | active  |
+------------------------------------------------------------------+----------------------------+-------------+

10 Nova(控制节点)

使用OpenStack Compute托管和管理云计算系统。OpenStack Compute是基础架构即服务(IaaS)系统的主要部分。主要模块是用Python实现的。Nova由以下部分组成:

  • nova-api:接收并响应最终用户的compute调用。该服务支持OpenStack Compute API。它执行一些策略并启动大多数编排活动,例如运行实例
  • nova-api-metadata:接收来自实例的元数据请求
  • nova-compute:通过守护程序API创建和终止虚拟机实例的辅助程序守护程序
  • nova-placement-api:跟踪每个提供商的库存和使用情况
  • nova-scheduler:从队列中获取虚拟机实例请求,并通过计算确定它在哪台服务器主机上运行
  • nova-conductor:中介nova-compute服务与数据库之间的交互。消除了对数据库的直接访问
  • nova-consoleauth:为控制台代理提供的用户授权令牌
  • nova-novncproxy:提供用于通过VNC连接访问正在运行的实例的代理

10.1 MySQL中创建库和权限

在数据库中创建Nova用户,并且授予用户访问库的权限。

[root@localhost  ~]# mysql -uroot -p
MariaDB [(none)]> create database nova_api;
MariaDB [(none)]> create database nova;
MariaDB [(none)]> create database nova_cell0;
MariaDB [(none)]> create database placement;
MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'openstack' identified by 'tera123';

MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' identified by 'tera123'; 
MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'openstack' identified by 'tera123';

MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'openstack' identified by 'tera123';

MariaDB[(none)]>GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'localhost' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'%' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'openstack' identified by 'tera123';

10.2 创建Nova用户、服务

创建Nova用户,并且给Glance授权Admin role,创建服务向Keystone暴露Endpoint。

[root@localhost  ~]# openstack user create --domain default --password-prompt nova
[root@localhost  ~]# openstack role add --project service --user nova admin
[root@localhost  ~]# openstack service create --name nova \
--description "OpenStack compute" compute
[root@localhost  ~]# openstack endpoint create --region RegionOne compute public \
                    http://192.168.4.145:8774/v2.1
[root@localhost  ~]# openstack endpoint create --region RegionOne compute internal \
                    http://192.168.4.145:8774/v2.1
[root@localhost  ~]# openstack endpoint create --region RegionOne compute admin \
                    http://192.168.4.145:8774/v2.1

10.3 创建Placement用户、服务

创建Placement用户,并给Placement授权Admin role,创建服务向Keystone暴露Endpoint。

[root@localhost  ~]# openstack user create --domain default --password-prompt placement
[root@localhost  ~]# openstack role add --project service --user placement admin
[root@localhost  ~]# openstack service create --name placement \
 –description "Placement API" placement
[root@localhost  ~]# openstack endpoint create --region RegionOne placement public \
                    http://192.168.4.145:8778
[root@localhost  ~]# openstack endpoint create --region RegionOne placement internal \
                    http://192.168.4.145:8778
[root@localhost  ~]# openstack endpoint create --region RegionOne placement admin \
                    http://192.168.4.145:8778

10.4 安装Nova组件服务

安装Nova组件并且编辑配置文件。

[root@localhost  ~]# yum install openstack-nova-api openstack-nova-conductor \
openstack-nova-console openstack-nova-novncproxy \
openstack-nova-scheduler openstack-nova-placement-api -y
[root@localhost  ~]# vi /etc/nova/nova.conf
[DEFAULT]
my_ip=192.168.4.145
use_neutron=true
firewall_driver=nova.virt.firewall.NoopFirewallDriver
enabled_apis=osapi_compute,metadata
transport_url=rabbit://openstack:tera123@192.168.4.145
[api]
auth_strategy=keystone
[api_database]
connection=mysql+pymysql://nova:tera123@192.168.4.145/nova_api
[database]
connection= mysql+pymysql://nova:tera123@192.168.4.145/nova
[glance]
api_servers= http://192.168.4.145:9292
[keystone_authtoken]
www_authenticate_uri = http://192.168.4.145:5000
auth_url=http://192.168.4.145:5000/v3
memcached_servers= 192.168.4.145:11211
auth_type=password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = 123456
[placement]
region_name = RegionOne
user_domain_name = Default
auth_type=password
auth_url=http://192.168.4.145:5000/v3
project_name=service
project_domain_name=Default
username=placement
password=123456
[placement_database]
connection= mysql+pymysql://placement:tera123@192.168.4.145/placement
[scheduler]
discover_hosts_in_cells_interval= 300
[vnc]
enabled=true
server_listen=$my_ip
server_proxyclient_address=$my_ip

10.5 配置Placement API

通过将以下配置添加到来启用对Placement API的访问。 

[root@localhost  ~]# vi /etc/httpd/conf.d/00-nova-placement-api.conf
Listen 8778
<VirtualHost *:8778>
  <Directory /usr/bin>
   <IfVersion >= 2.4>
      Require all granted
   </IfVersion>
   <IfVersion < 2.4>
      Order allow,deny
      Allow from all
   </IfVersion>
 </Directory>
  WSGIProcessGroup nova-placement-api
  WSGIApplicationGroup %{GLOBAL}
  WSGIPassAuthorization On
  WSGIDaemonProcess nova-placement-api processes=3 threads=1 user=nova group=nova
  WSGIScriptAlias / /usr/bin/nova-placement-api
  <IfVersion >= 2.4>
    ErrorLogFormat "%M"
  </IfVersion>
  ErrorLog /var/log/nova/nova-placement-api.log
  #SSLEngine On
  #SSLCertificateFile ...
  #SSLCertificateKeyFile ...
</VirtualHost>
Alias /nova-placement-api /usr/bin/nova-placement-api
<Location /nova-placement-api>
  SetHandler wsgi-script
  Options +ExecCGI
  WSGIProcessGroup nova-placement-api
  WSGIApplicationGroup %{GLOBAL}
  WSGIPassAuthorization On
</Location>

10.6 同步数据库

导入nova-api、nova、cell0、placement库SQL。

[root@localhost  ~]# su -s /bin/sh -c "nova-manage api_db sync" nova
[root@localhost  ~]# su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
[root@localhost  ~]# su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova  
[root@localhost  ~]# su -s /bin/sh -c "nova-manage db sync" nova 

10.7 验证Nova服务 

验证nova cell0和cell1是否正确注册,并启动Nova服务。

[root@openstack ~]# su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova
+-------+--------------------------------------+---------------------------------------+----------------------------------------------------+----------+
|  Name |                 UUID                 |             Transport URL             |                Database Connection                 | Disabled |
+-------+--------------------------------------+---------------------------------------+----------------------------------------------------+----------+
| cell0 | 00000000-0000-0000-0000-000000000000 |                 none:/                | mysql+pymysql://nova:****@192.168.4.145/nova_cell0 |  False   |
| cell1 | 510ecc1a-4112-4832-b5a5-4f6d4581c545 | rabbit://openstack:****@192.168.4.145 |    mysql+pymysql://nova:****@192.168.4.145/nova    |  False   |
+-------+--------------------------------------+---------------------------------------+----------------------------------------------------+----------+
[root@localhost  ~]# systemctl enable openstack-nova-api.service   \
openstack-nova-consoleauth openstack-nova-scheduler.service \
                    openstack-nova-conductor.service openstack-nova-novncproxy.service
[root@localhost  ~]# systemctl start openstack-nova-api.service \
  openstack-nova-consoleauth   openstack-nova-scheduler.service\
  openstack-nova-conductor.service openstack-nova-novncproxy.service

11 Nova(计算节点)

11.1 安装Nova组件服务

安装Nova组件并且编辑配置文件。

[root@localhost  ~]# yum install openstack-nova-compute -y
[root@localhost  ~]# vi /etc/nova/nova.conf
[DEFAULT]
my_ip=192.168.4.144
use_neutron=true
firewall_driver=nova.virt.firewall.NoopFirewallDriver
enabled_apis=osapi_compute,metadata
transport_url=rabbit://openstack:tera123@192.168.4.145
[api]
auth_strategy=keystone
[glance]
api_servers=http://192.168.4.145:9292
[keystone_authtoken]
www_authenticate_uri = http://192.168.4.145:5000
auth_url=http://192.168.4.145:5000/v3
memcached_servers=192.168.4.145:11211
auth_type=password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = 123456
[placement]
region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://192.168.4.145:5000/v3
username = placement
password = 123456
[vnc]
enabled=true
server_listen=0.0.0.0
server_proxyclient_address=$my_ip
novncproxy_base_url=http://192.168.4.145:6080/vnc_auto.html

11.2 检测是否支持虚拟化

如果不支持虚拟化,则要配置新的参数。

[root@localhost  ~]# egrep -c ‘(vmx|svm)’ /proc/cpuinfo
[root@localshot  ~]# vi /etc/nova/nova.conf
[libvirt]
virt_type = qemu

11.3 启动Nova服务

System管理Nova。

[root@localhost  ~]# systemctl enable libvirtd openstack-nova-compute
[root@localshot  ~]# systemctl start libvirtd openstack-nova-compute

11.4 发现计算节点(控制节点)

在控制节点确认计算节点。

[root@localhost  ~]# openstack compute service list --service nova-compute
[root@localshot  ~]# su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
Found 2 cell mappings.
Skipping cell0 since it does not contain hosts.
Getting computes from cell 'cell1': 54e6c270-7390-4390-8702-02b72874c5a7
Checking host mapping for compute host 'compute': 39d80423-6001-4036-a546-5287c1e93ec5
Creating host mapping for compute host 'compute': 39d80423-6001-4036-a546-5287c1e93ec5
Found 1 unmapped computes in cell: 54e6c270-7390-4390-8702-02b72874c5a7

12 Neutron(控制节点)

OpenStack Networking(neutron)允许创建由其他OpenStack服务管理的接口设备并将其连接到网络。可以实施插件来容纳不同的网络设备和软件,从而为OpenStack体系结构和部署提供灵活性。它包括以下组件:

  • neutron-server:接收API服务器请求并将其路由到适合的OpenStack网络设备以采取措施
  • OpenStack Networking plug-ins and agents:OpenStack通用代理是L3,DHCP和插件代理

12.1 MySQL中创建库和权限

在数据库中创建Neutron用户,并且授予用户访问库的权限。

[root@localhost  ~]# mysql -uroot -p
MariaDB [(none)]> create database neutron;
MariaDB[(none)]>GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'openstack' identified by 'tera123'; 

12.2 创建Neutron用户、服务

创建Neutron用户,并且给Neutron授权Admin role,创建服务向Keystone暴露Endpoint。

[root@localhost  ~]# openstack user create --domain default --password-prompt neutron
[root@localhost  ~]# openstack role add --project service --user neutron admin
[root@localhost  ~]# openstack service create --name neutron \
 –description "OpenStack Networking" network
[root@localhost  ~]# openstack endpoint create --region RegionOne network public \
                    http://192.168.4.145:9696
[root@localhost  ~]# openstack endpoint create --region RegionOne network internal \
                    http://192.168.4.145:9696
[root@localhost  ~]# openstack endpoint create --region RegionOne network admin \
                    http://192.168.4.145:9696

12.3 安装Neutron组件服务

安装软件包,编辑Neutron配置文件。

[root@localhost  ~]# yum install openstack-neutron openstack-neutron-ml2 \
                    openstack-neutron-openvswitch ebtables
[root@localhost  ~]# vi /etc/neutron/neutron.conf
[DEFAULT]
auth_strategy = keystone
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = true
notify_nova_on_port_status_changes = true
notify_nova_on_port_data_changes = true
transport_url = rabbit://openstack:tera123@192.168.4.145
[database]
connection = mysql+pymysql://neutron:tera123@192.168.4.145/neutron
[keystone_authtoken]
www_authenticate_uri = http://192.168.4.145:5000
auth_url = http://192.168.4.145:5000
memcached_servers = 192.168.4.145:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = 123456
[nova]
auth_url = http://192.168.4.145:5000
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = nova
password = 123456

[root@localhost  ~]# vi /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
type_drivers = flat,vlan,vxlan
tenant_network_types = vxlan
mechanism_drivers = openvswitch,l2population
extension_drivers = port_security
[ml2_type_flat]
flat_networks = provider
[ml2_type_vxlan]
vni_ranges = 1:1000
[securitygroup]
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
enable_ipset = true
enable_security_group = true

[root@localhost  ~]# vi /etc/neutron/plugins/ml2/openvswitch_agent.ini
[agent]
tunnel_types = vxlan
l2_population = true
arp_responder = true
[ovs]
bridge_mappings = provider:br-provider
datapath_type = system
local_ip = 192.168.4.145
[securitygroup]
enable_security_group = True
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver

[root@localhost  ~]# vi /etc/neutron/l3_agent.ini
[DEFAULT]
interface_driver = openvswitch
external_network_bridge  =

[root@localshot  ~]# vi /etc/neutron/dhcp_agent.ini
[DEFAULT]
interface_driver = openvswitch
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = true

[root@localshot  ~]# vi /etc/neutron/metadata_agent.ini
[DEFAULT]
nova_metadata_host = 192.168.4.145
metadata_proxy_shared_secret = tera123

[root@localhost  ~]# vi /etc/nova/nova.conf
[neutron]
url=http://192.168.4.145:9696
auth_type=password
auth_url=http://192.168.4.145:5000
project_name=service
project_domain_name=default
username=neutron
user_domain_name=default
password=123456
region_name=RegionOne
service_metadata_proxy = true
metadata_proxy_shared_secret = tera123

12.4 网桥绑定物理网卡

添加br-provider网桥并且绑定物理网卡eno2。

[root@localhost  ~]# ovs-vsctl add-br br-provider
[root@localhost  ~]# ovs-vsctl add-port br-provider eno2

12.5 修改系统内核参数

修改内核参数确保Linux操作系统内核支持网桥过滤器。

[root@localhost  ~]# vi /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
[root@localhost  ~]# modprobe br_netfilter
[root@localhost  ~]# sysctl -p

12.6 创建符号链接

网络符文初始化脚本需要plugin.ini指向ML2插件配置文件的符号链接。

[root@localhost  ~]# ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini

12.7 同步数据库

导入Neutron库SQL。

[root@localhost  ~]# su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf \  --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron

12.8 启动Neutron服务、

System管理Neutron服务。

[root@localhost  ~]# systemctl restart openstack-nova-api
[root@localshot  ~]# systemctl start neutron-server neutron-openvswitch-agent \
neutron-dhcp-agent neutron-metadata-agent neutron-l3-agent
[root@localshot  ~]# systemctl enable neutron-server neutron-openvswitch-agent \
neutron-dhcp-agent neutron-metadata-agent neutron-l3-agent

13 Neutron(计算节点)

13.1 安装Neutron组件服务

安装Neutron服务,并编辑配置文件。

[root@localhost  ~]# yum -y install openstack-neutron-openvswitch ebtables ipset -y
[root@localhost  ~]# vi /etc/neutron/neutron.conf
[DEFAULT]
state_path = /var/lib/neutron
auth_strategy = keystone
transport_url = rabbit://openstack:tera123@192.168.4.145
[keystone_authtoken]
www_authenticate_uri = http://192.168.4.145:5000
auth_url = http://192.168.4.145:5000
memcached_servers = 192.168.4.145:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = 123456
[oslo_concurrency]
lock_path = $state_path/lock

[root@localhost  ~]# vi /etc/neutron/plugins/ml2/openvswitch_agent.ini
[ovs]
local_ip  =  192.168.4.144
[agent]
tunnel_types  =  vxlan
l2_population  =  True
prevent_arp_spoofing = True
[securitygroup]
enable_security_group = True
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver

[root@localhost  ~]# vi /etc/noca/nova.conf
[neutron]
url=http://192.168.4.145:9696
auth_type=password
auth_url=http://192.168.4.145:5000
project_name=service
project_domain_name=default
username=neutron
user_domain_name = default
password=123456
region_name=RegionOne

13.2 修改系统内核参数

修改内核参数确保Linux操作系统内核支持网桥过滤器。

[root@localhost  ~]# vi /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
[root@localhost  ~]# modprobe br_netfilter
[root@localhost  ~]# sysctl -p

13.3 启动Neutron服务

启动Neutron服务。

[root@localhost  ~]# systemctl restart openstack-nova-compute
[root@localshot  ~]# systemctl start neutron-openvswitch-agent
[root@localshot  ~]# systemctl enable neutron-openvswitch-agent

13.4 验证Neutron服务(控制节点)

验证Neutron agent启动状态。

[root@localhost  ~]# openstack network agent list
+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+
| ID                                   | Agent Type         | Host       | Availability Zone | Alive | State | Binary                    |
+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+
| 2df818b0-e911-4e5a-8c53-1ae85e387caa | Open vSwitch agent | controller | None              | :-)   | UP    | neutron-openvswitch-agent |
| 8a1711ee-9772-4931-af61-eed89024ff04 | L3 agent           | controller | nova              | :-)   | UP    | neutron-l3-agent          |
| cff39707-e34b-4cc7-9be0-95bbe281a5b9 | Metadata agent     | scontroller | None              | :-)   | UP    | neutron-metadata-agent    |
| e4949796-9f35-40b4-aba0-781ee7ce9a31 | DHCP agent         | controller | nova              | :-)   | UP    | neutron-dhcp-agent        |
| efd5fa9a-9b0e-447f-8ddc-13755efdd999 | Open vSwitch agent | compute    | None              | :-)   | UP    | neutron-openvswitch-agent |
+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+

14 Horizon(控制节点)

14.1 安装Horizon软件包

安装软件包并编辑配置文件。

[root@localhost  ~]# yum install -y openstack-dashboard
[root@localhost  ~]# vi /etc/openstack-dashboard/local_settings
OPENSTACK_HOST = "192.168.4.145"
ALLOWED_HOSTS = ['*', 'localhost']  
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '192.168.4.145:11211',
    },
}
OPENSTACK_KEYSTONE_URL = "http://%s:5000/v3" % OPENSTACK_HOST
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
OPENSTACK_API_VERSIONS = {
    "identity": 3,
    "image": 2,
    "volume": 2,
}
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = 'Default'
OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"
OPENSTACK_NEUTRON_NETWORK = {
    'enable_router': True,
    'enable_quotas': True,
    'enable_ipv6': True,
    'enable_distributed_router': False,
    'enable_ha_router': False,
'enable_fip_topology_check': True,
}

[root@localhost  ~]# vi /etc/httpd/conf.d/openstack-dashboard.conf
WSGIDaemonProcess dashboard
WSGIProcessGroup dashboard
WSGISocketPrefix run/wsgi
WSGIApplicationGroup %{GLOBAL}
WSGIScriptAlias /dashboard \
usr/share/openstack-dashboard/openstack_dashboard/wsgi/django.wsgi
Alias /dashboard/static /usr/share/openstack-dashboard/static
<Directory /usr/share/openstack-dashboard/openstack_dashboard/wsgi>
  Options All
  AllowOverride All
  Require all granted
</Directory>
<Directory /usr/share/openstack-dashboard/static>
  Options All
  AllowOverride All
  Require all granted
</Directory>

14.2 启动Horizon

启动Horizon服务。

[root@localhost  ~]# systemctl restart httpd  memcached

14.3 验证Horizon

登录Web端URL:http://192.168.4.145/dashboard,验证Horizon组件。

登录Web端验证Horizon组件

15 参考文献

OpenStack官网:www.openstack.org

更多相关内容,请访问:A-Lab

OpenStack源码安装报错整理

1 MySQL

1.1 MySQL连接数

大多数OpenStack服务都使用MySQL数据库来存储信息,各组件直接的调用都需要修改MySQL的存储信息或者验证存储信息。MySQL连接数不够会杀死正在执行的SQL,导致各组件之间的调用失败。

解决这个问题需要调整MySQL配置文件中最max_connections参数和MySQL system参数。

[root@localhost  ~]# vi /etc/my.cnf
[mysqld]
max_connections=1024
[root@localhost  ~]# vi /usr/lib/systemd/system/mariadb.service
[serivce]
LimitNOFILE=65535
LimitNPROC=65535

1.2 MySQL Client连接失败

 ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/home/mysql/mysql.sock’

MySQL Client在登录的时候会默认去找/var/lib这个目录找mysqld.sock文件,如果Mysql启动失败或者修改了MySQL存储路径自然就找不到了。添加如下配置:

[root@localhost  ~]# vi /etc/my.cnf.d/client.cnf
[client-mariadb]
socket=/home/mysql/mysql.sock
[root@localhost  ~]# systemctl start mariadb

2 RabbitMQ

2.1 RabbitMQ用户名不匹配

OpenStack使用RabbitMQ来协调服务之间的操作和状态信息。消息队列服务通常在控制器节点运行。RabbitMQ需要关注的是用户名和密码问题。如果用户名和密码错误,各组件直接的调用都会失败,所有虚拟机无法访问。这时候需要修改RabbitMQ用来提供服务的用户名和密码:

[root@localhost  ~]# rabbitmqctl list_users
[root@localhost  ~]# rabbitmqctl change_password username ‘newpasswd’

2.2 RabbitMQ端口不通

ERROR oslo.messaging._drivers.impl_rabbit [-] [94fc1201-373b-451f-a9e2-46fc81b5de20] AMQP server on controller:5672 is unreachable: [Errno 111] ECONNREFUSED. Trying again in 24 seconds.: error: [Errno 111] ECONNREFUSED

RabbitMQ 5672端口不可用。可能出于两种情况:一是RabbitMQ启动失败,状态错误。查看RbbitMQ状态。二是5672端口被墙,关闭firewalld防火墙并且查看iptables规则。

[root@localhost  ~]# systemctl  status  rabbitmq-server
[root@localhost  ~]# systemctl  stop firewadll
[root@localhost  ~]# iptables -S
[root@localhost  ~]# iptables -F

3 Memcached

Memcached的作用是缓存身份服务身份验证机制的令牌。在正常运行中Memached一般不会出现问题。需要注意的一点是要确保端口不被墙。

4 Etcd

4.1 Etcd集群状态

cluster may be unhealthy: failed to list members

Error: client: etcd cluster is unavailable or misconfigured; error #0: dial tcp 127.0.0.1:2379: getsockopt: connection refused ;

error #1: dial tcp 127.0.0.1:4001: getsockopt: connection refused

error #0: dial tcp 127.0.0.1:2379: getsockopt: connection refused

error #1: dial tcp 127.0.0.1:4001: getsockopt: connection refused

OpenStack官网配置错,因为在Etcd的配置文件中的ETCD_LISTEN_CLIENT_URLS参数中,只写入了http://ip:2379,没有写入http://127.0.0.1:2379,添加后集群正常。

[root@localhost  ~]# vi /etc/etcd/etcd.conf
ETCD_DATA_DIR="/home/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.4.145:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.4.145:2379,http://127.0.0.1:2379"
ETCD_NAME="controller"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.4.145:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.4.145:2379"
ETCD_INITIAL_CLUSTER="controller=http://192.168.4.145:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

5 Libvirtd

5.1 Libvirtd用户与用户组

KVM cannot access storage file (as uid:107,gid:107)permission denied

这一系列没有权限而导致的创建虚机失败需要调整libvirt的默认权限。

[root@localhost  ~]# vi /etc/libvirt/qemu.conf
user=root
group=root

5.2 Libvirtd用户与用户组

Libvirtd Could not reopen file:Permission denied

dynamic_ownership = 1这个参数意思是Libvirtd是否有权限动态修改文件所有权,默认为1。在一般情况下user和group设置为root是拥有所有文件的所有权。但是,因为这个参数的存在导致创建虚拟机报错。当注释后,创建虚拟机正常,可能是因为版本问题而导致的bug。

[root@localhost  ~]# vi /etc/libvirt/qemu.conf
user=root
group=root
#dynamic_ownership = 1

6 Keystone

6.1 同步数据库问题

OperationalError) no such table: project u’INSERT INTO project (id, name, domain_id, des

cription, enabled, extra) VALUES (?, ?, ?, ?, ?, ?)’ (’70c0487ba99743719d6721a34560fca2′, u’admin’, ‘default’, u’Admin Tenant’, 1, ‘{}’)

这个问题是因为Kyestone中表不存在,也就是说同步Keystone数据库失败导致,需要再次同步数据库。如果再次失败需要检查配置文件数据库连接配置是否有错误。

[root@localhost  ~]# mysql -uroo -p
MariaDB [ (none) ] use keystone;
MariaDB [ (none) ] show tables;
Empty set (0.00 sec)
[root@localhost  ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone

6.2 OpenStackcliet错误码

下面是在创建用户或者service等服务时可能出现的错误码和解决方式。

401 #验证失败,keystone相关用户账户密码设置错误,时间不同步,或者输入的项目名称不对。

403 #可能未初始化OS_token变量,需要使用source命令使其生效,也可能是配置的配置文件未生效,需要重启相关服务。

409 #keystone创建用户,用户已存在。

500 #服务器内部错误,服务配置有问题,看日志,检查配置。

503 #keystone相关账户密码设置有问题,请将相关的账户删除,重新创建即可。

7 Nova

7.1 MySQL连接丢失

ERROR oslo_db.sqlalchemy.engines [-] Database connection was found disconnected; reconnecting: DBConnectionError: (pymysql.err.OperationalError) (2013, ‘Lost connection to MySQL server during query’) [SQL: u’SELECT 1′] (Background on this error at: http://sqlalche.me/e/e3q8)

字面意思是在查询的过程中丢失MySQL连接,即某个MySQL长连接很久没有新的请求发起,达到了server端的timeout,被server强行关闭。解决这个问题需要在MySQL配置文件中修改wait_timeout参数。

[root@localhost  ~]# vi /etc/my.cnf
[mysqld]
wait_timeout=28800

7.2 新增节点报错

ERROR nova.scheduler.client.report [req-fb678c94-091f-4dd3-bd44-49068015a07e – – – – -] [req-a7dd9b65-4ef2-4822-8110-f4a311839683] Failed to create resource provider record in placement API for UUID 73542ad1-f32b-4ba8-a62c-98ec704234c3. Got 409: {“errors”: [{“status”: 409, “request_id”: “req-a7dd9b65-4ef2-4822-8110-f4a311839683”, “detail”: “There was a conflict when trying to complete your request.\n\n Conflicting resource provider name: compute already exists.  “, “title”: “Conflict”}]}.

一台计算机点故障导致不能继续工作,将其移出集群,节点恢复后再重新加入发现报错。这主要原因是因为数据库中数据冲突导致。更新nova库、nova_api库中对应resource_providers表中的UUID即可。

[root@localhost  ~]# mysql -uroot -p
MariaDB [nova_api]> update resource_providers set uuid='4d9ed4b4-f3a2-4e5d-9d8e-2f657a844a04' where name='compute' and uuid='e131e7c4-f7db-4889-8c34-e750e7b129da';

7.3 Nova-vnc报错

INFO nova.console.websocketproxy [req-a9ef9047-7b5b-4251-b2c3-3de8fa2db7d1 – – – – -] handler exception: [Errno 113] EHOSTUNREACH

在OpenStack上创建虚机成功,登录控制台时显示vnc报错1006,查看Nova日志,确定是因为计算节点防火墙没有关闭或者iptables没有过滤vnc端口。

[root@localhost  ~]# systemct stop firewalld
[root@localhost  ~]# iptables -I INPUT -p tcp --ports 5900:6100  -j ACCEPT

8 Glance

8.1 权限问题

Glance报错基本都是因为权限问题而导致的。如果修改了Glance存储路径,需要给修改后的路径glance:glance权限。

9       Neutron

9.1       虚拟机不通外网

虚拟机不通外网主要原因有很多,首先网络类型是否误设置为Local:Local型网络只适合虚拟机与虚拟机之间互通,网络所在的网桥不会连接服务器的物理网卡,所以Local型网络的虚拟机是与外网不通的。

  • 虚拟机是否启动,如果它没有运行,可以通过查看Nova日志查看问题。
[root@localhost  ~]# openstack servier list
[root@localhost  ~]# tail -f /var/log/nova/nova-compute
  • 安全组问题,在默认安全组下可能不允许一些协议通过,所以需要配置安全组。
[root@localhost  ~]# openstack security group show default
  • 查看Neutron各agent状态是否正确,如果down,查看日志解决。
[root@localhost  ~]# openstack network agent list

更多相关内容,请访问:A-Lab

对星融元产品感兴趣?

立即联系!

返回顶部

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