在上一篇文章《业务容器化改造实践(一)》中,我们讲到了业务容器化改造的思路和方案,业务容器化改造主要是从三个方面进行:进行业务微服务拆分、业务发布流程自动化和构建容器云管理平台。同时介绍了方案中选用的技术或工具,使用Kubernetes构建容器平台,用Harbor构建镜像仓库,用Gitlab作为代码仓库,用Jenkins作为CI/CD工具集。
本篇文章用于介绍利用Rancher、Harbor构建Kubernetes集群和私有镜像仓库,共同组成容器云管理平台,后续将以此平台为基础实施业务的容器化改造。
容器云管理平台的方案及规划
容器云管理平台的方案架构
我们选择Kubernetes作为容器平台,除了官方开源的Kubernetes平台之外,各大公有云厂商也都推出了公有云版本的Kubernetes平台,比如:阿里云的ACK(Aliyun Container Service for Kubernetes)、腾讯云的TKE(Tencent Kubernetes Engine)、华为云的CCE(Cloud Container Engine)、谷歌的GKE(Google Kubernetes Engine)、亚马逊的EKS(Amazon Elastic Container Service for Kubernetes)、微软的AKS(Azure Kubernetes Service)等。还有一批厂商推出了可私有部署的kubernetes平台或管理平台,比如:IBM的ICP(IBM Cloud Private)和Rancher公司的RKE(Rancher Kubernetes Engine)都是可以私有部署的Kubernetes平台。另外Rancher公司的Rancher产品是一款Kubernetes的管理平台,通过该平台我们可以在私有的物理机、虚拟机或者公有云的云主机上快速安装部署Kubernetes平台,也可以直接接管公有云厂商提供的公有云版本的Kubernetes集群。
无论是使用公有云的Kubernetes平台还是自建私有的Kubernetes平台,其技术架构基本上一致,都是以服务器层为基础,在其上构建Kubernetes平台,利用命令行或者web界面调用其中封装好的API接口来操纵和使用Kubernetes集群。二者的区别主要是公有云厂商提供了所有的IaaS层资源,用户在其上购买云主机,一键部署Kubernetes集群,然后使用,不用关心底层的实现和维护问题,同时公有云厂商提供了完善的配套工具和解决方案:如监控、日志、镜像仓库、应用商店等;而自建私有的Kubernetes平台,需要用户自己准备相关的服务器,然后在其上安装Kubernetes集群,再根据需要在其上搭建配套的监控、日志、镜像仓库、应用商店等,同时用户需要根据实际情况去维护自下而上所有的系统和服务。
上图是容器云管理平台的方案架构,我们利用Rancher自建私有的Kubernetes平台,同时利用Harbor搭建私有镜像仓库,最终建好的容器云管理平台主要由四层组成:第一层为基础设施层,包含了服务器、存储、网络等基础资源,其中服务器可以是物理机,基于VMware、OpenStack、CloudStack的虚拟机,甚至是来自公有云的云主机。第二层是容器基础设施层,即docker层,是在服务器主机的操作系统上安装Docker,将底层的环境和资源容器化,形成可以供容器使用的计算资源、存储资源、网络资源等。第三层应用编排和资源调度层,即Kubernetes层,利用Rancher构建Kubernetes平台,将Docker层的资源调度起来,同时可以编排容器,决定容器可以运行几个副本,在哪台主机上运行,遇到压力峰谷时自动扩缩容。最上面一层是应用管理层,即用户可以通过界面对整个平台进行管理,管理台中同时可以提供配套的管理工具,如:CI/CD工具集、镜像仓库、应用商店、监控、日志、多租户管理等。
容器云管理平台的规划
首先明确一下我们需要搭建的内容:一套Kubernetes平台、一套私有镜像仓库、一套CI/CD工具集、一套代码仓库。其中CI/CD工具集和代码仓库可以直接在Kubernetes平台中运行,因此不必单独搭建。为了方便管理企业自身的业务镜像,同时搭建Kubernetes平台的时候就已经用到很多镜像,所以私有的镜像仓库可以独立部署。利用Rancher搭建Kubernetes平台的时候,Rancher管理台自身可以作为一个单独的容器来运行,也可以先用Rancher的RKE搭建一套Kunernetes集群,在集群中运行高可用的Rancher管理台。
在Kubernetes集群中,部署容器应用时,如果涉及到应用数据的持久化,一般可以采用给容器挂载外部目录的方式来实现,即将外部的目录(来自宿主机的目录,或者是NFS等存储)映射到容器中的目录上,容器中的数据就可以存储到外部的目录中,从而实现了数据的持久化。考虑到容器可能会在任意的一个宿主机上运行,只要容器启动就需要访问到对应的目录,因此不能直接使用宿主机操作系统上的目录,而要使用一个所有宿主机都能够访问到的共享的目录或存储。解决方案有多种,可以使用基于宿主机本地硬盘的分布式存储(如Ceph),可以使用外部的存储设备(如NFS等),或者使用云厂商提供的云硬盘。我们这里采用NFS的方式来提供共享的存储。
因此,我们使用一台服务器来运行私有镜像仓库和Rancher管理台,三台服务器运行Kunernetes集群,服务器外接NFS共享存储,在Kubernetes集群中运行Jenkins、Gitlab以及业务应用。最终容器云管理平台的规划如下:
使用Rancher创建Kubernetes集群
服务器及操作系统准备
准备四台服务器,安装好Linux操作系统,Linux内核要求在3.10以上,推荐的操作版本为:RedHat/CentOS 7.4以上、Ubuntu 16.04以上。
事先规划好主机名、IP,以及Rancher管理台和Harbor镜像仓库的域名,并在/etc/hosts中或DNS中做好配置。
假设Rancher管理台的域名为rancher.yuandingit.com,Harbor镜像仓库的域名为harbor.yuandingit.com 。
安装 Docker
所有服务器上均安装Docker,目前Rancher及Kubernetes支持的docker版本有操作系统自带的docker 1.13,或者docker-ce 17.03、18.06、18.09等。
以上为笔者编写本文时查询的结果,未来可能有变化,具体的可自行查询官方文档进行确认。下面为在CentOS操作系统中安装docker-ce的方法,我们使用清华大学的YUM源进行安装。
安装 Rancher Server
本次规划中,Rancher Server和Harbor在一台服务器上,由于二者均需要使用80和443端口,因此可以将Rancher Server的端口调整为8080和8443,为了保证Rancher Server的数据持久化,可以挂在本地的目录给Rancher Server的容器,因此单容器运行Rancher Server管理台的命令如下:
成功运行之后,Rancher Server将以单容器的形式在主机上运行,可以通过https://xx.xx.xx.xx:8443 或者 https://rancher.yuandingit.com:8443 访问Rancher Server的管理台。
登录到Rancher Server中只有,可以创建Kubernetes集群,在添加集群中选择“自定义”,之后可根据节点的角色,复制相关的命令到节点上执行即可。
部署Harbor镜像仓库
安装 Harbor
Harbor镜像仓库由一系列服务组成,主要包含镜像仓库、数据库、门户、代理等,这些服务均以容器的形式运行。Harbor使用的是docker-compose进行编排,因此我们需要安装docker-compose和harbor。
docker-compose是二进制的命令,直接将命令的路径添加到PATH即可使用。harbor软件包解压后需要修改harbor.cfg文件的配置,主要修改镜像仓库的域名地址(hostname)及密码(harbor_admin_password)。
配置文件中的hostname为harbor镜像仓库的地址,该地址也是该镜像仓库中镜像名称的前缀,比如配置为:harbor.yuandingit.com 。
配置完成后可按照如下方式执行安装:
# 执行install.sh脚本进行安装,如果需要同时安装chart包管理和镜像扫描功能,可以加对应的参数
./install.sh --with-chartmuseum --with-clair
安装完成后,会启动若干个容器,占用操作系统的80、443、4443端口,可以通过https://xx.xx.xx.xx 或者 https://harbor.yuandingit.com 访问镜像仓库的管理台。
使用 Harbor
如果harbor采用http协议对外提供服务,其他节点在操作系统级别访问镜像仓库时,需要在本地的docker中配置insecure-registries参数,将镜像仓库添加到不安全的仓库列表中,之后才能正常使用该镜像仓库中的镜像。
# 修改 /etc/docker/daemon.json 文件,加入一行 "insecure-registries": ["harbor.yuandingit.com"],最终文件内容如下:
{
"insecure-registries": ["harbor.yuandingit.com"]
}
# 重启docker进程
systemctl daemon-reload && systemctl restart docker
Harbor镜像仓库采用的是项目管理,即一个Registry中拥有多个项目,每个项目中拥有多个仓库(Repository),每个镜像仓库拥有多个标签(Tag),因此在使用harbor私有镜像仓库之前,需要在仓库中建立项目。登录Harbor之后,点击“新建项目”→填写项目名称,勾选访问级别。
Harbor私有镜像仓库中镜像的命名格式为:镜像仓库地址/项目名称/仓库名称:标签 ,比如镜像 harbor.yuandingit.com/test/test-image:v1.0 的各部分组成为:
镜像仓库地址:harbor.yuandingit.com
项目名称:test
仓库名称:test-image
标签:v1.0
在操作系统上,常用的镜像操作命令如下,供参考:
# 制作名称符合要求的镜像:假设为 harbor.yuandingit.com/test/test-image:v1.0
docker build -t harbor.yuandingit.com/test/test-image:v1.0 .
# 将已有镜像重命名为符合要求的镜像
docker tag source-image:v1 harbor.yuandinit.com/test/test-image:v1.0
# 登录harbor私有镜像仓库,输入用户名和密码
docker login harbor.yuandingit.com
# 上传docker镜像
docker push harbor.yuandinit.com/test/test-image:v1.0
# 下载使用镜像
docker pull harbor.yuandinit.com/test/test-image:v1.0
Rancher 访问 Harbor
在Rancher与Harbor配套使用时,由于Harbor具有用户名密码认证,Rancher不能直接从Harbor镜像仓库下载镜像。
有两种方式解决此问题:一种是把Harbor中建立的项目设置为“公开”,避免进行访问验证,推荐在测试环境使用;另外一种是在Rancher中建立对应的Harbor镜像仓库的凭证secret,但是该配置只能针对某个命名空间或某个项目,每个命名空间都需要设置,推荐在生产环境使用。
配置secret也有两种方式,具体如下:
通过Rancher控制台设置镜像仓库secret的方法为,进入Kubernetes集群的一个项目中,点击“资源”→“镜像库凭证”→“添加镜像库凭证”→填写名称、镜像仓库地址、用户名和密码。
或者通过如下的命令创建:
# kubectl create secret docker-registry \
# harbor-yuandingit-com \ # secret的名称
# --namespace=cicd \ # secret所属的命名空间
# --docker-server=harbor.yuandingit.com \ # harbor私有镜像仓库的地址
# --docker-username=admin \ # harbor私有镜像仓库的用户名
# --docker-password=xxxxxx # harbor私有镜像仓库的密码
# --docker-email=xxx@xxx.com # 邮箱,必须填写
kubectl create secret docker-registry \
harbor-yuandingit-com \
--namespace=cicd \
--docker-server=harbor.yuandingit.com \
--docker-username=admin \
--docker-password=xxxxxx \
--docker-email=xxx@xxx.com
至此,我们在所有节点上安装了docker,安装了Rancher并创建了Kubernetes集群,同时还安装了Harbor私有镜像仓库,最基础的容器云管理平台已经搭建完成。后续我们将以此为基础安装Jenkins和Gitlab,并构建CI/CD流水线,实现业务发布流程的自动化,请继续关注。
更多产品了解
欢迎扫码加入云巴巴企业数字化交流服务群
产品交流、问题咨询、专业测评
都在这里!
2022-11-22 09:34:40
2022-11-24 10:32:03
2020-04-30 17:08:36
甄选10000+数字化产品 为您免费使用
申请试用
评论列表