1、入门概述

本文以在容器云上部署一个nexus3应用为例,通过通过一步步的操作,帮助用户快速的对Kubernetes有一个快速和整体的认识。通过快速入门,可以提供如下知识内容:

  • 在集群中部署一个容器的应用
  • 对部署的应用进行弹性伸缩
  • 使用新版本的软件更新容器化应用
  • 对容器话应用进行Debug
在开始之前,应该具备如下的必要条件:
  • 具备kubernetes的运行环境;
  • 已安装kubectl。

2、步骤1:部署应用

在Kubernetes集群中,底层的计算能力由各个Node节点提供,这些Node节点即可以是物理机、也可以是虚拟机和云主机。节点分为两类,即主节点(Master Node)和从节点(Woker Node),通过部署可以将容器化的应用部署在Kubernetes集群中。

在Kubernetes中,通过Kubectl使用Kubernetes API和集群进行交互,开发者使用Kubectl(Kubernetes命令行界面)创建和管理部署。在创建部署的步骤,将会学习一些创建Deployment的Kubectl命令,通过执行这些命令,将能在Kubernets集群中部署和运行应用。创建部署,需要为应用指定所使用的容器镜像,以及应用的副本数量。后续,可以通过更新部署来修改相关的信息;在后续的步骤中,也将会讨论如何进行伸缩和升级部署。当然,这里的应用需要提前被打包成支持的容器格式,这样才能够在Kubernetes中进行部署运行,这里以部署nexus3应用作为例子。

1)部署应用

使用sonatype/nexues3:3.9.0镜像创建一个名称为my-nexus3的部署:

$ kubectl create deployment my-nexus3 --image=sonatype/nexus3:3.9.0

2)查看集群中存在的部署

在部署完成后,可以通过如下命令获取在kubernetes中的部署,通过AVAILABLE字段可以可以确认部署是否已经准备就绪:

$ kubectl get deployments

3、步骤2:获取应用的Pod信息

在Kubernetes中,容器通过Pod进行组织管理,在一个Pod中可以管理多个容器和存储卷,每个Pod都有自己在集群中唯一的IP地址。

通过kubectl get pods获取集群中的Pods。

1)获取集群中的pod

通过执行kubect get pods命令获取集群中的Pod:

$ kubectl get pods

2)获取Pod的详细信息

通过kubectl describe pod命令可以获取Pod的详细信息,但Pod没有正常启动时,可以通过查看Pod的详细信息获取初步的解决方案:

$ kubectl describe pods/my-nexus3-57c474fcfd-8nfx4

3)获取容器的日志信息
另外,开发或运维人员可能需要通过日志获取应用的运行情况,以处理可能存在问题。获取应用运行日志的信息,通过执行kubectl logs命令:
$ kubectl logs my-nexus3-57c474fcfd-8nfx4

3、步骤3:对外暴露应用

在Kubernetes中,服务是Pod的逻辑集合,以及访问这些Pod的策略。与其它Kubernetes对象一样,服务使用YAML文件或JSON进行定义。服务是通过标签选择器来确定使用哪些Pod的,虽然每个Pod都有一个唯一的IP地址,但这些IP地址只在集群内部可用,并不对外暴露。Pod需要通过服务对外暴露,服务支持以下四种对外暴露的类型:

  • ClusterIP (default) – 将服务暴露在集群内部的IP,此类型仅支持在集群内访问服务。
  • NodePort – 将服务暴露在所选定的每一个Node的同一个端口,集群外可以通过<NodeIP>:<NodePort>方式访问服务。
  • LoadBalancer – 在当前的集群中创建一个外部的负载均衡,并为服务(service)指派一个固定的、外部的IP地址。
  • ExternalName – 使用一个随意的名称(在规格中指定)来暴露服务,并会返回一个带有名称的CNAME记录。此类型不使用代理,这种类型只在kube-dns v1.7上才支持。

另外,这里的示例没有在规格中定义选择器,对于这种没有定义选择器的服务,也就没有相应的端口对象。这就允许通过手工方式将服务映射到指定的端口。另外,如果使用的暴露类型为ExternalName的话,也不需要选择器。

此处通过NodePort类型将my-nexus3部署对外进行暴露,暴露部署服务的命令如下:

$ kubectl expose deployments/my-nexus3 --name=nexus3 --type="NodePort" --port=8081

通过执行上述命令,Kubernetes将以nexus3的名称对外暴露服务。然后,可以通过kubectl describe services的命令查询服务的相关信息。

$ kubectl describe services/nexus3

从执行命令的输出结果可以看出,在每个node上暴露了一个30770端口。在浏览器的地址中访问:http://<nodeip>:30770,将进入nexus的页面:

4、步骤4:扩缩容应用

根据应用的访问情况,可以对部署进行扩缩容,以提升用户体验和有效利用资源。通过扩容部署,将能够创建新的Pod,以及根据可用的资源情况,将新的Pod调度到合适Node中。通过缩容,将可以需要减少Pod的数量,释放资源供其他应用使用。同时,Kubernetes也支持Pod的自动伸缩。如果运行应用的有多个实例,则需要提供一个进行负载分流的途径。服务集成了负载均衡,能够将网络的流量分流到所部署的各个Pod中。服务将使用端口持续的监控正在运行的Pod,以确保流量会被送到可用的Pod。扩缩容通过修改部署的副本来实现。

下图是扩容前部署、服务和Pod之间的关系,在集群中有一个部署,部署包含一个Pod,并通过服务进行了对外暴露。

扩容前部署、服务和Pod的关系

下图是扩容后的部署、服务和Pod的关系。在原来的基础上,在两个新的Node中扩容了3个Pod,并重新通过服务进行了对外暴露。

扩容后部署、服务和Pod的关系

1)进行扩容

根据场景需要,通过kubectl scale deployment命令将Pod的扩容到4个。

$ kubectl scale deployments my-nexus3 --replicas=4

2)查看扩容后的Pod

在扩容后,通过kubectl get pods能够查看扩容后的Pod数量。

$ kubectl get pods -o wide

3)将扩容后的Pod通过服务进行对外暴露

接下来,使用kubectl expose来创建名为nexus-lb一个服务来暴露扩展后的部署。

$ kubectl expose deployments/my-nexus3 --name=nexus-lb --type="NodePort" --port=8081

4)查看暴露的nodeport

$ kubectl get services/nexus-lb

其中:NodePort:31400

5)访问应用

在应用通过服务暴露后,可以在浏览器中通过http://<nodeip>:<nodeport>的方式访问应用。

5、步骤5:升级应用

从用户的角度,希望应用在任何时间都高可用的。从开发者的角度,需要在部署新版本的应用时,不影响用户的体验。在Kubernetes中,通过滚动升级来实现前述两类用户的期望,滚动升级通过增量式的升级Pod实例,从而实现在不影响用户体验的情况下,对应用进行升级应用。根据资源的可用性,新的Pod会被调度到合适的Node上。

步骤4通过扩容应用运行多个实例,这是不影响应用可用性升级模式的前提。升级时,通过设置数量和百分比来控制可用的Pod数量。在Kubernetes中,升级是有版本的,因此部署升级后,能回滚到之前的版本。与应用扩容相似,如果部署通过服务被暴露,在升级过程中,服务将会通过负载均衡会将流量分流到各个可以的Pod中。一个可用的Pod就是一个可用的应用实例。

滚动升级实现如下的行为:

  • 通过容器镜像的升级,逐步升级环境中的应用
  • 回滚至之前的版本
  • 零宕机的持续集成和持续交付
在升级前,集群中存在4个Pod。

图 升级前

升级开始后,Kubernetes先升级其中一个Pod,其它Pod继续对外提供服务。

图 升级第1个Node中的Pod

在第一个Pod升级后,Kubernetes将进行第二个Pod的升级,已升级的和未升级的应用会正常对外提供服务。

图 升级第2个容器中的Pod

然后,Kubernetes升级接下来的应用,在在所有的Pod都完成升级后,整个升级过程才正式完成。

图 升级第3个容器中的Pod

1)使用kubectl set image命令更新应用镜像版本

当应用发布新版本后,可以

$ kubectl set image deployments/my-nexus3 *=sonatype/nexus3:latest
2)回滚升级到之前的版本
当部署的版本存在问题时,可以通过执行kubectl rollout unduo回滚至之前的版本:
$ kubectl rollout undo deployments/my-nexus3

3)查看部署的回滚状态

回滚状态,可以通过rollout status确认。通过执行kubectl rollout stauts可以查看升级和回归的状态信息:

$ kubectl rollout status deployments/my-nexus3

参考资料

  1. 《kubectl commands》地址:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands
  2. 《Kubernetes Basics》地址:https://kubernetes.io/docs/tutorials/kubernetes-basics/

作者简介:
季向远,北京神舟航天软件技术有限公司产品经理。本文版权归原作者所有。

kunbernetes-快速入门的更多相关文章

  1. Web Api 入门实战 (快速入门+工具使用+不依赖IIS)

    平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html 屁话我也就不多说了,什么简介的也省了,直接简单概括+demo ...

  2. SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)

     SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...

  3. 前端开发小白必学技能—非关系数据库又像关系数据库的MongoDB快速入门命令(2)

    今天给大家道个歉,没有及时更新MongoDB快速入门的下篇,最近有点小忙,在此向博友们致歉.下面我将简单地说一下mongdb的一些基本命令以及我们日常开发过程中的一些问题.mongodb可以为我们提供 ...

  4. 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  5. 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  6. Mybatis框架 的快速入门

    MyBatis 简介 什么是 MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果 ...

  7. grunt快速入门

    快速入门 Grunt和 Grunt 插件是通过 npm 安装并管理的,npm是 Node.js 的包管理器. Grunt 0.4.x 必须配合Node.js >= 0.8.0版本使用.:奇数版本 ...

  8. 【第一篇】ASP.NET MVC快速入门之数据库操作(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  9. 【第四篇】ASP.NET MVC快速入门之完整示例(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  10. Vue.js 快速入门

    什么是Vue.js vue是法语中视图的意思,Vue.js是一个轻巧.高性能.可组件化的MVVM库,同时拥有非常容易上手的API.作者是尤雨溪,写下这篇文章时vue.js版本为1.0.7 准备 我推荐 ...

随机推荐

  1. Python爬虫入门教程 22-100 CSDN学院课程数据抓取

    1. CSDN学院课程数据-写在前面 今天又要抓取一个网站了,选择恐惧症使得我不知道该拿谁下手,找来找去,算了,还是抓取CSDN学院吧,CSDN学院的网站为 https://edu.csdn.net/ ...

  2. Spring 中 SQL 的存储过程

    SimpleJdbcCall 类可以被用于调用一个包含 IN 和 OUT 参数的存储过程.你可以在处理任何一个 RDBMS 时使用这个方法,就像 Apache Derby, DB2, MySQL, M ...

  3. Numpy 基础学习

    numpy.array() 功能:创建一个数据 vector = numpy.array([1,2,3,4]) matrix = numpy.array([1,2,3,4],[11,12,13,14] ...

  4. Jenkins结合.net平台之Web项目编译

    前面我们讲解了如何使用msbuild.exe编译一个.net程序.示例中我们讲解的是编译控制台项目,但是我们知道web项目不仅需要编译类的嵌入的资源文件,还要拷贝诸如css,html,js,图片等资源 ...

  5. iframe跨域通信实战

    "长时间不写文章,开头的方式总是那么出奇的相似",最近很忙,好久没写博客了啊(是不是?). 更换工作已经有三个月有余,这段三个月把过去三年没加过的班都加了一次.收获挺多,发现的问题 ...

  6. MySQLSource-Flume

    1. 自定义Source说明 实时监控MySQL,从MySQL中获取数据传输到HDFS或者其他存储框架,所以此时需要我们自己实现MySQLSource. 2. 自定义MySQLSource步骤 根据官 ...

  7. c语言之gdb调试。

    1.此文档演示如何使用gdb调试c语言代码. 代码如下: #include <stdio.h> /*函数声明*/ void digui(int n); int main() { ; dig ...

  8. [转]gitlab cicd (二)系列之安装git-runner rpm安装方式

    本文转自:https://blog.csdn.net/qq_21816375/article/details/84308748 本编是继gitlab cicd (一)系列之安装gitlb之后,基于安装 ...

  9. mysql服务器主从数据库同步配置

    首先需要在同一个局域网内的两台机器(当然也可以用一台机器虚拟两台机器出来),都安装上mysql服务. 主机A: 192.168.1.100 从机B: 192.168.1.101 可以有多台从机. 1. ...

  10. Android Stuido xml使用app属性没有提示代码

    解决方法: 打开file->invalidate Caches,之后build->rebuild project 2.重启Android Studio