前言回顾一下之前的文章《Bees平台的微服务架构(1)docker和docker-compose》。通过Dockerfile一共构建了三个docker镜像:mysql数据库、部署angular前端页面的nginx、springboot接口。然后使用docker-compose来安排容器服务,保证不同容器之间的互访。为了提高开发效率,我们还写了一个自动部署脚本,实际上只是通过docker-compose.yml启动和关闭容器,在本地镜像库中生成或删除镜像。不可否认,docker-compose服务编排的小灵活性让人爱不释手,那我们今天为什么要迁移到k8s(kubernetes)呢?因为k8s有更强的编排能力,因为k8s可以做跨主机的分布式集群,因为k8s搭载rancher会更有利于微服务架构的统一管理,等等。k8s的准备本文不会讲解k8s和rancher的安装配置。网上有很多相关的安装文档和配置文档。近日,阿里云产品春节开卖。我忍不住又买了一台服务器。打折后还是很贵的。心疼,不过我两台服务器都是这样的,所以顺便搭建了一个k8s集群环境。镜像仓库的分布式集群带来的复杂度增加了。不能直接使用本地镜像仓库的地址。我不想构建镜像存储库。好在阿里的docker镜像仓库是免费的,所以我会把最终版的docker镜像推送到阿里的容器仓库。当需要启动容器时,容器的地址应该是后面会出现的阿里容器仓库中的地址。主机挂载卷分布的另一个问题是主机的挂载卷。如果你对上一篇文章印象深刻,应该记得mysql数据库的数据文件和nginx代理的图片文件都是挂载在宿主机上的。在主机上。由于docker容器的特性,如果不使用挂载的volume,容器重启后容器中的数据会丢失。在分布式环境中,无法在不同主机之间访问目录。我在一台机器上架设了一个nfs服务器,将单机上的目录打开为共享目录。下面介绍具体内容。服务之间的交互??不同的服务不可避免地需要相互访问,例如:springboot需要访问数据库和redis,angualr需要调用springboot接口。并且考虑到k8s经常需要为某个服务创建多节点集群,所以注册中心对外开放的地址应该是集群的地址。我们如何在docker-compose上做到这一点?在docker-compose.yml上定义多个服务,每个服务对应一个镜像。容器启动后,可以使用容器对应的服务名作为hostname。k8s上也有类似的用法,使用yaml文件,种类繁多。例如Pod表示启动的服务是一个pod;ReplicationController会根据Pod模板生成一批pod作为一个cluster;Service相当于服务的注册,可以为对应的pod副本集群提供访问地址,等等。那么Service就可以解决这个问题。我们为不同的服务创建一个Service,这样我们就可以像docker-compose一样通过服务的名字来访问该服务对应的pod副本集群。其他业务需要,在前面三个镜像的基础上增加一个redis镜像。然后分布式的redis和分布式的mysql环境搭建起来太麻烦了。如果以后有机会单独写一篇介绍它们的话,这次就简单的上单机的mysql和redis了。nfs共享目录NFS是NetworkFileSystem的缩写,即网络文件系统,NFS是FreeBSD支持的文件系统之一。NFS是基于RPC(RemoteProcedureCall)实现的,它允许一个系统与网络上的其他人共享目录和文件。通过使用NFS,用户和程序可以像访问本地文件一样访问远程系统上的文件。NFS是一个非常稳定、可移植的网络文件系统。选择nfs的另一个原因是nfs服务在k8s上可以直接作为存储卷使用,非常方便。nfs的安装是基于rpc的。安装nfs需要确保安装了rpcbind,但是一般CentOS默认已经安装了rpcbind##查找是否安装了nfs和rpcbind[mpaas@kerry1k8s]$rpm-qa|grepnfs[mpaas@kerry1k8s]$rpm-qa|greprpcbind##如果没有安装,用yum安装[mpaas@kerry1k8s]$yum-yinstallnfs-utils[mpaas@kerry1k8s]$yum-yinstallrpcbind安装完成后,rpcbind服务必须首先启动,然后必须启动nfs服务。[mpaas@kerry1k8s]$systemctlstartrpcbind[mpaas@kerry1k8s]$systemctlstartnfs-serversetbootstart[mpaas@kerry1k8s]$systemctlenablerpcbind[mpaas@kerry1k8s]$systemctlenablenfs-server配置通过修改/etc/exports文件,设置nfs共享目录/home/nfs/bees/mysql/data*(rw,no_root_squash,no_all_squash,sync)如上,设置/home/nfs/bees/mysql/data作为共享目录。星号*表示共享目录可以在任何服务器上访问,也可以指定具体的ip和端口访问参数。常用的参数有:rw ro目录共享的权限是读写还是只读,但最终能读还是能写取决于文件系统的rwx和identity。sync asyncsync是指数据会同步写入内存和硬盘,async是指数据先暂存在内存中,而不是直接写入硬盘!no_root_squash root_squash如果使用NFS文件系统的客户端帐号是root,那么系统应该如何判断这个帐号的身份呢?默认情况下,通过root_squash的设置,客户端的root身份会被压缩成nfsnobody,这样服务器系统会更加安全。但是如果你想开启客户端使用root身份来操作服务器的文件系统,那么你就得在这里开启no_root_squash!all_squash无论登录NFS的用户身份如何,他的身份都会被压缩成一个匿名用户,通常是nobody(nfsnobody)!anonuid anongidanon的意思是匿名的(anonymous)上面提到的关于*_squash的匿名用户的UID设置值通常是nobody(nfsnobody),但是你可以自己设置UID值!当然,这个UID必须存在于你的/etc/passwd中!anonuid是指UID,anongid是指组的GID。编辑/etc/exports文件后,执行如下命令生效[mpaas@kerry1k8s]$exportfs-r在服务器端,可以执行以下命令查看目录是否共享成功[mpaas@kerry1k8s]$showmount-elocalhostExportlistforlocalhost:/home/nfs/bees/mysql/data*也可以在另一台机器上安装好nfs后再执行上面的命令,只需将localhost替换成目标服务器的ip地址即可。nginx服务首先启动nginx来部署angualr。我们需要创建一个RC,根据模板创建pod,暂时只创建一个pod。如果后期需要扩展,会在rancher上进行管理。创建bees_angular_rc.yaml并打开pod端口80apiVersion:v1kind:ReplicationControllermetadata:name:bees-angularspec:replicas:1selector:app:bees-angulartemplate:metadata:labels:app:bees-angularspec:containers:-name:bees-angularimage:registry.cn-hangzhou.aliyuncs.com/kerry2019/bees-nginx:v1.0ports:-containerPort:80创建bees_angualr_svc.yaml,设置nodePort,将pod的80端口映射到host的30000端口apiVersion:v1kind:Servicemetadata:name:bees-angularspec:type:NodePortports:-port:80nodePort:30000selector:app:bees-angular然后执行以下命令创建rc和service,相应的pod也会运行起来##启动rc[mpaas@kerry1k8s]$kubectlcreate-fbees-angular-rc.yaml##启动服务[mpaas@kerry1k8s]$kubectlcreate-fbees-angular-svc.yaml##检查pod是否是启动成功[mpaas@kerry1k8s]$kubectlgetpodsmysqlservice创建bees_mysql_rc.yaml,打开pod的3306端口,将nfs服务器上的共享目录/home/nfs/bees/mysql/data挂载到容器apiVersion:v1kind:ReplicationControllermetadata:名称:bees-mysqlspec:副本:1选择器:app:bees-mysqltemplate:metadata:labels:app:bees-mysqlspec:containers:-name:bees-mysql镜像:registry.cn-hangzhou.aliyuncs.com/kerry2019/bees-mysql:v1.0ports:-containerPort:3306环境:-名称:MYSQL_ROOT_PASSWORD值:数据库密码volumeMounts:-名称:mysql-data-persistent-storagemountPath:/var/lib/mysqlvolumes:-名称:mysql-data-persistent-storagenfs:path:/home/nfs/bees/mysql/dataserver:nfs服务器的ip创建bees_mysql_svc.yamlapiVersion:v1kind:Servicemetadata:name:bees-mysqlspec:type:NodePortports:-port:3306nodePort:30003selector:app:bees-mysqlspringboot服务bees_springboot_rc.yamlkind:ReplicationControllermetadata:name:bees-springbootspec:replicas:1selector:app:bees-springboottemplate:metadata:labels:app:bees-springbootspec:containers:-name:bees-springbootimage:registry.cn-hangzhou.aliyuncs.com/kerry2019/bees-springboot:v1.0ports:-containerPort:8010bees_springboot_svc.yamlapiVersion:v1kind:Servicemetadata:name:bees-springbootspec:type:NodePortports:-port:8010nodePort:30004selector:app:bees-springboot是使用的一些基本代码,我这里就不写太多了自动打包推送镜像到仓库的脚本#!/bin/bashecho"nginxversion:"$1echo"springbootversion:"$2v_springboot_jar=`find/bees/devops/upload/-name"*.jar"`echo“找到jar:”$v_springboot_jarv_angular_zip=`find/bees/devops/upload/-name“dist.zip”`echo“找到dist:”$v_angular_zipdockerrmi-f$(dockerimages|grep“paperbee-nginx”|awk'{print$3}')dockerrmi-f$(dockerimages|grep"paperbee-springboot"|awk'{print$3}')echo"删除原镜像"cd/bees/devops/dockerfiles/springboot-k8s/rm-f*.jarcp$v_springboot_jar./bees-0.0.1-SNAPSHOT.jardockerbuild-tpaperbee-springboot.echo"生成springboot镜像"cd/bees/devops/dockerfiles/angular-k8s/rm-rfdist/cp$v_angular_zip./dist.zipunzipdist.ziprm-fdist.zipdockerbuild-tpaperbee-nginx.echo"生成角度镜像"dockerlogin--username=account--password=passwordregistry.cn-hangzhou.aliyuncs.comecho"登录docker容器仓库"v_nginx_image=$(dockerimages|grep"paperbee-nginx"|awk'{print$3}')v_springboot_image=$(dockerimages|grep"paperbee-springboot"|awk'{print$3}')docker标签$v_nginx_imageregistry.cn-hangzhou.aliyuncs.com/kerry2019/bees-nginx:$1dockerpushregistry.cn-hangzhou.aliyuncs.com/kerry2019/bees-nginx:$1echo"pushbees-nginx:"$1dockertag$v_springboot_imageregistry.cn-hangzhou.aliyuncs.com/kerry2019/bees-springboot:$2dockerpushregistry.cn-hangzhou.aliyuncs.com/kerry2019/bees-springboot:$2echo"pushbees-springboot:"$2备注1,在线网站地址:智峰平台2,github地址,欢迎star
