现如今,Kubernetes已经完全改变了软件开发方式。Kubernetes作为一个管理容器化工作负载及服务的开源平台,其拥有可移植、可扩展的特性,并促进了声明式配置和自动化,同时它还证明了自己是管理复杂微服务的主要参与者。而Kubernetes之所以能够在业界被广泛采用,究其原因是Kubernetes迎合了以下需求:

  • 企业想要在不断地增长的同时维持低成本

  • DevOps想要一个可以大规模运行应用程序的稳定平台

  • 开发人员希望有一个可靠并且可复制的流程来编写、测试和debug代码

但是,你是否考虑过如何在使用实际需要的资源的同时获得强大的容器编排平台?最佳资源利用的关键是知道需要扩展什么应用程序以及何时需要扩展应用程序。因此,在本文中,我们将讨论和学习如何扩展Kubernetes容器,并且我们将特别关注两类服务:kubectl和Horizontal Pod Autoscaler(HPA)。

kubectl

在绝大部分情况下和Kubernetes交互是通过一个名为kubectl的命令行工具。kubectl主要用于和Kubernetes API进行通信来创建、更新以及删除在Kubernetes内的工作负载。在下文中,我们将提供一些常见的命令,你可以利用它们开始管理Kubernetes。

大部分常见的kubectl命令都提供了要执行的特定操作或动作,比如创建、删除等。这一方法通常涉及解释描述Kubernetes中的对象(pod、服务、资源等)的文件(YAML或JSON)。这些文件可用于模板以及环境中的持续文件,并且帮助保持Kubernetes对声明式配置的关注。命令行所指定的操作将会传递到API Server,然后根据需要与Kubernetes中的后端服务进行通信。下方的表格可以帮助你安装kubectl:

请注意:随着新版本的发布,适用于Windows的kubectl的最佳版本会有所变化。想要找到目前最合适的二进制文件,请访问以下网址:

https://storage.googleapis.com/kubernetes-release/release/stable.txt

并根据需要调整上述URL。

kubectl 句法

kubectl句法如下:

kubectl [command] [TYPE] [NAME] [flags]
  • Command:指你想要执行的动作(创建、删除等)

  • Type:指你要针对其执行命令的资源类型(Pod、Service等)

  • Name:资源对象的名称(区分大小写),如果你不指定一个名称,它会获取所有与你命令匹配的资源信息。

  • Flags:这部分在句法中不是必要的,但是当需要查找指定资源时,十分有用。例如,-namespace可以让你指定一个特定的命名空间,以在其中执行操作。

kubectl操作

以下示例可以帮助你熟悉运行常用的kubectl操作:


kubectl apply - Apply or Update a resource from a file or stdin. # Create a service using the definition in example-service.yaml. kubectl apply -f example-service.yaml kubectl get - List one or more resources. # List all pods in plain-text output format. kubectl get pods # List all pods in plain-text output format and include additional information (such as node name). kubectl describe - Display detailed state of one or more resources, including the uninitialized ones by default. # Display the details of the node with name <node-name>. kubectl describe nodes <node-name> kubectl delete - Delete resources either from a file, stdin, or specifying label selectors, names, resource selectors, or resources. # Delete a pod using the type and name specified in the pod.yaml file. kubectl delete -f pod.yaml # Delete all the pods and services that have the label name=<label-name>. kubectl delete pods,services -l name=<label-name> kubectl logs - Print the logs for a container in a pod. # Return a snapshot of the logs from pod <pod-name>. kubectl logs <pod-name> # Start streaming the logs from pod <pod-name>. This is similar to the 'tail -f' Linux command. kubectl logs -f <pod-name>

以上都是kubectl中常用的操作,如果你想了解更多,可以查阅kubectl的官方指南。此外,我们在往期的文章中也有介绍:

你一定会用到的7条kubectl命令

使用Kubectl管理Kubernetes的全解教程

Horizontal Pod Autoscaler(HPA)

Pod水平自动伸缩(HPA)是Kubernetes的一个重要功能,它可以让你配置集群以自动伸缩正在运行的服务。HPA实现为一种Kubernetes API资源和controller。资源决定controller的行为,controller会定期调整replication controller或部署中的副本数量,使观察到的平均CPU利用率与用户指定的目标相匹配。

同时,HPA实现为控制回路,其周期由controller manager的–horizontal-pod-autoscaler-sync-period标志控制(默认值为30秒)。

在每个周期期间,controller manager 会根据每个HPA定义中指定的指标来查询资源利用率。Controller manager会从资源指标API(针对per-pod资源指标)或自定义指标API(针对所有其他指标)中获得指标。

  • 针对per-pod资源指标(如CPU),controller会从资源指标API中为HPA定位的每个Pod获取指标。然后,如果设置了目标利用率值,则controller将会把利用率值计算为每个pod中容器的同等资源请求的百分比。如果设置了目标原始值,则直接使用原始指标值。然后,controller将所有目标pod的利用率或原始值(取决于指定的目标类型)取平均值,并产生一个用于伸缩所需副本数量的比率。

  • 针对per-pod自定义指标,controller的功能类似于per-pod资源指标,但它适用于原始值,而非利用率值。

  • 对于对象指标,将会获取单个指标(该指标描述了所讨论的对象),并将其与目标值进行比较,以产生用于伸缩所需副本数量的比率。

HPA controller将会通过两种不同的方式获取指标:direct Heapster access和REST client access。当使用direct Heapster access时,HPA将会通过API server的服务代理子资源直接查询Heapster。请注意,Heapster需要部署在集群上并在kube-system命名空间中运行。

HPA的工作流程包含以下四个步骤,如图所示:

  1. 在设置默认30秒间隔期间,HPA会持续检查你所配置的指标值

  2. 如果达到指定阈值,则HPA尝试增加pod的数量

  3. HPA主要更新在部署中或replication controller中的副本数量

  4. 然后,部署/replication controller将会添加任何额外所需的pod

当你推出HPA时请考虑以下因素:

  • 默认的HPA检查间隔是30秒,这个默认值可以通过controller manager的— horizontal-pod-autoscaler-sync-period标志进行配置。

  • 默认的HPA相关指标容差为10%。

  • 在上一次扩展事件之后,HPA将会等待3分钟,以使指标稳定下来。这一等待事件同样可以通过— horizontal-pod-autoscaler-upscale-delay标志进行配置。

  • 从上一次缩小事件开始,HPA将会等待5分钟,以避免autoscaler抖动。同样可以通过— horizontal-pod-autoscaler-downscale-delay标志进行配置。

  • 与replication controller相比,HPA最适合与部署对象或Pod指标配合使用,不适用于使用直接操作的replication controller的滚动更新。当你进行部署时,需要根据部署对象来管理底层副本集的大小。

  • 当HPA与自定义指标(如Pod指标或对象指标)一起使用时,你需要决定何时进行伸缩。由于Kubernetes支持多种指标,因此你可以同时使用多种指标来决定伸缩的时间。请注意,Kubernetes会依照次序来考虑每个指标。更多示例请查阅:

    https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale

结 论

在本文中,我们讨论了两种扩展Kubernetes应用程序的主要工具,两者都是所有Kubernetes服务的关键组件。我们看到了如何安装并且使用不同的功能,如应用、获取、删除、描述以及kubectl的日志等。同时,我们回顾并了解有关Horizontal Pod Autoscaler的信息,例如它是如何工作的以及它对任意Kubernetes服务的重要性。在扩展微服务应用程序时,kubectl和HPA都是Kubernetes的重要功能。

在上个月发布的Rancher 2.3中,已经集成了HPA功能,可以在Rancher中通过UI使用。目前,Rancher 2.3也已经stable,如果想要更全面地了解Rancher 2.3关注我们下周三晚上的Rancher K8S云课堂吧!

欢迎添加微信助手(rancher2),进官方技术群,了解更多Kubernetes使用攻略

零基础攻略!如何使用kubectl和HPA扩展Kubernetes应用程序的更多相关文章

  1. 01 | VIM基础攻略

    启动 vim 后,vim 处于 normal 模式. Step One: "i" -> insert 模式, ESC -> normal 模式: "x&quo ...

  2. 巨蟒python全栈开发数据库攻略1:基础攻略

    1.什么是数据库? 2.数据库分类 3.数据库简单介绍 4.安装数据库 5.修改root密码 6.修改字符集 7.sql介绍 8.简单sql操作

  3. 巨蟒python全栈开发数据库攻略2:基础攻略2

    1.存储引擎表类型 2.整数类型和sql_mode 3.浮点类&字符串类型&日期类型&集合类型&枚举类型 4.数值类型补充 5.完整性约束

  4. 2019阿里云开年Hi购季基础云产品分会场全攻略!

    2019阿里云云上Hi购季活动已经于2月25日正式开启,从已开放的活动页面来看,活动分为三个阶段: 2月25日-3月04日的活动报名阶段.3月04日-3月16日的新购满返+5折抢购阶段.3月16日-3 ...

  5. JQuery攻略(一) 基础知识——选择器 与 DOM

    JQuery是功能丰富的Javascript库,可以帮助用户毫不费力地把动态功能应用到网页. JQuery具有许多强大的功能,包括访问部分网页,快速修改网页内容,添加动画,应用AJAX技术等等. 正因 ...

  6. 用C#制作PDF文件全攻略

    用C#制作PDF文件全攻略 目  录 前    言... 3 第一部分 iText的简单应用... 4 第一章 创建一个Document 4 第一步 创建一个Document实例:... 5 第二步 ...

  7. JAVA EE企业级开发四步走完全攻略 [转]

    http://bbs.51cto.com/thread-550558-1.html 本文是J2EE企业级开发四步走完全攻略索引,因内容比较广泛,涉及整个JAVA EE开发相关知识,这是一个长期的计划, ...

  8. IOS面试攻略

    IOS面试攻略(1.0) 2013-10-13 20:58:09|  分类: IOS面试 |  标签:ios知识点总汇  ios面试  |举报|字号 订阅     来自:伊甸网 @ 看到这个关键字,我 ...

  9. 零基础照样做RNA-seq差异分析

    零基础照样做RNA-seq差异分析 GCBI知识库2018-08-24 14:43:36 基因表达谱的差异分析是RNA-seq中最常见的应用.你眼中的RNA-seq差异分析或许是酱紫的,对不会编程,不 ...

随机推荐

  1. webpack原理

    webpack早就已经在前端领域大放异彩,会使用和优化webpack也已经是中.高级工程师必备技能,在此基础之上再对webpack的原理进行理解和掌握,必定会在未来的开发中事半功倍.若是对于webpa ...

  2. C++常用库函数(1)

    Hello,疯狂的杰克由于大家见面了哦! 今天,给大家介绍一篇很有内涵的文章:C++常用库函数 1.缓冲区操作函数 函数名:memchr 函数原型:void  *memchr(const void * ...

  3. 我的mongoDb之旅(二)

    题序:上一回,咱们简单的操作了一些增减改查的操作,这一次,再来进行一场奇妙之旅 一.案例讲解 (1).字段有值与没值时的单条数据 第一条数据title这个字段(mysql用久了,习惯这么叫了)是没有数 ...

  4. 移动端的<meta>标签

    <head> <meta charset="UTF-8" /> <!-- 页面关键词 --> <meta name="keywo ...

  5. C# 常见面试问题汇总

    1.c#垃圾回收机制 从以下方面入手展开:  1.压缩合并算法   2.代的机制  3.GC调用终结器 Garbage Collector . NET采用了和Java类似的方法由CLR(Common ...

  6. .net cookie跨域请求指定请求域名

    HttpCookie cookie = new HttpCookie("OrderApiCookie"); //初使化并设置Cookie的名称 cookie.HttpOnly = ...

  7. Anrlr4 生成C++版本的语法解析器

    一. 写在前面 我最早是在2005年,首次在实际开发中实现语法解析器,当时调研了Yacc&Lex,觉得风格不是太好,关键当时yacc对多线程也支持的不太好,接着就又学习了Bison&F ...

  8. 支撑微博亿级社交平台,小白也能玩转Redis集群(原理篇)

    Redis作为一款性能优异的内存数据库,支撑着微博亿级社交平台,也成为很多互联网公司的标配.这里将以Redis Cluster集群为核心,基于最新的Redis5版本,从原理再到实战,玩转Redis集群 ...

  9. 马蜂窝 IM 移动端架构的从 0 到 1

    (马蜂窝技术原创内容,公众号 ID:mfwtech) 移动互联网技术改变了旅游的世界,这个领域过去沉重的信息分销成本被大大降低.用户与服务供应商之间.用户与用户之间的沟通路径逐渐打通,沟通的场景也在不 ...

  10. Spring Boot入门(一):搭建Spring Boot项目

    从本篇博客开始,我们开始进入Spring Boot的世界,它的出现使Spring的开发变得更加简洁,因此一经推出受到众多程序员的喜爱. 作为Spring Boot系列的第一篇博客,我们先来讲解下如何搭 ...