Docker最全教程——从理论到实战(七)

本篇教程持续编写了3个星期左右并且一直在完善、补充具体的细节和实践,预计全部完成还需要1到2个月的时间。整个教程完成之后,我们将会出书(目前已联系出版社)。在这个过程中,您可以加入我们的QQ群(85318032)一起讨论、交流和分享这一块的技术。根据目前和大家的交流,笔者针对大家的情况进行了一些修改和补充,希望对大家有所帮助。另外,对于熟悉容器服务的你,也可以参与进来,让我们一起打造这个系列教程,以帮助更多的人。同时,我们也希望得到大家的支持,请多多点赞或者请我们喝杯咖啡,你们的支持是我们前进的最大动力!

目录

640?wx_fmt=png640?wx_fmt=png640?wx_fmt=png640?wx_fmt=png


托管到腾讯云容器服务

托管到腾讯云容器服务,我们的公众号“magiccodes”已经发布了相关的录屏教程,大家可以结合本篇教程一起查阅。

自建还是托管?

在开始之前,我们先来讨论一个问题——是自建容器服务还是托管到云容器服务?

这里笔者建议大家托管到云容器服务。对于中小团队来说,很多情况下,团队中的运维人员是缺失的,或者运维人员的水平非常有限——大部分比网吧的网管就好那么一点,从成本、安全(云端产品往往提供了一些解决方案,比如权限控制、灾备、高可用、数据加密等)、扩展性的角度,使用云容器服务更加靠谱和省事,而且是可以直接开箱即用的(可以直接跳过自建的初始化时间)。而且随着生产力的继续发展,人的成本一定会越来越高于机器的成本,而且目前已经是远远高于机器的成本了。因此,如何选择,大家是否心中有数了呢?

接下来,我们结合官方资料进行一定的对比:


腾讯云容器服务TKE对比自建容器服务

640?wx_fmt=png


腾讯云容器服务TKE监控与自建容器监控对比

腾讯云容器服务监控为容器集群、服务、实例提供数据收集和数据展示功能。使用容器服务监控,您可以查看集群、节点、服务、实例,容器近 30 个指标的监控统计数据,验证集群是否正常运行并创建相应告警,监控指标覆盖面全,并且在持续增加中。具体如下所示:

640?wx_fmt=png


关于腾讯云容器服务

在使用云端产品时,我们需要先了解该产品。

640?wx_fmt=png



腾讯云容器服务(Tencent Kubernetes Engine,即TKE)为用户解决容器集群的搭建以及运维管理工作,无缝衔接了腾讯云的计算、网络、存储、监控、安全能力,帮助用户升级开发模式、变更应用交付、重构数据管理方式。腾讯云容器服务提速应用部署、简化集群管理,助力企业快速上云。

了解腾讯云容器服务,会涉及到以下概念:

  • 集群:是指容器运行所需云资源的集合,包含了若干台云服务器、负载均衡器等腾讯云资源。

  • 节点:一台已注册到集群内的云服务器。

  • 服务:由多个相同配置的容器和访问这些容器的规则组成的微服务。

  • 镜像:Docker镜像,用于部署容器服务,每个镜像有特定的唯一标识(镜像的Registry地址+镜像名称+镜像Tag)。

腾讯自今年起,对腾讯云投入了大量的资源,并且给予了前所未有的重视和支持。笔者前不久受邀参与了腾讯云TKE专场技术交流会,这里分享几张照片给大家

640?wx_fmt=jpeg640?wx_fmt=jpeg


腾讯与容器服务

腾讯在很早的时候就已经开始使用容器服务了,并且根据内部消息透露,腾讯的新业务基本上均使用容器服务进行托管,而旧有业务也在逐步迁移到容器服务之中。比如大家所熟悉的LOL(英雄联盟),就使用了大量的容器实例用于构建和托管相关服务。

众所周知,一个复杂游戏的构建是非常不容易的。英雄联盟的构建包含了超过150个独立的任务,需要构建每个英雄联盟的特征。而构建包括各种形式和尺寸,从传统的调试构建到各种形式的未来内容构建,还包括全球合作者,如腾讯(Tencent)和竞舞台(Garena)。单单完成构建,就使用超过了450台虚拟机!后续改为使用Docker之后,构建的成本的降低大大提高了团队的迭代速度。当然,中间也出现过许多问题,这些我们后续再讲述。本篇先行略过。


640?wx_fmt=jpeg


一般服务部署流程

为了让大家更好的理解和使用云端产品,这里我们结合腾讯云容器服务,根据日常情况下我们服务部署的情况,来讲解本流程。

在开始之前,有很多额外的初始步骤——比如注册、充值等等,这里笔者先行略过,本篇只围绕一般情况下服务部署到云端的配置和部署流程。因此,这里再强调下前提条件:

  • 腾讯云账号正常并且资金足够,或者无门槛代金券充足,能够满足此次使用

  • 本地服务镜像已经打包完毕(具体可以参阅之前的讲解)

  • 您已经充分阅读了前面的教程,或者对容器服务已经比较了解

满足了以上的前提条件,对于一般情况下,服务托管到腾讯云,我们的主体流程如下所示:

640?wx_fmt=png



创建集群和节点

集群:是指容器运行所需云资源的集合,包含了若干台云服务器、负载均衡器等腾讯云资源;

节点:一台已注册到集群内的云服务器。

如果大家对此不是很好理解的话,这里笔者做一个比喻——集群就好比某款手游,节点就如同该手游的某个区,我们要玩游戏的话,是必须登录到某个区才能玩,就如同我们的服务实例,最终也是分布在各个节点上。

注意:集群创建完毕之后,可以添加已有的节点,也就是已购买的服务器,不过,操作系统必须一致!如果不一致,添加已有节点时可以自动重置该服务器的操作系统。

创建界面如下所示:

640?wx_fmt=png

其中,如果CIDR显示冲突,我们就改到不冲突为止。

节点这块,大家可以选择购买新的主机或者选择已有主机,这里就不多介绍了。


创建命名空间和镜像

这里我们需要了解下镜像仓库。什么是镜像仓库?镜像仓库就是用于存放Docker镜像的仓库,而Docker镜像用于部署容器服务,每个镜像有特定的唯一标识(镜像的Registry地址+镜像名称+镜像Tag)。

除了Docker官方提供了Docker Hub官方镜像仓库之外,各大云厂商往往也提供了自己的镜像仓库,比如腾讯云的镜像仓库是TencentHub。如果我们要获得最佳的体验,那么使用云端产品时,我们建议将Docker镜像推送到该云产品的镜像仓库,这样镜像拉取的延迟更小,支持粒度以及可用性更高。

注意:此步骤不是必须的,使用云端产品,我们依然可以使用官方镜像和第三方公共镜像。

在本篇教程,我们讲解使用TencentHub,也就是腾讯云的镜像仓库。在容器服务的管理页,我们就可以看到入口:


640?wx_fmt=png

首先,我们需要创建命名空间和镜像。这里,我们进入【我的镜像】页面,先来创建命名空间。


创建命名空间

命名空间的创建比较简单:

640?wx_fmt=png

命名空间大家可以理解为目录或者前缀,起一定的分类和约束作用,大家可以使用公司的名称或者自己心中神往的词汇,只要易于理解就行。命名空间OK之后,我们就需要创建镜像:


创建镜像

640?wx_fmt=png

新建页面如下所示:

640?wx_fmt=png

整个创建过程其实和我们在Github上创建一个代码库非常类似,只是这里界面的呈现不够友好(先把产品经理打一顿)。我们在创建代码库的时候,也是需要填写路径(命名空间)和项目名称(镜像名称),如下所示:


640?wx_fmt=png

通过代码库的类比,相信你能够更好的理解镜像仓库。


创建服务

镜像有了,那么接下来就可以创建服务了,相当于是把我们的代码丢到web服务器上跑起来。服务很易于理解,比如数据库服务、web服务等等。

腾讯云容器服务的创建过程如下所示:

640?wx_fmt=png



640?wx_fmt=png


  • 基本设置

    服务名称、容器名称我们建议和镜像名称保持一致,由于有些命名约束,比如“.”需要改成“_” )。

640?wx_fmt=png
  • 部署设置

    我们推荐使用存活检查和就绪检查,启动延时最好不要设为0,实例数量大家可以根据需要改为自动调节,比如根据CPU的使用率来弹性扩展。

640?wx_fmt=png
  • 访问设置

    提供公网访问,端口可以设置成80。如果需要提供https,那么还需要开放443端口,对于某些仅需内网访问的服务,建议大家不要开启公网端口。

640?wx_fmt=png

服务创建完成之后,我们希望镜像在推送之后,能够自动触发服务更新。因此,我们还需要配置镜像触发器。


配置镜像触发器

镜像触发器可以在每次生成新的Tag(镜像版本)时,自行执行动作,如:自动更新使用该镜像仓库的服务。

我们可以通过【我的镜像】页面,点击刚添加的镜像名称,进入详情页,然后点击【触发器】tab页来打开触发器管理页面。

640?wx_fmt=png

点击【添加触发器】按钮可以来创建触发器。相关配置如下所示:

640?wx_fmt=png

我们需要选择对应的容器服务。我们推荐使用全部触发这个触发条件,大家也可以根据自己的需求设置指定Tag触发,比如针对生产、测试和开发环境。


推送镜像

触发器设置好了,也就是整个水管都铺设好了,只要打开水龙头就可以开闸放水了。对于我们这里,这个水指的就是镜像。我们只需将我们的镜像推送到腾讯云镜像仓库,即可自动完成整个服务部署流程。

镜像推送的方式有很多,比如通过CI工具构建和推送,也可以通过脚本来推送已有的镜像。这里,我们将介绍通过脚本来推送镜像。

核心脚本代码为:

docker login --username {用户名} --password {密码} ccr.ccs.tencentyun.com

docker push {镜像名称}:{镜像版本}

注意:ccr.ccs.tencentyun.com为腾讯仓库的地址。username为腾讯云账号Id,密码为仓库密码。

如果忘记密码,可以在此处重置:

640?wx_fmt=png

Magicodes.Admin框架提供了腾讯云推送脚本,相关参数如下所示:

640?wx_fmt=png

一般情况下,我们仅需提供默认的配置即可,即配置tencentyun.config即可:

640?wx_fmt=png

镜像地址可以从腾讯云的【我的镜像】获取:

640?wx_fmt=png

如果没有特殊的配置,我们仅需执行此脚本即可完成编译、运行单元测试、打包、生成镜像以及镜像推送的整个过程。编译的文件会放在tsoutputs目录,如下所示:

640?wx_fmt=png


例如,我们可以执行以下命令来发布Host工程,也就是后台服务:

./build-with-tencentyun.ps1 -pushType HOST -debug true

640?wx_fmt=png640?wx_fmt=png

如果需要传递相关应用的自定义设置,脚本这边也提供了对设置文件的支持,例如:

640?wx_fmt=png

如果在编译前需要执行单元测试并通过之后才允许发布,脚本也提供了参数进行支持:

640?wx_fmt=png

例如:

./build-with-tencentyun.ps1 -pushType HOST -debug true -runTest true

当单元测试失败时,脚本将终止执行:

640?wx_fmt=png

除了使用脚本推送之外,我们还可以通过CI工具或者服务来完成自动构建和推送。在后续的章节,我们会进行讲述。


问题排查

将服务托管到云端时,我们可能会碰到一些问题。掌握一些手段或技巧,能够让我们更易于排查问题以及解决问题。


镜像拉取问题

目前腾讯云容器服务日志中不会打印镜像拉取失败的具体错误,如下图所示:

640?wx_fmt=png640?wx_fmt=png640?wx_fmt=png


我们需要在服务器上拉取镜像来查看具体日志错误,比如执行以下命令:

sudo su

docker login --username {用户名} --password {密码} ccr.ccs.tencentyun.com

docker pull {镜像名称}

640?wx_fmt=png


远程登录

在某些情况下,我们需要登录具体的容器实例来排查问题,这点,腾讯云是能够支持的:

640?wx_fmt=png

登录之后,我们可以直接执行命令,比如执行dir命令列出所有的文件和目录:

640?wx_fmt=png

我们也可以上传下载容器实例中的文件,如图所示:

640?wx_fmt=png


通过文件助手,我们能够很方便的检查和修改实例中的配置文件,或者查看具体日志。这对于我们调测或者检查问题非常重要。

注意:使用文件助手上传下载文件时,注意加上当前工作目录路径,比如“/app/appsettings.json”。


利用容器服务日志

在开发过程中,容器服务实例可能经常会崩溃或者在运行中出现问题,一方面,我们可以记录相关日志或者将日志推送到日志服务,另一方面,我们强烈推荐大家利用好容器服务日志。

在前面的【控制台日志提供程序】章节,我们有详细讲解,配置了控制台日志提供程序之后,我们可以在容器服务实例中看到所有的日志,包括导致容器实例崩溃的日志,这点对于我们排错也非常重要——因为往往崩溃太快,有可能文件日志都来不及记录或者推送。

640?wx_fmt=png

往期内容

Docker最全教程——从理论到实战(一)

Docker最全教程——从理论到实战(二)

Docker最全教程——从理论到实战(三)

Docker最全教程——从理论到实战(四)

Docker最全教程——从理论到实战(五)

Docker最全教程——从理论到实战(六)


长按识别二维码,了解更多精彩内容

640?wx_fmt=gif640?wx_fmt=jpeg640?wx_fmt=gif

如果喜欢作者的文章,请关注“magiccodes”订阅号以便第一时间获得最新内容。本文版权归作者和湖南心莱信息科技有限公司共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。


QQ群:

编程交流群<85318032> 

产品交流群<897857351> 


没有更多推荐了,返回首页