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

Posted K8S技术社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了教程get | K8S部署OpenStack容器云(上)相关的知识,希望对你有一定的参考价值。


K8S技术社区正式上线啦!快快关注找到志同道合的小伙伴!

如何借助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容器云。

01


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安装部分会出错。


02


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



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




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



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


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


■  Kubernetes镜像获取


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


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

获取上述镜像的一个可行方法,就是通过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/),如下:

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

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


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

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字段定义了所需的版本号,如下:

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

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


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


■  Kubernetes集群初始化



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



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


等待一段时间,看到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 "s@10.244.0.0/16@10.1.0.0/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


如果能够看到上述信息,说明Kubernetes集群部署是成功的,否则便是有问题的。



山金孝,开源云计算领域技术Geek,K8S技术社区Contributor。



欢迎广大技术人士投稿,

K8S技术社区将对年度作者给予特别奖励!

投稿信箱:admin@k8s.cn







以上是关于教程get | K8S部署OpenStack容器云(上)的主要内容,如果未能解决你的问题,请参考以下文章

mysql的HA及openstack和k8s区别

k8s部署环境

KubeSphere 3.3.0 离线安装教程

实用教程 | 云原生安全平台 NeuVector 部署

全球三大 OpenStack + K8S 专业开源企业浮出水面

容器化部署OpenStack的正确姿势