随着云计算的日趋成熟,越来越多的企业将服务迁移到云,虚拟化,容器技术也飞速发展,出现了像 docker 这样的容器应用引擎,docker 的流行也使得容器编排成为了企业技术发展的方向,近年来各大企业开源了许多容器编排工具,其中 k8s 最引人注目,k8s 是由谷歌开源的容器编排工具,经过近几年来的发展,已经成为容器编排领域的事实标准。

随着微服务架构的广泛使用,微服务的治理成为了每一个使用微服务架构企业所面临的难题,为了解决这些难题,企业围绕微服务造了许多轮子,但是这些轮子多种多样,功能也不尽相同,企业往往会面临着如何选择轮子的难题,另外由于开源组件维护起来也令人十分头疼。为了解决这些问题,service mesh 横空出世,service mesh 的主要思想是微服务治理下沉到基础设施,使开发者们更加聚焦于业务,不必再将更多的时间花在微服务的治理上。

这篇文章是在 k8s 上搭建 golang 微服务的一个探索过程。

搭建 k8s

机器准备

这里我选择了 vmware 虚拟机,总共 4 台(集群数奇数更好但是由于 istio 需要占用比较多的资源,于是在原来 3 台的基础上加了一台),系统为 centos7

环境配置

首先每台机器上都需要安装 docker, docker 的安装网上有很多教程,这里不做过多的声明,只是要注意 k8s 和 docker 的版本需要兼容

下面是我的 docker 版本信息

image

接下来正式搭建 k8s, k8s 的搭建方式有很多,这里我们选择最简单的使用 rancher 搭建,rancher 是一个容器管理平台,方便我们管理容器。

安装 rancher

rancher 的安装需要一条命令即可,只需要在集群上的一台机器上安装

1
$ sudo docker run -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher

安装完成后,在浏览器中输入刚刚安装 rancher 的那台主机的 ip 地址,由于没有配置 https,可能会有安全提示,直接忽略就是,打开后设置用户名和密码

image

然后会进入 rancher 配置页面

image

然后选择集群类型,这里我选择自定义,如果你已经有了 k8s 集群可以直接导入,如果是由云服务商提供的主机的可以选择下面的云服务商主机 image

接下来是集群配置,除了集群名称必填之外其他的都是可选配置,可以根据自己的需求来决定要不要配置,这里我们直接选择下一步

image

接下来根据 rancher 的提示来配置主机,选择不同的角色,会生成不同的命令,根据每台主机的角色,选择不同的命令运行,这我用 s1 作为 etcd 和 control, 然后 s2, s3, s4 都为 worker image

所有主机注册成功后点完成

image

这个时候 rancher 在为我们自动创建 k8s 集群,需要等待一段,让集群搭建完成

下面是集群搭建成功的仪表盘界面

image

rancher 为我们提供了安装 istio 的选项,我们可以在工具栏中选择 istio, 我们之后会使用 ingress 网关,需要在这里开启 ingress 网关,点击启用就会在当前集群中安装 istio

下面是 istio 安装好了以后的界面

image

至此环境搭建基本完成

部署微服务

这里我们部署一个简单用户服务,由一个 grpc 服务 user-srv 和一个 http 的网关服务 api-gateway 两部分组成,user-srv 服务还会与数据库服务 pg 和缓存服务 redis 进行进行交互。用户服务的代码在 github 上。

部署 pg

首先我们来创建一个 pg 服务,和 docker 搭建 pg 类似,我们需要设置容器暴露的端口,数据库密码,挂载的目录,在 rancher 中选择工作负载,部署服务,具体配置看下面的截图

image

这里需要先建立我们要用的数据库和表,可以先通过 node port 的形式暴露出去,然后用数据连接工具去连接,也可以直接通过 rancher 提供的命令行工具,直接进入容器中连上数据库然后建表。

部署 redis

redis 部署和 pg 类似,这里只是简单的配置了一个单机 redis, rancher 商店有 redis 集群部署的模板可以用。下面是我的配置

image

部署 user-srv

因为我们使用的腾讯云的私有镜像仓库,所以我们要先在 rancher 中加入镜像库凭证,也就是私有库的账号和密码,不然无法拉取镜像。在下面配置镜像库地址,用户名和密码

image

我们用户服务的配置会通过配置映射的方式在 k8s 上存储,然后程序通过获取环境变量的形式获取配置。所以我们首先要添加一个配置映射。

image

然后部署工作负载,注意需要将配置映射配置到环境变量

image

部署 api-gateway

和 user-srv 一样,我们先配置映射

image

然后部署工作负载,由于 api-gateway 要提供外部访问,这里我们暂时通过 nodeport 的形式暴露出去,等之后加入 istio 在通过 istio-gateway 暴露出去

image

到这里我们所有的服务都已经部署完成了

image

我们通过 node port 形式对 api 进行访问

image

可以看到我们服务能够正常访问

总结

这一部分我们通过 rancher 搭建了 k8s 集群,安装了 istio, 并且部署了微服务,下一部分将会展示如何使用 istio 提供的功能来治理我们部署的微服务。