微服务 Docker 容器化部署和 Kubernetes 容器编排

4 篇文章 0 订阅
2 篇文章 0 订阅

说明:基于之前使用go-kit构建的用户微服务,今天主要使用docker和k8s部署用户系统,前提是你的系统已经安装了docker 和k8s,一切的环境都安装完毕。

首先看下项目结构

svc下是存放各个微服务,今天就user服务部署,其他也类似,common目录存放的是数据库操作和数据表的定义,还有log工具,错误处理公共包;

为了快速部署,user微服务去掉了服务发现和链路追踪模块,服务网关以后优化再加上。

Docker 部署 user 服务

user 服务依赖于 Redis 和 MySQL 数据库,我们先通过 Docker 部署好这两个底层数据依赖

拉取5.0 版本的 Redis 命令如下所示:

docker pull redis:5.0

接下来我们就可以通过 docker run 命令启动以 redis:5.0 镜像为蓝本的容器,命令如下所示:

docker run -itd --name redis -p 6379:6379 redis:5.0 
 

再用户目录下我们首先看下Dockerfile文件:

使用基础镜像是golang最新版本,加入境变量,同时使用go mod 处理依赖,在容器内编译好后,暴露9001端口,最后在容器内运行。

在 user 服务的代码下,即可通过以下命令构建一个带 user 服务的镜像:docker build -t user .

最后我们为user服务定制一个已经初始化数据库的 MySQL 镜像,Dockerfile 如下所示:

同级目录下 新建 init.sql 文件

注:MySQL 的官方镜像支持在容器启动的时候自动执行指定的 sql 脚本或者 shell 脚本,只要在构建容器时将相关 sql 脚本或者 shell 脚本复制到 /docker-entrypoint-initdb.d 目录下即可。比如上述例子中,我们把初始化 init.sql 放到该目录下,让容器在启动时帮我们初始化好 user 数据库

接下来执行:docker build -t mysql-for-m-user .  这样mysql镜像制作完成,使用docker images 查看镜像如下:

其中 mysql-for-m-user,user 和redis 三个镜像已经准备好了,接下来就可以使用k8s部署起来了。

Kubernetes 部署 user 服务

接下来我们将使用创建 Pod 部署 user 服务以及它依赖的 Redis 和 MySQL 数据库。我们可以通过 yaml 文件描述配置过程和使用 kubectl 命令行工具访问 Kubernetes 的接口,user 服务的 Pod 描述如下:

上述 yaml 中,展示了部署 user、mysql 和 redis 3 个容器应用的简单Pod。由于在同一个 Pod 中的多个容器是并发启动的,为了保证 user 服务启动时 Redis 和 MySQL 数据库已经部署启动完成,在 user 服务的 main 函数中增加了 time.Sleep 延迟了 user 服务的启动。目的是等待redis和mysql启动后在启动user服务,通过 kubectl create 命令和 yaml 描述启动 Pod,命令如下所示:

kubectl create -f user-service.yaml 这将在 Kubernetes 集群的 Node 节点中创建单个 Pod。

单个 Pod 不具备自我恢复的能力,当 Pod 所在的 Node 出现问题,Pod 就很可能被删除,这就会导致 Pod 中容器提供的服务被终止。为了避免这种情况的发生,可以使用 Controller 来管理 Pod,Controller 提供创建和管理多个 Pod 的能力,从而使得被管理的 Pod 具备自愈和更新的能力。常见的 Controller 有以下几种:

  • Replication Controller,确保用户定义的 Pod 副本数保持不变;

  • ReplicaSet,是 RC 的升级版,在选择器(Selector)的支持上优于 RC,RC 只支持基于等式的选择器,但 RS 还支持基于集合的选择器;

  • Deployment,在 RS 的基础上提供了 Pod 的更新能力,在 Deployment 配置文件中 Pod template 发生变化时,它能将现在集群的状态逐步更新成 Deployment 中定义的目标状态;

  • StatefulSets,其中的 Pod 是有序部署和具备稳定的标识,是一组存在状态的 Pod 副本。

比如我们可以使用 Deployment Controller 为我们管理 user-service Pod,新建文件user-service-deployment.yaml 配置如下:

在上述配置中,我们指定了 kind 的类型为 Deployment、副本的数量为 3 和选择器为匹配标签 name: user-service。可以发现原来 Pod 的配置放到了 template 标签下,并添加 name: user-service 的标签,Deployment Controller 将会使用 template 下的 Pod 配置来创建 Pod 副本,并通过标签选择器来监控 Pod 副本的数量,当副本数不足时,将会根据 template 创建 Pod。

通过以下命令即可通过 Deployment Controller 管理 user-service Pod,命令如下:

kubectl create -f user-service-deployment.yaml

最后我们可以在k8s管理界面上查看部署user服务

最后是k8s如果对外提供服务?Kubernetes的三种外部访问方式:NodePort、LoadBalancer 和 Ingress

本章使用NodePort对外提供user服务,在k8s下新建http.yaml文件;文件如下:

user服务对外暴露9001端口,使用31000端口对外提供服务;访问http:127.0.0.1:31000就可以访问部署的微服务了。到此使用k8s部署到微服务完成,使用postman测试下

最后在在k8s管理界面上查下日志日下

一个简单的微服务部署完成,下一章为微服务添加服务发现和网关等功能,如有疑问评论区交流学习。

代码:GitHub - xulei1931/mSystem

需要云原生和golang学习资料请加微信,保障满满的干货

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿磊的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值