ONAP北京版本在6月初发布,其中一大亮点是OOM(ONAP Operations Manager)的成熟,它使用流行的rancher/helm/k8s技术来部署和管理ONAP的生命周期,极大地简化和方便了ONAP的部署,同时节省了大量主机资源,从而让OOM成为官方推荐的部署方式。本文记录了参考官方文档搭建ONAP环境的过程及一些知识点。
从我的实践来看,ONAP全部100多个pod用3台虚机跑基本不可能,后来增加到4台虚机还是很吃力,主要是DCAE太耗资源,部署DCAE虚机的瓶颈主要是磁盘IO,当这台虚机超负荷运转时会造成与k8s集群的暂时断连,导致部分容器又会被调度到其它虚机,最终压垮整个集群,所以实际上最后部署成功时是把DCAE去使能了。
对于k8s虚机,可以在完成后面的基本配置步骤之后,再通过拷贝复制vmdk和vmx文件的方式,快速创建多个虚拟机。启动后需要修改主机名、IP地址等,注意MAC地址不要冲突。
1.在rancher虚机上下载并执行openstack-rancher.sh
这个脚本的主要问题是默认rancher-catalog k8s yaml中镜像都是从gcr.io拉取,在没有翻墙的情况下,无法成功拉取镜像。解决方案有两种:1,找梯子翻墙;2,参考 这篇文章,使用国内源。
2.在k8s的虚机上下载并执行openstack-k8s-node.sh
k8s集群要求所有node共享一个分布式文件系统,持久化卷比如cassandra、mariadb、es等可以部署在上面,当pod重置时能够保证数据不丢失,这里用NFS的方式。
在k8s集群中选择一台虚机作为NFS的主节点,其它虚机作为从节点,主节点保存真正的数据文件,其它节点将主节点的路径mount到本地。将下面两个文件下载到k8s节点,先不要执行
所有虚机创建成功后,选一台主节点,执行上面的master_nfs_node.sh,参数是所有从节点的IP;在从节点上执行slave_nfs_node.sh,参数是主节点IP。验证一下,在任意一台虚机的/dockerdata-nfs目录下touch一个文件,查看是否所有虚机上都看得到。修改/etc/fstab文件的目的是保证当从节点的虚机重启时文件系统会自动mount。
切换到刚创建的环境,会提示等待你加入第一个host,即运行k8s的虚机
点击提示栏中的Add a host,或者从INFRASTRUCTURE菜单中选择HOSTS->Add Host,逐个将上面创建的虚拟机加进去
选择rancher界面的KUBERNETES->CLI菜单,点击Generate Config,生成kubect配置文件
按照提示,将内容拷贝粘贴到部署机或者任意远程机(就是希望远程操作k8s的机器上)的~/.kube/config文件中。
验证一下
kubectl可以正确返回k8s的状态了。
执行helm list命令检查是否有错,正常情况应该没有任何返回。如果报Error: incompatible versions c1ient[v2.8.2] server[v2.6.1],则需要执行helm init --upgrade升级服务端tiller的版本。
如果kube-system的pod一直是ContainerCreating状态,检查一下是否是因为“墙”的原因,使用kubectl describe pod ...命令查看event,或者手工拉一下镜像sudo docker pull gcr.io/kubernetes-helm/tiller:v2.8.2,检查是否有超时,像下面的错误:
Error response from daemon: Get https://gcr.io/v1/_ping: net/http: TLS handshake timeout
至此,环境准备就绪,下一步才开始ONAP的部署。
环境准备
按照 官方文档,ONAP的环境需要一台部署虚机(运行rancher和helm)和另外至少三台虚机组成的k8s集群,都是ubuntu 16.04版本。k8s集群中一台虚机作为NFS的主节点。整个验证环境的拓扑如下:
准备虚机
OOM官方文档上是在OpenStack上起虚机,因为我们只有一些all in one测试环境的OpenStack,无法跑大应用,所以就用vmware vsphere来搭建虚拟机环境。部署虚机配置可以稍低一些,4核8G80G,k8s集群的虚拟要求8核32G160G(实际上因为采用NFS,所以也不是对每台虚机都要求相同的磁盘空间)。从我的实践来看,ONAP全部100多个pod用3台虚机跑基本不可能,后来增加到4台虚机还是很吃力,主要是DCAE太耗资源,部署DCAE虚机的瓶颈主要是磁盘IO,当这台虚机超负荷运转时会造成与k8s集群的暂时断连,导致部分容器又会被调度到其它虚机,最终压垮整个集群,所以实际上最后部署成功时是把DCAE去使能了。
![](https://i-blog.csdnimg.cn/blog_migrate/898fee8c335e3a9b835768607edd3bfb.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7f9b5600f7b5adb42f7cfd0ba90f107f.png)
安装rancher和k8s
Rancher容器管理平台原生支持k8s,使用户可以简单轻松地部署k8s集群,下面简单讲一下步骤。1.在rancher虚机上下载并执行openstack-rancher.sh
#!/bin/bash
DOCKER_VERSION=17.03
RANCHER_VERSION=1.6.14
KUBECTL_VERSION=1.8.10
HELM_VERSION=2.8.2
# setup root access - default login: oom/oom - comment out to restrict access too ssh key only
sed -i 's/PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
sed -i 's/PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config
service sshd restart
echo -e "oom\noom" | passwd root
apt-get update
curl https://releases.rancher.com/install-docker/$DOCKER_VERSION.sh | sh
mkdir -p /etc/systemd/system/docker.service.d/
cat > /etc/systemd/system/docker.service.d/docker.conf << EOF
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry=nexus3.onap.org:10001
EOF
systemctl daemon-reload
systemctl restart docker
apt-mark hold docker-ce
IP_ADDY=`ip address |grep ens|grep inet|awk '{print $2}'| awk -F / '{print $1}'`
HOSTNAME=`hostname`
echo "$IP_ADDY $HOSTNAME" >> /etc/hosts
docker login -u docker -p docker nexus3.onap.org:10001
sudo apt-get install make -y
sudo docker run -d --restart=unless-stopped -p 8080:8080 --name rancher_server rancher/server:v$RANCHER_VERSION
sudo curl -LO https://storage.googleapis.com/kubernetes-release/release/v$KUBECTL_VERSION/bin/linux/amd64/kubectl
sudo chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
sudo mkdir ~/.kube
wget http://storage.googleapis.com/kubernetes-helm/helm-v${HELM_VERSION}-linux-amd64.tar.gz
sudo tar -zxvf helm-v${HELM_VERSION}-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/local/bin/helm
# nfs server
sudo apt-get install nfs-kernel-server -y
sudo mkdir -p /nfs_share
sudo chown nobody:nogroup /nfs_share/
exit 0
从脚本代码来看,主要配置了ssh登录,安装了docker、rancher、kubectl和helm,以及nfs server。最主要的是将rancher服务以docker的方式启动起来,其中内置了mysql。不太清楚这里安装NFS有何目的,似乎没用。
这个脚本的主要问题是默认rancher-catalog k8s yaml中镜像都是从gcr.io拉取,在没有翻墙的情况下,无法成功拉取镜像。解决方案有两种:1,找梯子翻墙;2,参考 这篇文章,使用国内源。
2.在k8s的虚机上下载并执行openstack-k8s-node.sh
#!/bin/bash
DOCKER_VERSION=17.03
KUBECTL_VERSION=1.8.10
HELM_VERSION=2.8.2
# setup root access - default login: oom/oom - comment out to restrict access too ssh key only
sed -i 's/PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
sed -i 's/PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config
service sshd restart
echo -e "oom\noom" | passwd root
apt-get update
curl https://releases.rancher.com/install-docker/$DOCKER_VERSION.sh | sh
mkdir -p /etc/systemd/system/docker.service.d/
cat > /etc/systemd/system/docker.service.d/docker.conf << EOF
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry=nexus3.onap.org:10001
EOF
systemctl daemon-reload
systemctl restart docker
apt-mark hold docker-ce
IP_ADDY=`ip address |grep ens|grep inet|awk '{print $2}'| awk -F / '{print $1}'`
HOSTNAME=`hostname`
echo "$IP_ADDY $HOSTNAME" >> /etc/hosts
docker login -u docker -p docker nexus3.onap.org:10001
sudo apt-get install make -y
sudo curl -LO https://storage.googleapis.com/kubernetes-release/release/v$KUBECTL_VERSION/bin/linux/amd64/kubectl
sudo chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
sudo mkdir ~/.kube
wget http://storage.googleapis.com/kubernetes-helm/helm-v${HELM_VERSION}-linux-amd64.tar.gz
sudo tar -zxvf helm-v${HELM_VERSION}-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/local/bin/helm
# install nfs
sudo apt-get install nfs-common -y
exit 0
3.配置k8s cluster的NFS
k8s集群要求所有node共享一个分布式文件系统,持久化卷比如cassandra、mariadb、es等可以部署在上面,当pod重置时能够保证数据不丢失,这里用NFS的方式。
在k8s集群中选择一台虚机作为NFS的主节点,其它虚机作为从节点,主节点保存真正的数据文件,其它节点将主节点的路径mount到本地。将下面两个文件下载到k8s节点,先不要执行
master_nfs_node.sh
#!/bin/bash
usage () {
echo "Usage:"
echo " ./$(basename $0) node1_ip node2_ip ... nodeN_ip"
exit 1
}
if [ "$#" -lt 1 ]; then
echo "Missing NFS slave nodes"
usage
fi
#Install NFS kernel
sudo apt-get update
sudo apt-get install -y nfs-kernel-server
#Create /dockerdata-nfs and set permissions
sudo mkdir -p /dockerdata-nfs
sudo chmod 777 -R /dockerdata-nfs
sudo chown nobody:nogroup /dockerdata-nfs/
#Update the /etc/exports
NFS_EXP=""
for i in $@; do
NFS_EXP+="$i(rw,sync,no_root_squash,no_subtree_check) "
done
echo "/dockerdata-nfs "$NFS_EXP | sudo tee -a /etc/exports
#Restart the NFS service
sudo exportfs -a
sudo systemctl restart nfs-kernel-server
slave_nfs_node.sh
#!/bin/bash
usage () {
echo "Usage:"
echo " ./$(basename $0) nfs_master_ip"
exit 1
}
if [ "$#" -ne 1 ]; then
echo "Missing NFS mater node"
usage
fi
MASTER_IP=$1
#Install NFS common
sudo apt-get update
sudo apt-get install -y nfs-common
#Create NFS directory
sudo mkdir -p /dockerdata-nfs
#Mount the remote NFS directory to the local one
sudo mount $MASTER_IP:/dockerdata-nfs /dockerdata-nfs/
echo "$MASTER_IP:/dockerdata-nfs /dockerdata-nfs nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0" | sudo tee -a /etc/fstab
如果到这里你还都是在一台虚机上配置的话,那现在可以拷贝复制创建多个虚机了。
所有虚机创建成功后,选一台主节点,执行上面的master_nfs_node.sh,参数是所有从节点的IP;在从节点上执行slave_nfs_node.sh,参数是主节点IP。验证一下,在任意一台虚机的/dockerdata-nfs目录下touch一个文件,查看是否所有虚机上都看得到。修改/etc/fstab文件的目的是保证当从节点的虚机重启时文件系统会自动mount。
配置rancher和k8s
打开浏览器登录rancher服务http://192.168.6.145:8080/env/1a5/apps/stacks,选择第一个菜单中的“Manage Environments”,先增加一个kubernetes环境。rancher中文意思是牧场主,而environment可以认为是大牧场中划分的一个个畜栏,不同畜栏完全隔离,比如开发环境、测试环境、生产环境等。![](https://i-blog.csdnimg.cn/blog_migrate/5fbca64627e29054f35371648809fea6.png)
切换到刚创建的环境,会提示等待你加入第一个host,即运行k8s的虚机
![](https://i-blog.csdnimg.cn/blog_migrate/1026d1f53053cb7e37ba81d8cf1a0f08.png)
点击提示栏中的Add a host,或者从INFRASTRUCTURE菜单中选择HOSTS->Add Host,逐个将上面创建的虚拟机加进去
![](https://i-blog.csdnimg.cn/blog_migrate/013a18af7ac6587f7dcfd520dbfa7bb2.png)
复制第5步中的命令行,在相应的虚机中启动rancher agent进行注册
注册完稍等片刻
相应的host就应该出现在rancher的界面中
配置kubectl和helm
这里二者都是客户端程序,通过上面的脚本已经安装在各个host上。helm作为k8s的包管理工具,依赖于kubectl,需要配置kubectl能够连接到新建立的k8s集群上。选择rancher界面的KUBERNETES->CLI菜单,点击Generate Config,生成kubect配置文件
![](https://i-blog.csdnimg.cn/blog_migrate/18ff356e4e9cb2150a52f171d5dcc144.png)
按照提示,将内容拷贝粘贴到部署机或者任意远程机(就是希望远程操作k8s的机器上)的~/.kube/config文件中。
验证一下
![](https://i-blog.csdnimg.cn/blog_migrate/c9ab9af355da59eb167d4105519c4a4f.png)
kubectl可以正确返回k8s的状态了。
执行helm list命令检查是否有错,正常情况应该没有任何返回。如果报Error: incompatible versions c1ient[v2.8.2] server[v2.6.1],则需要执行helm init --upgrade升级服务端tiller的版本。
如果kube-system的pod一直是ContainerCreating状态,检查一下是否是因为“墙”的原因,使用kubectl describe pod ...命令查看event,或者手工拉一下镜像sudo docker pull gcr.io/kubernetes-helm/tiller:v2.8.2,检查是否有超时,像下面的错误:
Error response from daemon: Get https://gcr.io/v1/_ping: net/http: TLS handshake timeout
至此,环境准备就绪,下一步才开始ONAP的部署。