教程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容器云。
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
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
注意:将上述软件包全部上传到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仅需要以下镜像):
获取上述镜像的一个可行方法,就是通过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集群初始化
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容器云(上)的主要内容,如果未能解决你的问题,请参考以下文章