资讯专栏INFORMATION COLUMN

一个网站的微服务架构实战(2)k8s迁移

avwu / 2708人阅读

摘要:前言我们一起回顾上一篇文章平台的微服务架构和,一共通过构建了三个镜像数据库,部署前端页面的,和接口。最近阿里云产品春节大促销,我一时没忍住又买了一台服务器,打完折扣还是很贵。是一个非常稳定的,可移植的网络文件系统。

前言

我们一起回顾上一篇文章《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容器的特性,如果不使用挂载卷,在重启容器之后容器内的数据都会丢失。分布式环境中,不同主机之间是没办法互访目录的。我是通过在一台机器上搭建了nfs服务器,将单台机器上的目录开放为共享目录,具体内容下文有介绍。

服务互访

不同服务之间免不了要相互访问,例如:springboot要访问数据库和redis,angualr要调用springboot接口。而且考虑到k8s上经常要对某个服务做多节点的集群,所以要在注册中心开放给外界访问的地址应该是集群的地址。

我们在docker-compose上是怎么做的呢?在docker-compose.yml 上定义多个服务service,每个service对应于一个镜像。容器启动后,对应容器的服务名称即可以作为 hostname来使用。

k8s上也有类似的用法,它使用yaml文件,kind类型有很多,例如:Pod表示启动的服务是一个pod;ReplicationController则会根据Pod模板生成一批pod作为集群;Service则相当于服务的注册,可给与之对应的pod副本集群提供访问地址,等等还有很多。那这个问题Service就能解决,我们给不同的服务都创建一个Service,这样就也能同docker-compose一样通过服务的名称就能访问与之对应服务的pod副本集群。

其他

因为业务需要,在之前的三个镜像的基础上又加了一个redis镜像。那么分布式redis、分布式mysql环境搭建就太麻烦了,如果以后有机会再多带带写文章来介绍,这次我干脆就只启动单节点的mysql和redis。

nfs共享目录

NFS是Network File System的简写,即网络文件系统,NFS是FreeBSD支持的文件系统中的一种。NFS基于RPC(Remote Procedure Call)远程过程调用实现,其允许一个系统在网络上与它人共享目录和文件。通过使用NFS,用户和程序就可以像访问本地文件一样访问远端系统上的文件。NFS是一个非常稳定的,可移植的网络文件系统。

选用nfs的另一个原因是,nfs服务在k8s上可以直接作为存储卷使用,十分方便。

安装

nfs是基于rpc的,安装nfs就需要确保已安装rpcbind,不过一般CentOS都默认已安装了rpcbind

##查找是否已安装nfs 和 rpcbind
[mpaas@kerry1 k8s]$ rpm -qa | grep nfs
[mpaas@kerry1 k8s]$ rpm -qa | grep rpcbind
##如果没安装,则通过有yum安装
[mpaas@kerry1 k8s]$ yum -y install nfs-utils
[mpaas@kerry1 k8s]$ yum -y install rpcbind

安装完成后,必须要先启动rpcbind服务,再启动nfs服务

[mpaas@kerry1 k8s]$ systemctl start rpcbind
[mpaas@kerry1 k8s]$ systemctl start nfs-server

设置开机启动

[mpaas@kerry1 k8s]$ systemctl enable rpcbind
[mpaas@kerry1 k8s]$ systemctl enable nfs-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    该目录分享的权限是可擦写 (read-write) 或只读 (read-only),但最终能不能读写,还是与文件系统的 rwx 及身份有关。

sync  async    sync 代表数据会同步写入到内存与硬盘中,async 则代表数据会先暂存于内存当中,而非直接写入硬盘!

no_root_squash  root_squash    客户端使用 NFS 文件系统的账号若为 root 时,系统该如何判断这个账号的身份?预设的情况下,客户端 root 的身份会由 root_squash 的设定压缩成 nfsnobody, 如此对服务器的系统会较有保障。但如果你想要开放客户端使用 root 身份来操作服务器的文件系统,那么这里就得要开 no_root_squash 才行!

all_squash    不论登入 NFS 的使用者身份为何, 他的身份都会被压缩成为匿名用户,通常也就是 nobody(nfsnobody) 啦!

anonuid  anongid    anon 意指 anonymous (匿名者) 前面关于 *_squash 提到的匿名用户的 UID 设定值,通常为 nobody(nfsnobody),但是你可以自行设定这个 UID 的值!当然,这个 UID 必需要存在于你的 /etc/passwd 当中! anonuid 指的是 UID 而 anongid 则是群组的 GID 啰。

编辑完 /etc/exports 文件后,执行下列命令生效

[mpaas@kerry1 k8s]$  exportfs -r

在服务器端,可执行下列命令查看目录是否共享成功

[mpaas@kerry1 k8s]$ showmount -e localhost
Export list for localhost:
/home/nfs/bees/mysql/data *

也可以在另外一台机器上安装nfs后执行上述命令,只需要将localhost换成目标服务器的ip地址即可。

nginx服务

先启动nginx来部署angualr,我们需要创建一个RC,根据模板创建pods,暂时只创建一个pod,后续如果需要扩展再在rancher上管理。

创建bees_angular_rc.yaml,开放pod的80端口

apiVersion: v1
kind: ReplicationController
metadata:
 name: bees-angular
spec:
 replicas: 1
 selector:
  app: bees-angular
 template:
  metadata:
   labels:
    app: bees-angular
  spec:
   containers:
   - name: bees-angular
     image: registry.cn-hangzhou.aliyuncs.com/kerry2019/bees-nginx:v1.0
     ports:
     - containerPort: 80

创建bees_angualr_svc.yaml,设置nodePort,将pod的80端口映射给宿主机的30000端口

apiVersion: v1
kind: Service
metadata:
 name: bees-angular
spec:
 type: NodePort
 ports: 
  - port: 80
    nodePort: 30000
 selector:
  app: bees-angular

那么执行下列命令即可创建rc和service,与之对应的pod也会运行起来

##启动rc
[mpaas@kerry1 k8s]$ kubectl create -f bees-angular-rc.yaml 
##启动service
[mpaas@kerry1 k8s]$ kubectl create -f bees-angular-svc.yaml 
##查看pod是否启动成功
[mpaas@kerry1 k8s]$ kubectl get pods
mysql服务

创建bees_mysql_rc.yaml,开放pod的3306端口,并将nfs服务器上的共享目录 /home/nfs/bees/mysql/data 挂载到容器中

apiVersion: v1
kind: ReplicationController
metadata:
 name: bees-mysql
spec:
 replicas: 1
 selector:
  app: bees-mysql
 template:
  metadata:
   labels:
    app: bees-mysql
  spec:
   containers:
   - name: bees-mysql
     image: registry.cn-hangzhou.aliyuncs.com/kerry2019/bees-mysql:v1.0
     ports:
     - containerPort: 3306
     env:
     - name: MYSQL_ROOT_PASSWORD
       value: 数据库密码
     volumeMounts:
     - name: mysql-data-persistent-storage
       mountPath: /var/lib/mysql
   volumes:
   - name: mysql-data-persistent-storage
     nfs:
      path: /home/nfs/bees/mysql/data
      server: nfs服务器的ip

创建bees_mysql_svc.yaml

apiVersion: v1
kind: Service
metadata:
 name: bees-mysql
spec:
 type: NodePort
 ports: 
  - port: 3306
    nodePort: 30003
 selector:
  app: bees-mysql
springboot服务

bees_springboot_rc.yaml

kind: ReplicationController
metadata:
 name: bees-springboot
spec:
 replicas: 1
 selector:
  app: bees-springboot
 template:
  metadata:
   labels:
    app: bees-springboot
  spec:
   containers:
   - name: bees-springboot
     image: registry.cn-hangzhou.aliyuncs.com/kerry2019/bees-springboot:v1.0
     ports:
     - containerPort: 8010

bees_springboot_svc.yaml

apiVersion: v1
kind: Service
metadata:
 name: bees-springboot
spec:
 type: NodePort
 ports: 
  - port: 8010
    nodePort: 30004
 selector:
  app: bees-springboot

都是一些基础的代码使用,这里就不过多写了。

自动打包镜像推送仓库的脚本
#!/bin/bash

echo "nginx版本:"$1
echo "springboot版本:"$2

v_springboot_jar=`find /bees/devops/upload/ -name "*.jar"`
echo "找到jar:"$v_springboot_jar
v_angular_zip=`find /bees/devops/upload/ -name "dist.zip"`
echo "找到dist:"$v_angular_zip

docker rmi -f $(docker images|grep "paperbee-nginx" | awk "{print $3}")
docker rmi -f $(docker images|grep "paperbee-springboot" | awk "{print $3}")
echo "删除原镜像"

cd /bees/devops/dockerfiles/springboot-k8s/
rm -f *.jar
cp $v_springboot_jar ./bees-0.0.1-SNAPSHOT.jar
docker build -t paperbee-springboot .
echo "生成springboot镜像"

cd /bees/devops/dockerfiles/angular-k8s/
rm -rf dist/
cp $v_angular_zip ./dist.zip
unzip dist.zip
rm -f dist.zip
docker build -t paperbee-nginx .
echo "生成angular镜像"

docker login --username=账号 --password=密码 registry.cn-hangzhou.aliyuncs.com
echo "登录docker容器仓库"

v_nginx_image=$(docker images|grep "paperbee-nginx" | awk "{print $3}")
v_springboot_image=$(docker images|grep "paperbee-springboot" | awk "{print $3}")


docker tag $v_nginx_image registry.cn-hangzhou.aliyuncs.com/kerry2019/bees-nginx:$1
docker push registry.cn-hangzhou.aliyuncs.com/kerry2019/bees-nginx:$1
echo "推送 bees-nginx:"$1


docker tag $v_springboot_image registry.cn-hangzhou.aliyuncs.com/kerry2019/bees-springboot:$2
docker push registry.cn-hangzhou.aliyuncs.com/kerry2019/bees-springboot:$2
echo "推送 bees-springboot:"$2
备注

1、线上网站地址:纸蜂平台
2、 github地址,欢迎star

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/63525.html

相关文章

  • 一个网站的微服务架构实战2k8s迁移

    摘要:前言我们一起回顾上一篇文章平台的微服务架构和,一共通过构建了三个镜像数据库,部署前端页面的,和接口。最近阿里云产品春节大促销,我一时没忍住又买了一台服务器,打完折扣还是很贵。是一个非常稳定的,可移植的网络文件系统。 前言 我们一起回顾上一篇文章《Bees平台的微服务架构(1)docker和docker-compose》,一共通过Dockerfile构建了三个docker镜像:mysql...

    Forelax 评论0 收藏0
  • 容错性好、易于管理和便于观察:浅谈如何利用K8s全面拥抱微服务架构

    摘要:年月日,论坛首次来到中国,在上海跨国采购会展中心召开并获得了圆满成功。拥抱微服务就成为大势所趋。和大会日期会议日程通告日期年月日会议活动举办日期年月至日和赞助方案和多元化奖学金现正接受申请和即将首次合体落地中国和购票窗口,立即购票 KubeCon + CloudNativeCon 论坛,作为 CNCF 的旗舰会议,自2016年以来已经在北美和欧洲两地的旧金山、伦敦、硅丘(奥斯汀)、哥本...

    Ku_Andrew 评论0 收藏0
  • 快收藏!5225万字,微服务、云原生、容器、K8S、Serverless精华文章集锦

    摘要:正在走远,新年之初,小数精选过去一年阅读量居高的技术干货,从容器到微服务云原生,汇集成篇精华集锦,充分反映了这一年的技术热点走向。此文值得收藏,方便随时搜索和查看。,小数将继续陪伴大家,为朋友们奉献更有逼格的技术内容。 2017正在走远,新年之初,小数精选过去一年阅读量居高的技术干货,从容器、K8S 到微服务、云原生、Service Mesh,汇集成52篇精华集锦,充分反映了这一年的技...

    AaronYuan 评论0 收藏0
  • 2021 年最新基于 Spring Cloud 的微服务架构分析

    摘要:是一个相对比较新的微服务框架,年才推出的版本虽然时间最短但是相比等框架提供的全套的分布式系统解决方案。提供线程池不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务器雪崩的问题。通过互相注册的方式来进行消息同步和保证高可用。 Spring Cloud 是一个相对比较新的微服务框架,...

    cikenerd 评论0 收藏0
  • 回顾Java 发展,看 Docker 与Mesos | 数人云COO谢乐冰@KVM分享实录

    摘要:马拉松会匹配每个和提供的资源,然后通过将任务下发下去。对外暴露的就是负载均衡的某个服务,后面自动将流量转发到某个容器的端口上。还有一直办法是用内网的,这个会维护现有的容器列表端口,并且返回任意一个的端口,页实现了负载均衡和服务发现功能。 演讲嘉宾 数人云COO 谢乐冰 在德国工作十年,回国后加入惠普电信运营商部门,拥有多年项目经验和创业公司工作经验。在数人云负责产品售前和运营,专注行...

    canger 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<