教程get | K8S部署OpenStack容器云(上)

如何借助OpenStack Kolla-K8S项目,

通过K8S对OpenStack进行容器化部署?

并最终部署一套All-In-One类型的OpenStack容器云?

Openstack、Docker和Kubernetes是当前IaaS和PaaS领域最为火热的技术。随着Docker容器技术的兴起,容器编排调度引擎成为当前十分抢眼的技术,这其中尤以Google开源的Kubernetes(K8S)以Production-ready和各种完善的功能而最为人熟知。

在容器及其编排引擎的推动下,Openstack的主流部署模式也在发生变化,目前的Openstack与Docker容器和Kubernetes已经形成了一种你中有我,我中有你的局面,本文主要探讨如何借助Openstack的Kolla-kubernets项目,通过Kubernetes对Openstack进行容器化部署,并最终部署一套All-In-One类型的Openstack容器云。

Kubernetes集群部署主机及系统软件需求

 主机配置需求

1、操作系统:CentOS7.3,最小安装方式安装

2、网卡:2个物理网卡

3、内存:8GB可用内存

4、硬盘:40GB

5、主机:VMware虚拟机

■ 软件依赖

1、docker==1.12.5

2、helm >= 2.4.1

3、kubectl >=1.6.1

4、kubeadm >=1.6.1

5、kubelet >=1.6.1

6、kubernets-cni >=0.5.1

7、kolla-ansible==4.0.0

8、kolla-kubernets==0.6.0

9、kolla==4.0.0

注意:本文所有操作都在非root用户权限下进行,如果以root用户权限进行本文介绍的部署操作,则在helm安装部分会出错。

Kubernetes集群部署

■ 系统环境配置

1、关闭系统防火墙

sudo systemctl stop firewalld

sudo systemctl disable firewalld

2、关闭SELinux

sudo setenforce 0

sudo sed -i ‘s/enforcing/disabled/g’ /etc/selinux/config

3、网络配置

修改/etc/sysctl.conf,如下:

net.ipv4.ip_forward=1

net.ipv4.ip_nonlocal_bind=1

net.unix.max_dgram_qlen=128

net.bridge.bridge-nf-call-iptables=1

net.bridge.bridge-nf-call-ip6tables=1

net.ipv4.conf.all.rp_filter=0

net.ipv4.conf.default.rp_filter=0

■ Docker运行时环境安装准备

1、准备Docker安装源并安装Docker

sudo tee /etc/yum.repos.d/docker.repo << ‘EOF’

[docker_repo]

name=Docker Repository

baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/

enabled=1

gpgcheck=0

EOF

//安装相关的依赖包

sudo yum install python-devel libffi-devel gcc openssl-devel git python-pip epel-release

//安装Docker

sudo yum install docker-engine-1.12.5 docker-engine-selinux-1.12.5

2、配置Docker引擎

Docker在CentOS中安装后默认的StorageDrive为lvm-loop模式的DeviceMapper,这里推荐采用lvm-direct模式的DeviceMapper。假设系统中规划由于存储Docker镜像的存储块为/dev/sdb,则Docker的lvm-direct模式DeviceMapper存储引擎配置如下:

sudo pvcreate /dev/sdb

sudo vgcreate docker /dev/sdb

sudo lvcreate –wipesignatures y -n thinpool docker -l 95%VG

sudo lvcreate –wipesignatures y -n thinpoolmeta docker -l 1%VG

sudo lvconvert -y –zero n -c 512K –thinpool docker/thinpool –poolmetadata docker/thinpoolmeta

sudo echo -e “activation {\nthin_pool_autoextend_threshold=80 \nthin_pool_autoextend_percent=20\n}” >/etc/lvm/profile/docker-thinpool.profile

sudo lvchange –metadataprofile docker-thinpooldocker/thinpool

sudo lvs -o+seg_monitor

配置Docker引擎的MountFlags标志:

sudo mkdir /etc/systemd/system/docker.service.d

sudo echo -e “[Service]\n MountFlags=shared” >/etc/systemd/system/docker.service.d/kolla.conf

配置Docker使用lvm-direct存储引擎、使用国内的DockerHub镜像(这里配置的为阿里云的DockerHub镜像)以及使用本地的Docker镜像Registry,如下:

sudo sed -i ‘s/\/usr\/bin\/dockerd/\/usr\/bin\/dockerd –registry-mirror=https:\/\/v4wev6hv.mirror.aliyuncs.com –insecure-registry 192.168.125.30:4000 

–storage-driver=devicemapper –storage-opt=dm.thinpooldev=\/dev\/mapper\/docker-thinpool –storage-opt=dm.use_deferred_removal=true –storage-opt=dm.use_deferred_deletion=true/’ /usr/lib/systemd/system/docker.service

3、启动Docker引擎

sudo /usr/bin/systemctl daemon-reload

sudo /usr/bin/systemctl start docker

sudo /usr/bin/systemctl enable docker

4、创建Docker本地Registry

sudo docker pull registry

sudo mkdir -p  /data/registry

sudo docker run -d -v /data/registry:/var/lib/registry -p 4000:5000 –restart=always –name local_registry registry:latest

5、通过Kolla项目下载Openstack的Docker镜像源

在正式通过Kubernetes编排部署之前,需要准备好Openstack各个服务项目的容器镜像,本文采用基于Ocata版本的Kolla4.0编译(编译类型为Source)得到的Openstack镜像(http://tarballs.openstack.org/kolla/images/centos-source-registry-ocata.tar.gz),将centos-source-registry-ocata.tar.gz下载并上传到系统后,将其直接解压至Docker本地Registry的目录/data/registry即可:

sudo tar zxvf centos-source-registry-ocata.tar.gz -C /data/registry/

可以通过curl来访问验证本地Registry是否正常:

curl  http:// 192.168.125.30:4000/v2/_catalog

■ 安装Kubernetes集群软件

官方推荐的Kubernetes集群部署软件安装如下:

//准备kubernets安装源,位于google的packages管理仓库中

sudo tee /etc/yum.repos.d/kubernetes.repo<<EOF

[kubernetes]

name=Kubernetes

baseurl=http://yum.kubernetes.io/repos/kubernetes-el7-x86_64

enabled=1

gpgcheck=0

repo_gpgcheck=1

gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg

https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg

EOF

//采用yum直接安装

sudo yum install -y ebtables kubeadm kubectl kubelet kubernetes-cni

不翻墙的情况下,这种方式在国内几乎是不可能安装成功的,要访问google的服务器简直难于上青天!下面介绍一种相对简单可行的Kubernetes安装方式,首先确保你可以访问www.google.com,然后访问如下地址:

https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64/repodata/primary.xml

该地址显示的是XML文本,在其中可以找到需要安装的各个Kubernetes软件包源地址.

利用该地址构造RPM包下载地址(添加),如下:

https://packages.cloud.google.com/yum/pool/23961d0f7dca1ed118b948195f2fb5dd7a07503d69d7d8ab4433219ea98d033e-kubeadm-1.6.1-0.x86_64.rpm

在浏览器中输入上述地址,浏览器将会自动下载kubeadm-1.6.1-0.x86_64.rpm软件包,重复上述过程,下载全部所需的RPM包。

注意:将上述软件包全部上传到CentOS系统中,可以制作一个本地YUM仓库,然后通过YUM进行安装,也可以通过rpm命令行进行安装。记得通过yum形式安装ebtables和socat!

■  Kubernetes镜像获取

在Kubernetes1.6中,Kubernetes集群已经不再以系统进程形式部署在系统中了,而是以Docker容器形式部署。尽管kubeadm init命令会自动到Google容器仓库中Pull所需的镜像,但是这种方式绝对会让你崩溃到想放弃Kubernetes!因此,最好在运行kubeadm init之前准备好全部所需的镜像。

获取上述镜像的一个可行方法,就是通过github和dockerhub相互配合,在github上制作编译镜像的Dockerfile文件,然后自己账户下的dockerhub与github关联起来,并通过dockerhub从github上提取Dockerfile文件并编译Docker镜像,由于Dockerhub服务器本身位于海外,因此编译镜像的速度还是可以接受的,待Dockerhub编译完成后,便可通过docker pull命令将其抓取到本地,之后再通过docker tag命令对抓取到本地的镜像进行重命名即可,具体制作过程可参考:https://mritd.me/2016/10/29/set-up-kubernetes-cluster-by-kubeadm/这篇博客。如果安装的是Kubernetes1.6.1,则可直接到笔者的Dockerhub中下载上述Kubernetes镜像(https://hub.docker.com/r/warrior/)。

可通过如下命令进行镜像提取:

docker pull warrior/k8s-dns-dnsmasq-nanny-amd64:1.14.1

//镜像重命名

docker tag warrior/k8s-dns-dnsmasq-nanny-amd64:1.14.1 gcr.io/ google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.1

注意:笔者在https://hub.docker.com/r/warrior/中的镜像编译Dockerfile文件位于Github项目https://github.com/ynwssjx/K8s-images中,有兴趣的读者可自行查看,其实Dockerfile文件内容非常简单,仅有一个FROM语句,如:FROM gcr.io/google_containers/etcd-amd64:3.0.17

其实在制作Kubernetes镜像时,有个问题就是如何知道kubeadm init命令所需的镜像版本号。在/etc/kubernetes/manifests目录中,有几个yaml文件,其中的image字段定义了所需的版本号。

关于其他镜像的版本号查询,可参考前文提及的博客。

■  Kubernetes集群初始化

在Kubernetes集群中,POD和Service在创建时都会自动分配网络IP地址,这里假设POD网段为10.1.0.0/16,Service网段为10.3.3.0/24。设置Kubernetes集群的DNS 服务器,如下:

sudo sed -i ‘s/10.96.0.10/10.3.3.10/g’ /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

Kubernetes使用服务网段的x.x.x.10IP地址来作为DNS服务器地址,1到9被预留作为Kubernetes后续基础服务的扩展需求。启动kubelet服务,如下:

sudo systemctl daemon-reload

sudo systemctl stop kubelet

sudo systemctl enable kubelet

sudo systemctl start kubelet

此时如果通过systemctl status kubelet来查看kubelet的启动状态,将会发现kubelet启动失败,这个时候先不用在意报错,继续后续操作。使用kubeadm命令行进行Kubernetes集群初始化,如下:

sudo kubeadm init –pod-network-cidr=10.1.0.0/16 –service-cidr=10.3.3.0/24 

–apiserver-advertise-address 192.168.125.30

注意:apiserver-advertise-address为API Server的监听地址

等待一段时间,看到successful即说明Kubernetes集群初始化完成。加载kubeadm认证到系统环境变量中,如下:

mkdir -p $HOME/.kube

sudo -H cp /etc/kubernetes/admin.conf $HOME/.kube/config

sudo -H chown $(id -u):$(id -g) $HOME/.kube/config

此时,再开启一个终端,su到部署Kubernetes集群的用户home目录,输入如下命令,即可观察到Kubernetes集群中PODs变化过程:

watch -d kubectl get pods –all-namespaces -o wide

在当前阶段,Kolla-kubernets项目推介使用的Kubernetes集群网络驱动是Canal。部署Canal网络驱动,如下:

sudo curl -L https://raw.githubusercontent.com/projectcalico/canal/master/k8s-install/1.6/rbac.yaml -o rbac.yaml

sudo kubectl apply -f rbac.yaml

sudo curl -L https://raw.githubusercontent.com/projectcalico/canal/master/k8s-install/1.6/canal.yaml -o canal.yaml\

sudo sed -i “[email protected]/[email protected]/16@” canal.yaml

sudo kubectl apply -f canal.yaml

Canal网络驱动部署成功后,Kubernetes的kube-system命名空间中的全部pods应该是running状态(在此之前,dns并非running状态)。

因为此处采用的是AIO部署模式,而默认情况下Kubernetes的Master节点是不会被kube-scheduler分配PODs到其上的运行的,为了让PODs在Master上也能够运行,对Master进行untaint操作,如下:

kubectl taint nodes –all=true node-role.kubernetes.io/master:NoSchedule-

■  Kubernetes集群验证

待kube-system命名空间中全部pods处于running状态之后,通过kubectl命令启动一个busybox容器,在该容器中进行DNS查询操作,如果操作成功则说明Kubernetes集群部署成功,否则Kubernetes集群是存在问题的,需要检查上述各个步骤。验证过程如下:

kubectl run -i -t $(uuidgen) –image=busybox –restart=Never

//进入容器后,执行nslookup操作

# nslookup kubernetes

Server:    10.3.3.10

Address 1: 10.3.3.10 kube-dns.kube-system.svc.cluster.local

Name:      kubernetes

Address 1: 10.3.3.1 kubernetes.default.svc.cluster.local

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章