七、使用容器部署微服务

七、使用容器部署微服务

前面我们介绍了TSF平台的管理能力,通过前面的内容学习我们已经知道了:在TSF中应用按部署 方式分为二大类: 虚拟机应用,容器应用;虚拟机应用在前面已经介绍了如何在TSF中部署使用, 接下来我们来看一下容器应用的部署使用。

学习目标

通过本文的学习,您将可以:

  • 掌握使用容器部署微服务的方法
  • 掌握使用容器创建简单的 Nginx 服务的操作

第一章 容器的介绍与使用

首先我们来看一下容器的基本知识以及如何在TSF中使用容器

1.1 容器介绍

image-20211130184809509

  • 几十年前,运输业面临着类似的问题:每一次运输,货主与承运方都会担心因货物类型的不同而导致损失,比如几个铁桶错误地压在了一堆香蕉上。另一方面,运输过程中需要使用不同的交通 工具也让整个过程痛苦不堪:货物先装上车运到码头,卸货,然后装上船,到岸后又卸下船,再装上火车,到达目的地,最后卸货。一半以上的时间花费在装、卸货上,而且搬上搬下还容易损坏货物。

  • 幸运的是,集装箱的发明解决这个难题。集装箱最大的成功在于其产品的标准化以及由此建立的 一整套运输体系。任何货物,无论钢琴还是保时捷,无论货物的体积、形状差异有多大,最终都被装载进集装箱里。由于要实现标准尺寸集装箱的运输,堆场、码头、起吊、船舶、汽车乃至公路桥梁、隧道等,都必须随着它在全球范围内的应用而逐渐加以标准化,形成影响国际贸易的全 球物流系统。由此带来的是系统效率大幅度提升,运输费大幅度下降,地球上任何一个地方生产的产品都可以快速而低廉地运送到有需求的地方。

    image-20211130185131659

  • 传统的软件交付物比较零散,包括:应用程序、依赖软件安装包、配置说明文档、安装文档、上线文档等非标准化组件。

  • 同时,在应用开发过程中,我们一般在开发环境进行应用的开发和调试;开发工作完成后,需要将应用部署到测试环境进行测试;当应用测试完没有问题后,再将应用部署到生产环境。但是我们知道,在不同的环境中,因为操作系统,版本甚至设置的不一致都可能导致应用程序的无法正常运行,如何保证运行环境的一致性也成为一大难题

  • 而容器技术充分借鉴了集装箱的思想,为代码提供了一个基于容器的标准化运输系统,改变了应用交付的模式,在以前应用程序的交付是通过源码或可执行文件交付,同时必须包含一个如何部署应用程序的说明文档。往往部署一个稍复杂点的程序,都需要两到三天的时间。容器可以将应用程序和依赖环境打包起来,只要应用程序的容器在一个环境运行起来,在其他任何环境下也能运行,从交付代码变成交付容器,从两到三天的时间缩短到 5 分钟,在保证运行环境一致性的前提下极大的提高了交付的效率

1.1.1 虚拟化技术的演变

image-20211130185220779

  • 虚拟化(Virtualization)技术最早出现在 20 世纪 60 年代的 IBM 大型机系统,在70年代的 System 370 系列中逐渐流行起来,这些机器通过一种叫虚拟机监控器(Virtual Machine Monitor,VMM)的程序在物理硬件之上生成许多可以运行独立操作系统软件的虚拟机 (Virtual Machine)实例。近年来,容器技术大行其道,将虚拟化技术推向了一个新的高度。同时,随着多核系统、集群、网格甚至云计算的广泛部署,虚拟化技术在商业应用上的优势日益体现,不仅降低了 IT 成本,而且还增强了系统安全性和可靠性,虚拟化的概念也逐渐深入到人们日常的工作与生活中。
  • 物理机就像一栋独门独院的别墅,有独立的地基,花园,泳池;而虚拟机就像商品楼里的一套房 子,一栋商品楼有多套房子,多套房子共享地基,花园,泳池,每套房子有独立卫生间,厨房; 而容器相当于胶囊旅馆,一套房子隔成多个小胶囊形状的空间,每个胶囊里住一个人,多个胶囊共享花园,卫生间,厨房等设施。
  • 对于物理机和虚拟机我们都很熟悉。但是你一定会想,既然容器的技术理念如此先进,我们如何在实际的项目过程中使用它呢?
1.1.2 主流容器技术-Docker
  • Docker是PaaS提供商DotCloud开源的一个基于LXC(Linux容器项目)的高级容器引擎。Docker近年来非常火热,无论是Google,Amazon还是 Facebook,还是国内的BAT,新浪,京东等公司都利用Docker作为云平台的基础。

image-20211130185920444

  • Docker是一种linux容器技术。容器由单个操作系统挂管理的资源划分到孤立的组中,以便更好 的在组之间平衡有冲突的资源使用需求。可简单理解为一种沙盒 。每个容器内运行一个应用,不 同的容器之间相互隔离,容器之间也可以建立通信机制。容器的创建和停止都十分快速,资源需 求远远低于虚拟机。开发者打包应用以及依赖包到一个可移植的容器中,发布到任何流行的 Linux机器上,可以实现虚拟化。容器完全使用沙箱机制,相互之间不会有任何接口。
  • 上图是Docker的基本架构:Docker使用客户端服务器架构。Docker客户端和Docker守护进程 交流,Docker守护进程非常重要,它辅助构建,运行和分发你的Docker容器。Docker客户端和 守护进程可以运行在同样的系统上,或者是你可以连接一个Docker客户端到一个远程Docker守 护进程中。Docker客户端和守护进程通过sockets或通过RESTful API进行沟通交流。
    • Docker守护进程:正如上面的图片显示,Docker守护进程运行在一个主机机器中。用户不直接和守护进程交互,而是通过Docker客户端。
    • Docker客户端:Docker客户端,以docker二进制的形式出现,是Docker最基本的用户接口。 他接收来自用户的命令,然后和Docker守护进程来回沟通。
1.1.3 容器 VS 虚拟机
  • 容器和虚拟机的特性对比

    image-20211130190042711

  • 容器和虚拟机的架构对比

  • 容器和虚拟机的架构对比:

    • 从容器和虚拟机的结构图可以看出,容器相比于虚拟机少了Guest OS层,同时Hypervisor层 在Docker上已经被Docker Engine层所取代。在这里我们需要知道,Guest OS 是虚拟机安 装的操作系统,是一个完整的系统内核,另外Hypervisor可以理解为硬件虚拟化平台,它在 Host OS中以内核驱动的形式存在。
    • 虚拟机实现资源的隔离的方式是利用独立的Guest OS,以及利用Hypervisor虚拟化CPU、内 存、IO等设备来实现的。然而Docker并没有和虚拟机一样利用一个独立的Guest OS执行环境 的隔离,它利用的是目前Linux内核本身支持的容器方式,实现了资源和环境的隔离,简单来 说,Docker就是利用Namespace 实现了系统环境的隔离,利用了cgroup实现了资源的限制, 利用镜像实例实现跟环境的隔离。
    • Docker有着比虚拟机更少的抽象层。由于Docker不需要Hypervisor实现硬件资源的虚拟化, 所以运行在Docker容器上的程序,直接使用的都是实际物理机的硬件资源。因此在cpu、内 存、利用率上,Docker将会在效率上具有更大的优势。此外,Docker直接利用物理机的系统 内核,避免了虚拟机启动时所需要的系统引导时间和操作系统运行的资源消耗,利用Docker 能够在几秒钟之内启动大量的容器,是虚拟机无法办到的。快速启动低资源消耗的优点,使 Docker在弹性云平台自动运维系统方面具有很好的应用场景。
  • 容器相比传统的虚拟机有如下几点优势:

    1. 一是容器启动时间比虚拟机要快,虚拟机的启动时间是分钟级的,而容器理论上在1秒之内能启动成百上千个。非常适用于业务量动态变化快的业务。
    2. 二是容器比虚拟机要小的多,镜像小,传统的一个虚拟机的镜像小的几G,大的上百G,而容器的镜像往往都是几十MB,轻量级的容器镜像意味着可以更方便的进行传输。
    3. 三是容器的性能接近原生的系统,能最大程度利用机器的性能,但是虚拟机的性能则弱 于物理机,对物理机性能的利用率相对较低。
    4. 四是由于容器比虚拟机更加轻量级,单台物理机可以支持上千个容器,而虚拟机则一般只有几十个。
  • 我们知道,容器可以以更细的粒度来划分CPU和内存等计算资源。虚拟机最小的也是1C1G, 但是容器可以划分成更小的单位比如 0.1核,128 MB内存,对于平时资源使用率不高的业务非常适用。因为容器做好了资源的隔离,不同容器可以在在一台机器上混合部署,能极大的提高资源利用率,降低成本。

1.1.4 利用Docker部署的优势

image-20211130191955199

从项目的角度看

  • 一致的环境:容器让开发者可以创建与其他应用相隔离的可预测环境。容器还可以包含应用所 需的软件依赖项,比如具体的编程语言运行时版本和其他软件库。从开发者的角度看,无论应 用最终部署在什么地方,所有这些都保证会保持一致。这一切将转化为生产力的提升:开发者 和 IT 运营团队可以减少调试和诊断环境差异所需的时间,将更多的时间用于为用户提供新的 功能。而且这也意味着错误更少,因为开发者现可在开发和测试环境中做出在生产环境中也适用的假设。
  • 轻量级:在一台机器上运行的多个 Docker 容器可以共享这台机器的操作系统内核;它们能够 迅速启动,只需占用很少的计算和内存资源。镜像是通过文件系统层进行构造的,并共享一些 公共文件。这样就能尽量降低磁盘用量,并能更快地下载镜像
  • 在任何地方运行:容器几乎能在任何地方运行,极大减轻了开发和部署工作量:在 Linux、 Windows 和 Mac 操作系统中;在虚拟机或裸机上;在开发者的机器或本地数据中心的机器 上;当然还有在公有云上。隔离:容器会在操作系统一级虚拟化 CPU、内存、存储和网络资 源,为开发者提供在逻辑上与其他应用相隔离的沙盒化操作系统接口。

从工程人员的角度看

  • 对开发人员来说:Build Once, Run Anywhere。容器意味着环境隔离和可重复性。开发人员 只需为应用创建一次运行环境,然后打包成容器便可在其他机器上运行。另外,容器环境与所 在的 Host 环境是隔离的,就像虚拟机一样,但更快更简单。
  • 对运维人员来说:Configure Once, Run Anything。运维只需要配置好标准的 runtime 环境, 服务器就可以运行任何容器。这使得运维人员的工作变得更高效,一致和可重复。容器消除了 开发、测试、生产环境的不一致性。
1.1.5 容器编排
  • 容器增多所带来的问题
    • 如何进行容器集群的管理
    • 如何管理服务
    • 如何进行配置管理
    • 如何进行镜像管理

image-20211130192203394

  • 容器与虚拟机相比有个很大的优势就是轻量,得益于这个特性,容器在各个技术角落施展拳脚。 基于容器的应用一般会采用微服务架构。在这种架构下,应用被划分为不同的组件,并以服务的 形式运行在各自的容器中,通过 API 对外提供服务。为了保证应用的高可用,每个组件都可能会 运行多个相同的容器。当多个容器组成了集群,集群中的容器会根据业务需要被动态地创建、迁移和销毁。这样一来,轻量级的容器就很容易造成混乱。主要的挑战来自以下几个方面:
    • 容器集群的管理
    • 服务管理
    • 配置管理
    • 镜像管理
  • 面对成百上千乃至更多的容器,必须要有统一的管理平台来高效地管理容器集群。而这,就是容器编排引擎要干的工作。
  • 所谓编排(orchestration),就是对容器的整个生命周期进行管理,通常包括容器管理、调度、 集群定义和服务发现等。通过容器编排引擎,容器被有机的组合成微服务应用,实现业务需求。
  • 目前常见的容器编排技术有两种,一种是Docker Swarm,另一种是Kubernetes,简称k8s。 k8s由于兼容性更好,功能更加强大,社区更加活跃等优势逐渐越来越多地成为容器编排的首选。
1.1.6 Docker核心概念
  • Docker 核心概念:

    • 镜像(Image):
      • 类似虚拟机镜像,一个只读的模板
    • 容器(Container):
      • Docker 利用容器来运行应用
    • 仓库(Repository):
      • 仓库是集中存放镜像文件的场所
      • 分为私有仓库和共有仓库两类

    image-20211130192504096

  • Docker 核心概念:

  • Docker镜像

    • 一个Docker镜像是一个只读的模板。例如,一个镜像可以包含一个带有Apache和你的web应用的Ubuntu操作系统。镜像被用来创建Docker容器。Docker提供了一个简单的方式来构建 一个新的镜像或更新一个存在的镜像,或者是你可以下载其他人已经创建的Docker镜像。 Docker镜像是Docker的build组件。
  • Docker容器

    • Docker 利用容器来运行应用。
    • 容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、 保证安全的平台。
    • 可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网 络空间等)和运行在其中的应用程序。
  • Docker仓库

  • 仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈, 并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜 像,每个镜像有不同的标签(tag)。仓库分为公开仓库(Public)和私有仓库(Private)两 种形式。最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括Docker Pool 等,可以提供大陆用户更稳定快速的访问。私有仓库(Private):如腾讯云 TSF 中每个容器应用对应一个私有镜像仓库,仅该账号可访。

1.2 Docker基本使用
  • 安装Docker实验环境
    • 软件:腾讯云CVM(安装CentOS-7.4的操作系统)
    • 在线安装Docker
      • 在线安装Docker:yum install docker
      • 启动Docker服务:systemctl start docker.service
      • 开机启动Docker:systemctl enable docker.service
      • 确定Docker的版本:docker version
  • Docker 环境安装在不同操作系统下安装方式不一样:详情参考Docker 官网文档: https://docs.docker.com/docker-for-mac/install/
1.2.1 Docker基本命令
  • 基本Docker命令

    • ```cmd
      docker login # 登录到Docker仓库

      1
      2
      3
      4
      5

      - 镜像相关

      - ```cmd
      docker images #查看系统中的镜像
    • ```cmd
      docker pull / #从仓库拉去镜像

      1
      2
      3

      - ```cmd
      docker push <username>/ <repository> : <tag> #将自定义的镜像发布到仓库
    • ```cmd
      docker build -t . #使用当前目录下的Dockerfile构建镜像

      1
      2
      3

      - ```cmd
      docker run <image-name> #使用镜像创建容器
    • ```cmd
      docker image rm #删除指定的镜像

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26

      - 官方文档:https://docs.docker.com/engine/reference/commandline/docker/



      ##### 1.3 Dockerfile基本使用

      - Dockerfile的使用流程

      ![image-20211130194410249](https://gitee.com/divemaven/git-project/raw/master/image-20211130194410249.png)

      - Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外, 还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
      - 我们使用 Dockerfile自定义镜像,依赖镜像来运行容器,因此 Dockerfile 是镜像和容器的关键, Dockerfile 可以非常容易的定义镜像内容,同时在我们后期的微服务实践中,Dockerfile 也是重点关注的内容。
      - 使用Dockerfile可以制作docker镜像,制作好的docker镜像可以推送到镜像仓库,用户可以在安装了docker环境的电脑上拉取镜像,通过镜像可以运行docker容器。其流程图如上图所示。

      ```dockerfile
      FROM centos:7
      RUN yum update -y && yum install -y java-1.8.0-openjdk
      COPY provider-demo-0.0.1-SNAPSHOT.jar /data/tsf/
      COPY run.sh /data/tsf/
      # GMT+8 for CentOS
      RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai
      /etc/localtime
      RUN echo "Asia/Shanghai" > /etc/timezone
      # run.sh
      CMD ["sh", "-c", "cd /data/tsf; sh run.sh provider-demo0.0.1-SNAPSHOT.jar /data/tsf"]
  • Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了 Dockerfile,当我们需要定制自己额外的需求时,只需在 Dockerfile 上添加或者修改指令,重新生成 image 即可,省去了敲命令的麻烦。

  • Dockerfile语法

    • Dockerfile的指令是忽略大小写的,建议使用大写,使用 # 作为注释,每一行只支持一条指令
    • FROM: 目地:指定基础的image,表示新程序基于哪个image构建新image 语法: FROM : tag:版本号,如果没有,则使用最新版本
    • MAINTAINER 指定镜像创建者信息,语法:MAINTAINER
    • RUN:RUN可以运行任何被基础image支持的命令
    • COPY:复制命令,语法:COPY 源路径 目的地
    • CMD:容器启动时运行的操作。该指令只能在文件中存在一次,如果有多个,则只执行最后 一条
1.4 利用Dockerfile构建第一个镜像
  • 使用Docker(Dockerfile)创建镜像,部署一个简单的Web应用。

    • 操作步骤:

      image-20211130204317287

  • 步骤 1:准备一个文件,名叫:Dockerfile。

    1
    2
    FROM nginx
    RUN echo '<h1>TFS Demo Application and Docker</h1>' > /usr/share/nginx/html/index.html
  • 基于nginx镜像创建简单的web应用,步骤见上图。

  • 通俗的讲就是创建了一个web服务,访问地址后显示的内容为“TFS Demo Application and Docker”。

1.4.1 创建Docker镜像
  • 步骤 2:创建Docker镜像

    • 在Dockerfile所在的目录下,执行命令用于构建镜像:

      1
      docker build -t nginx:my .
    • 运行结果如下图

      image-20211130205610647

  • 命令:docker build -t nginx:my .

  • 其中,命令后面的点(.)是必须的,用于路径参数的传递,这里表示当前路径

1.4.2 创建容器并验证服务
  • 步骤 3:使用Docker镜像创建容器:

    1
    docker run -d -p 7788:80 nginx:my
  • 步骤 4:使用浏览器访问宿主机的7788端口,可以看到如下界面:

    image-20211130205959778

  • docker run -d -p 7788:80 nginx:my

    • run 表示启动docker容器
    • -d 表示守护进程
    • -p 用于指定对应的端口地址,其中在冒号( : )前面的7788是宿主机中对应的应用端口,冒号后面的80是容器中的应用运行的端口

第二章 TSF容器化部署

前面我们已经使用过nginx部署一个简单的web服务,接下来我们看一下Nginx是什么以及如何在 TSF上创建Nginx服务。

2.1 云容器简介
  • TSF中容器资源说明:

    • TSF中的容器资源基于腾讯云容器服务(Tencent Kubernetes Engine,TKE)

    • 腾讯云容器服务(Tencent Kubernetes Engine)是高度可扩展的高性能容器管理服 务,用户可以在托管的云服务器实例集群上轻松运行应用程序

    • 其主要特性有:

      image-20211130210420369

  • 腾讯云容器服务(Tencent Kubernetes Engine)是高度可扩展的高性能容器管理服务,用户可以在托管的云服务器实例集群上轻松运行应用程序。使用该服务,用户将无需安装、运维、扩展 您的集群管理基础设施,只需进行简单的 API 调用,便可启动和停止 Docker 应用程序,查询集 群的完整状态,以及使用各种云服务。用户可以根据资源需求和可用性要求在集群中安排容器的 置放,满足业务或应用程序的特定要求。

  • 云容器主要的特征有:

    • 生态开源:腾讯云容器服务完全兼容 kubernetes 全能力,适配了腾讯云 CVM、CBS 等 IAAS 的基本能力。同时腾讯云提供的基于 kubernetes 开放的 CBS、CLB 等云产品,支持多 种开源应用一键部署到容器集群中,极大提升部署效率。

    • 安全可靠:容器服务启动于专用云服务器实例中,独享计算资源。集群运行在私有网络,支持 自定义安全组和网络 ACL。容器服务采用分布式服务架构,实现服务故障自动修复、数据快 速迁移;结合有状态服务后端的分布式存储,实现高可用服务和数据的安全。

    • 简单易用:使用容器服务,您无需再使用集群管理软件和设计容错集群架构,便可简化大规模 集群管理和分布式应用的管理、运维。您只需启动容器集群,并指定想要运行的任务,容器服 务即可帮您完成所有的集群管理工作,让您专心投入开发 Docker 化的应用程序。

    • 高效部署:容器服务运行在高品质的 BGP 网络中,能够实现镜像极速下载和上传,海量容器 秒级启动,提高容器部署效率;容器服务可对提交的业务代码进行快速构建、测试和打包集成, 将集成的代码部署到预发布环境和现网环境上。

    • 灵活扩展:容器服务支持灵活集群托管,便于安排长期运行的应用程序和批量作业,以便扩展 您的业务。容器服务同时集成负载均衡,支持在多个容器之间分配流量,自动恢复运行状况不 佳的容器,保证容器数量满足您的需求,以便为应用程序提供支持。

    • 低成本:容器服务本身不收取费用,您可以在容器中免费调用 API 构建您的集群管理程 序。另外您使用容器服务时,创建的用于存储和运行应用程序的云服务资源(如云服务器、云硬盘等)仍按正常标准计费。

2.1.1 TKE VS 开源Kubernetes

image-20211130211428197

  • 腾讯云容器服务是基于 Kubernetes 实现的,Kubernetes(k8s) 是 Google 开源的容器集群管 理系统。在 Docker 技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态 伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。相较于开源k8s平台,TKE有如下优势:

    • 简单易用

      • 腾讯云容器服务提供超大规模容器集群管理、资源调度、容器编排、代码构建,屏蔽了底 层基础构架的差异,简化了分布式应用的管理和运维,您无需再操作集群管理软件或设计 容错集群架构,因此也无需参与任何相关的管理或扩展工作。您只需启动容器集群,并指 定想要运行的任务即可,腾讯云容器服务帮您完成所有的集群管理工作,让您可以集中精 力开发 Docker 化的应用程序。
      • 自建容器管理基础设施通常涉及安装、操作、扩展自己的集群管理软件、配置管理系统和 监控解决方案,管理复杂。
    • 灵活扩展

      • 您可以使用容器服务灵活安排长期运行的应用程序和批量作业。您还可以使用 API 获得最 新的集群状态信息,以便集成您自己的自定义计划程序和第三方计划程序。腾讯云容器服 务与负载均衡集成,支持在多个容器之间分配流量。您只需指定容器配置和要使用的负载 均衡器,容器服务管理程序将自动添加和删除。另外腾讯云容器服务可以自动恢复运行状 况不佳的容器,保证容器数量满足您的需求,以便为应用程序提供支持。
      • 自建容器管理平台需要根据业务流量情况和健康情况人工确定容器服务的部署,可用性和 可扩展性差
    • 安全可靠

      • 容器服务在您自己的云服务器实例中启动,不与其他客户共享计算资源。您的集群在 私有网络中运行,因此您可以使用您自己的安全组和网络 ACL,这些功能为您提供 了高隔离水平,并帮助您使用云服务器构建高度安全可靠的应用程序。容器服务采用 分布式服务架构,保证服务的故障自动恢复、快速迁移;结合有状态服务后端的分布 式存储,实现服务和数据的安全、高可用。
      • 自建容器服务因其内核问题及 Namespace 不够完善,租户、设备、内核模块隔离 性都比较差
    • 高效

      • 腾讯云容器服务运行在您的私有网络中,高品质的 BGP 网络保证镜像极速上传下载, 轻松支持海量容器秒级启动,极大程度降低了运行开销,使您的部署更加专注于业务 运行。您可以在腾讯云容器服务上部署业务,开发人员在 GitHub 或其他代码平台提 交代码后,容器服务可立即进行构建、测试、打包集成,将集成的代码部署到预发布 环境和现网环境上。
      • 自建容器服务的网络无保证,因此无法保证使用镜像创建容器的效率
    • 低成本

      • 腾讯云容器服务没有任何附加费用,您可以在容器中免费调用 API 构建您的集群管 理程序。您只需为您创建的用于存储和运行应用程序的云服务资源(例如云服务器、 云硬盘等)付费。
      • 自建容器管理平台需要投入资金构建、安装、运维、扩展自己的集群管理基础设施, 成本开销大
2.1.2 TKE总体架构

image-20211130211655203

  • 架构说明
    • 腾讯云容器服务基于原生 Kubernetes 进行适配和增加, 支持原生 Kubernetes 能力。
    • 提供了腾讯云的 Kubernetes 插件,帮助用户快速在腾讯云上构建 Kubernetes 集群。
    • 腾讯云容器服务在 Kubernetes 上层,提供了集群管理、应用管理、CI/CD 等进阶能力。
  • 模块说明
    • 容器服务控制台和云 API:用户通过控制台、Kubectl 或 API 操作集群与服务。
    • 镜像服务 CCR 模块:腾讯云提供的镜像服务模块,用户可以上传镜像,或将镜像下载到本地。
    • 容器服务 TKE 模块:容器服务核心模块,包括集群的增删改查、服务的增删改查等。
2.1.3 腾讯云 TKE 的应用场景
  • TKE的应用场景有
    • 微服务架构
    • 持续集成与交付
    • 弹性伸缩
  • TKE的应用场景:微服务架构
    • 微服务架构适用于构建复杂的应用,将您单体式应用从不同纬度拆分成多个微服务,每个微服 务的内容使用一个 docker 镜像管理。在功能不变的情况,应用拆分成了多个可管理的服务, 每个单体的服务容易理解、开发和维护。不同的微服务也可以由不同的团队来开发,开发团队 可自由选择开发技术和程序语言等,每个服务又可独立部署、独立扩展。
      • 例如 Web 应用程序可以分割成一组更简单的外部服务及多组内部服务。
    • 腾讯云容器服务部署微服务优势:
      • 简化了集群管理,无须安装、管理操作集群。
      • 无缝衔接了腾讯云的计算、网络、存储、监控、安全能力,直接使用腾讯云 IAAS 能力。
      • 支持服务编排,服务粒度管理应用,简单易懂,资源高度隔离、服务高可用
  • TKE的应用场景:持续集成与交付
    • 持续集成与持续交付提供的优秀的 DevOps 环境,可极大提高软件的发布效率。
      • 持续集成:持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试,便 于确定新代码和原有代码能否正确地打包集成在一起。
      • 持续交付:持续交付在持续集成的基础上,将集成的代码部署到预发布环境和现网环境上。
    • 优势:通过在腾讯云容器服务上部署服务,开发人员在 Git 或其他代码平台提交新代码后,可 立即进行构建、测试、打包集成。在持续集成的基础上,将集成的代码部署到预发布环境和现 网环境上。
  • TKE的应用场景:弹性伸缩
    • 腾讯云容器服务提供集群和服务两个层级的弹性伸缩能力, 能够根据业务运行情况,监控容 器的 CPU、内存、带宽等指标进行自动扩缩服务,同时可以根据容器的部署情况,在容器不够资源分配,或者有过多剩余资源的情况下自动伸缩集群。
2.2 使用云容器部署TSF应用
  • 在TSF上,使用Docker容器部署微服务,主要步骤:

    image-20211130212155625

  • 介绍了容器的基本操作以后,我们来看一下如何使用TSF部署容器应用,步骤如上图

  • 其中第五步:初始化镜像仓库,只有第一次需要,如果已经初始化过了就不需要再初始化了。

2.2.1 创建容器集群
  • 步骤 1:创建容器集群

    • 新建容器集群。集群是容器运行所需云资源的集合,包括若干台云主机等

    image-20211201180351694

  • 根据在TSF中的资源关系:集群-》命名空间-》部署组-》应用;第一步需要创建集群

2.2.2 导入云主机
  • 步骤 2:导入云主机

    • 集群中导入云主机后才能生产 Docker 容器

    • 前提条件:集群的 VPC下存在可用的云主机。

      image-20211201180657649

  • 创建集群后,会自动创建默认的命名空间,如果有需要也可以新建;

2.2.3 创建容器应用
  • 步骤 3:创建容器应用(部署方式选择容器部署)

    image-20211201180915931

  • 创建容器应用:

    • 应用名可以自己取,跟访问无关,见名知意即可
    • 部署方式一定要选容器部署(因为这里演示的是容器部署)
    • 应用类型选择普通应用(如果是Mesh应用就需要选择Mesh应用类型,此处暂时选择普通应用)
    • 备注中填写相应说明即可
  • 填完参数后,点击提交

2.2.4 创建部署组
  • 步骤 4:创建部署组

    image-20211201181132690

  • 这里选择部署组所属的集群,即前面创建的容器集群和所属的命名空间,这里我们选择default, 即默认的命名空间。

  • 点击新建部署组进行部署组的新建操作

2.2.4 容器应用部署组(续)
  • 容器部署组的操作包括:创建部署组、删除部署组、部署应用、启动应用、应用扩缩容等。
2.2.4 容器部署组访问方式(续)
  • 容器部署组的访问方式决定了部署组的网络属性,不同访问方式的部署组 可以提供不同网络能力。

  • TSF 提供三种访问方式:

    • 提供公网访问
    • 仅在集群内访问
    • NodePort 访问
  • 提供公网访问

    • 提供公网访问的部署组将提供一个可以从公网访问入口(公网负载均衡器)。创建完成的部署组可以通过 负载均衡 IP + 服务端口直接访问。

      image-20211201181508831

  • 仅在集群内访问

    image-20211201181649817

  • 提供集群内访问的服务将会提供一个可以被集群内其他服务或容器访问的入口(服务 IP),数据 库类等服务如 MySQL 可以选择集群内访问,以保证服务网络隔离。

  • 例如创建一个仅在集群内访问的 MySQL 服务,在设置服务访问方式时选择 仅在集群内访问。创 建完成后的服务可以通过 服务 IP + 服务端口 直接访问。

  • NodePort 访问

该访问方式不绑定外网负载均衡,在集群内所有主机节点自动分配 NodePort 端口, 可通过 集群内任意主机IP + NodePort 访问该服务。用户可以在部署组的详情页中查看 NodePort 信息。

2.2.4 容器部署组资源限制(续)
  • 容器部署组资源限制,包括以下两个方面:
    • 实例资源限制
    • Java 应用的最大堆内存和容器内存大小关系
  • Java 应用Java 应用的最大堆内存和容器内存大小关系
    • Java 应用通常需要设置 JVM 启动参数,包括最大堆内存(-Xmx)的设置。建议 JVM 最大堆内存和容器实例内存资源大小的关系符合以下关系:
      • JVM 最大堆内存 <= 容器内存限制 - 256M
    • 例:在部署应用的弹框中设置实例资源限制为 1024 M,启动参数中设置 -Xmx 为 768 M。
  • 实例资源限制说明:
    • 新建容器部署组时可以设置实例数量和每个实例的资源限制。实例的资源限制包括两个指标: CPU 和 内存大小。需要说明的是这里设置的都是 Limit 值,而不是 Request 的值。
    • TSF 会根据 Limit 值,自动设置容器实例的 CPU Request 和 内存 Request,两者的数量关系如 下:
      • Limit = Request * 2
      • 当 实例数量 * 资源限制数量 > 集群剩余的资源时,会提示 “资源不足,请导入节点” 的提示语。 此时用户需要去集群页面导入云服务器来扩充资源。例如实例数量为 2,实例资源限制是 CPU=0.5核,内存=1G ,而集群剩余资源为 CPU=0.8核,内存=2G 时, 由于 CPU 核数资源 不够,会提示资源不足的错误。
    • Java 应用的最大堆内存和容器内存大小关系
    • Java 应用通常需要设置 JVM 启动参数,包括最大堆内存(-Xmx)的设置。建议 JVM 最大堆内 存和容器实例内存资源大小的关系符合以下关系:
    • JVM 最大堆内存 <= 容器内存限制 - 256M
    • 例如在部署应用的弹框中设置实例资源限制为 1024 M,启动参数中设置 -Xmx 为 768 M。
2.2.5 初始化镜像仓库
  • 步骤 5:初始化镜像仓库

    image-20211201182413468

  • 此处需要填写仓库密码,注意这里的密码要记住,后面推送镜像的时候需要用到;如后面忘记密码了,可以在镜像仓库中重置仓库密码;

  • 填写密码后点击完成

2.2.6 创建镜像并推送到仓库
  • 步骤 6:创建镜像,并将镜像推送到仓库
    • ① 编写Dockerfile
1
2
3
4
5
6
7
8
9
10
FROM centos:7
RUN yum update -y && yum install -y java-1.8.0-openjdk
COPY provider-demo-0.0.1-SNAPSHOT.jar /data/tsf/
COPY run.sh /data/tsf/
# GMT+8 for CentOS
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
# run.sh
CMD ["sh", "-c", "cd /data/tsf; sh run.sh provider-demo-0.0.1-SNAPSHOT.jar
/data/tsf"]
  • 编写Dockerfile文件,内容如上图代码

  • 确保 Dockerfile、应用JAR 包、run.sh 在一个目录下。

    image-20211201182541710

  • 对于 centos 基础镜像,需要调整时区。否则,打印的调用链日志时间会有偏差。

  • 在 Dockerfile 中最后一行 CMD 命令中,执行了 run.sh 脚本。run.sh 脚本有如下作用:

    • 启动 jar 包
    • 读取通过 TSF 控制台设置的 JVM 启动参数,参考 容器部署组 的部署流程。
    • 将 stdout 数据打印到文件中,用于 TSF 控制台展示。
  • ② run.sh 脚本:

    • 支持 stdout 标准输出日志显示
    • 支持部署应用时设置 JVM 启动参数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #!/bin/bash
    default_log_path="/data/tsf_default"
    stout_log_path="/data/tsf_std/stdout/logs"
    stout_log="$stout_log_path/sys_log.log"
    echo "para1 is"$1
    echo "para2 is"$2
    echo $stout_log_path
    echo $stout_log
    mkdir -p $stout_log_path
    if [ ! -n "$2" ] ;then
    echo "you have not input logpath!"
    else
    mkdir -p $default_log_path
    cd $2
    cp $1 $default_log_path
    sleep 5
    cd $default_log_path
    fi
    java ${JAVA_OPTS} -jar $1 > $stout_log 2>&1
  • run.sh 不是必须的文件,如果用户不需要通过控制台来设置 JVM 启动参数设或者显示 stdout 日志,可以不使用 run.sh 脚本。

③ 使用 Dockerfile 创建镜像,在 Dockerfile 所在目录执行 build 命令。

1
docker build -t ccr.ccs.tencentyun.com/tsf_<账号 ID>/<应用名>:[tag] .

④ 命令执行完成后,通过 docker image ls 查看创建的镜像

image-20211201183217209

  • 使用 Dockerfile 创建镜像,在 Dockerfile 所在目录执行 build 命令。
  • docker build -t ccr.ccs.tencentyun.com/tsf_<账号 ID>/<应用名>:[tag] .
  • 其中 <账号 ID> 表示用户腾讯云的账号 ID,<应用名> 表示控制台上的应用名。tag 为镜像的 tag,用户可自定义。
  • 例如:docker build -t ccr.ccs.tencentyun.com/tsf_12345678/tsf_test_app:v1.0 .
  • 命令执行完成后,通过 docker image ls 查看创建的镜像

⑤ 登录TSF仓库(也可以在使用指引中查看个人的登录命令):

1
docker login --username=<账号ID> ccr.ccs.tencentyun.com

⑥ 将镜像推送到镜像仓库

  • ​ 推送镜像到仓库的命令格式如下(也可以使用指引中,快速获取当前应用的推送命令):

    1
    docker push ccr.ccs.tencentyun.com/tsf_<账号ID>/<应用名>:[tag]
  • 如上代码中红色字体部分的代码需要根据实际情况修改

  • 可以根据使用指引中的命令快速使用(使用指引中会根据当前账号,应用名称等自动生成完整的 命令,只需要修改tag部分)

⑦ 查看镜像仓库中的镜像

image-20211201183449730

  • 镜像推送成功后可以在TSF控制台中的镜像仓库中看到,如上图。
2.2.7 部署应用
  • 步骤 7:部署应用

    image-20211201183542788

  • 在部署组页面中,单击目标部署组右侧的【部署应用】按钮

  • 设置部署相关信息。

    • 选择镜像:选择要部署的镜像。
    • 单实例资源限制:分配给单个实例使用的 CPU 核数和内存资源上限值。
    • 实例数量:一个实例由相关的一个容器构成,可单击 + 和 - 控制实例数量。实例数和实例资 源限制的乘积不能超过集群剩余的可用资源。
    • 启动参数(选填):设置 Java 应用的启动参数。
    • 单击【提交】按钮。
  • 部署成功后就可以访问服务

  • 使用容器部署微服务官网文档: https://cloud.tencent.com/document/product/649/16697

2.3 使用云容器部署Nginx案例
  • Nginx 是一个异步框架的 Web 服务器,也可以用作反向代理、负载均衡 器和 HTTP 缓存

    • Nginx的架构如下:

      image-20211201183754362

  • Nginx在启动后,在unix系统中会以daemon的方式(能够手动关闭 nginx.conf daemon off) 在后台执行,后台进程包括一个master进程和多个worker进程。master进程主要用来管理 worker进程,包括:接收来自外界的信号,向各worker进程发送信号,监控worker进程的执行 状态。当worker进程退出后(异常情况下),会自己主动又一次启动新的worker进程。而主要的网 络事件,则是放在worker进程中来处理了。

  • 多个worker进程之间是对等的,他们同等竞争来自client的请求。各进程互相之间是独立的。一 个请求,仅仅可能在一个worker进程中处理。一个worker进程。不可能处理其它进程的请求。 worker进程的个数是能够设置的。一般我们会设置与机器cpu核数一致。这里面的原因与nginx 的进程模型以及事件处理模型是分不开的。

  • 注意:在创建 Nginx 服务之前,您必须拥有一个已经创建好的容器集群。

    • 步骤如下:

      image-20211201183849661

2.3.1 创建Ngix应用
  • 步骤 1:创建 Nginx应用

image-20211201184003167

2.3.2 推送Nginx 镜像到镜像仓库
  • 步骤 2:推送Nginx 镜像到镜像仓库

    1. 在应用列表中单击目标应用 ID/应用名 进入应用详情页。

    2. 单击【镜像】标签页。

    3. 单击【使用指引】按钮,弹出使用镜像的相关命令

    4. 在开发机上,通过 docker pull nginx 获取最新的 nginx 官方镜像。

    5. 使用 docker tag 命令给镜像打 tag:

      1
      docker tag [ImageId] ccr.ccs.tencentyun.com/tsf_<账号ID>/<应用名>:[tag]
    6. 执行 docker push 命令将镜像推送到镜像仓库:

      1
      docker push ccr.ccs.tencentyun.com/tsf_<账号ID>/<应用名>:[tag]
    7. 刷新镜像标签页,在镜像版本列表中显示出镜像信息。

      image-20211201184223114

    • 镜像推送成功后可以在应用的镜像标签页查看已经推送的镜像
2.3.3 创建部署组
  • 步骤 3:创建部署组

2.3.4 部署应用
  • 步骤 4:部署应用

    image-20211201184347868

  • 创建部署组完成后,点击应用右侧的部署应用,如上图所示;点击提交进行部署。

2.3.5 验证服务
  • 步骤 5:验证

    • ① 部署成功后,部署组的状态变为运行中

      image-20211201184428466

    • 图中红色框中的文字就是当前应用的负载均衡地址,也就是我们访问应用的地址。

    • ② 通过Nginx负载均衡器的地址,访问 Nginx 欢迎页面

      image-20211201184504875

  • 根据应用发布成功后的负载均衡地址访问应用。

  • 此处ip每次部署后可能都不一样,需要根据实际情况访问。

  • 官网文档:https://cloud.tencent.com/document/product/649/19220

思考题

  • 在TSF中,使用容器部署应用的基本步骤是怎么样?
  • 容器应用的访问方式有几种?

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!