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. 【offer收割机必备】我简历上的Java项目都好low,怎么办?

    这篇文章我们来聊一聊,在系统设计和项目经验这两块,应该如何充分的准备,才能拿出有技术含量的项目经验战胜跟你同台竞技的其他工程师,征服你的面试官,收获各种心仪的offer. (1)高级工程师必备:系统设 ...

  2. Java设计模式学习总结

    设计模式基础学习总结 这篇总结主要是基于我之前设计模式基础系列文章而形成的的.主要是把重要的知识点用自己的话说了一遍,可能会有一些错误,还望见谅和指点.谢谢 更多详细内容可以查看我的专栏文章:设计模式 ...

  3. Chapter 5 Blood Type——11

    "I just wondered… if you could warn me beforehand the next time you decide to ignore me for my ...

  4. centos7正确关机重启

    linux主要用于服务器领域,而在服务器上执行一项服务是永无止境的,除非遇到特殊情况,否则不会关机.和Windows不同,在linux系统下,很多进程是在后台执行的.在屏幕背后,可能有很多人同时在工作 ...

  5. 深耕品质,腾讯WeTest《2018中国移动游戏质量白皮书》正式发布

    本文由云+社区发表 作者:腾讯WeTest 原文链接:https://wetest.qq.com/lab/view/437.html 对于游戏行业的不少人来说,2018年是一个多事之秋. 放眼大局,游 ...

  6. 什么是DevOps?

    一. 什么是DevOps 是什么? DevOps (英文 Development 和 Operations 的组合)是一组过程.方法与系统的统称,用于促进开发(应用程序 / 软件工程).技术运营和质量 ...

  7. 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(3)- 串口功能实现(pySerial)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之串口功能实现. 串口调试助手是最核心的当然是串口数据收发与显示的功能,Jays-PyCOM借助的是 ...

  8. [转]Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例

    本文转自:https://www.cnblogs.com/zhongweiv/p/nodejs_koa2_webapp.html 目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装 ...

  9. RESTful api风格介绍

    RESTful 接口是目前来说比较流行的一种接口,平常在开发中会非常常见. 有过和后端人员对接接口的小伙伴都应该知道,我们所做的大多数操作都是对数据库的四格操作 “增删改查” 对应到我们的接口操作分别 ...

  10. Spring框架基础(上)

    spring是开源对轻量级框架 spring核心主要两部分 aop 面向切面编程,扩展功能不是修改源代码实现 aop采用横向抽取机制,取代了传统纵向继承体系重复代码(性能监视.事务管理.安全检查.缓存 ...