加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

为什么说Kubernetes是新的应用服务器?

发布时间:2018-12-29 20:21:35 所属栏目:外闻 来源:高效开发运维
导读:你是否想过我们为什么要使用容器部署多平台应用呢?难道这仅仅是跟风吗?在本文中,我将提出一些有挑战性的问题,以佐证我的观点,那就是为什么说 Kubernetes 是新的应用服务器。 你可能已经注意到了,大多数的语言都是要经过解释(interpret)的,并且使用运
副标题[/!--empirenews.page--]

你是否想过我们为什么要使用容器部署多平台应用呢?难道这仅仅是“跟风”吗?在本文中,我将提出一些有挑战性的问题,以佐证我的观点,那就是为什么说 Kubernetes 是新的应用服务器。

你可能已经注意到了,大多数的语言都是要经过“解释(interpret)”的,并且使用“运行时”来执行源码。在理论上,大多数的 Node.js、Python 和 Ruby 代码可以很容易地从一个平台(Windows、Mac、Linux)转换到另一个平台。Java 应用则更进一步,它将编译后的 Java 类转换成了字节码,能够在任何具有 JVM(Java 虚拟机)的地方运行。

为什么说Kubernetes是新的应用服务器?

Java 生态系统提供了标准的格式来分发同一个应用中的所有 Java 类。我们可以将这些类打包为 JAR(Java Archive)、WAR(Web Archive)以及 EAR(Enterprise Archive),在这些格式中包含了前端、后端以及嵌入其中的库。那么我就要问了:你为什么要使用容器来分发 Java 应用呢?难道它不是已经支持很便利地在不同环境间迁移了吗?

站在开发人员的角度回答这个问题的话,答案可能并不那么明显。但是,我们考虑一下你的开发环境,以及因为开发环境和生产环境的差异可能导致的问题:

  • 你使用 Mac、Windows 还是 Linux?在路径分隔符方面有没有遇到过和/相关的问题?
  • 你使用什么版本的 JDK?是否在开发环境使用 Java 10,而在生产环境使用 JRE 8?你有没有遇到过 JVM 差异所引入的 bug?
  • 你使用什么版本的应用服务器?生产环境是否使用相同的配置、安全补丁和相同版本的库?
  • 在生产部署的时候,是否遇到过不同版本的驱动或数据库服务器所导致的 JDBC 驱动问题,而这些问题在开发环境可能并不存在?
  • 你是否请求过应用服务器管理员为你创建数据源或 JMS 队列,但是在创建的过程中却出现了拼写错误?

所有的这些问题都是由应用之外的因素导致的,容器最大的好处之一就是它能够在一个预先构建的容器中部署所有的内容(比如 Linux 发行版、JVM、应用服务器、库、配置,最后还有你的应用)。另外,在一个容器中将所有的东西都包含进来能够更容易地将你的代码转移到生产环境中,在它无法正常运行的时候,也更容易分析其中的差异。因为它易于执行,所以也很容易将相同的容器镜像扩展至多个副本。

强化应用

在容器流行起来之前,应用服务器提供了一些非功能性需求(NFR,non-functional requirement),比如安全性、隔离性、容错、配置管理等等。打个比方,应用服务器和应用之间的关系就像 CD 播放器和 CD 之间的关系一样。

作为开发人员,你应该遵循预定义的标准并按照特定的格式分发应用,而应用服务器会“执行”你的应用并带来一些额外的功能,这些功能因服务器“品牌”的差异而有所不同。

与 CD 播放器的类比方式相似,随着容器的流行,容器镜像成为了新的 CD 格式。实际上,容器镜像仅仅是用来分发容器的格式。

容器的真正收益在你需要为应用添加企业级功能时才体现出来。为容器化的应用提供这些功能的最佳方式就是使用 Kubernetes 作为它们的平台。另外,Kubernetes 平台还为其他项目提供了很棒的基础实施,这些项目包括 Red Hat OpenShift、Istio 以及 Apache OpenWhisk,基于这些基础设施能够更容易的构建和部署健壮的生产级质量的应用。

接下来,我们探讨九个这样的功能:

为什么说Kubernetes是新的应用服务器?

1. 服务发现

服务发现指的是确定如何连接服务的过程。要获得容器以及云原生应用的很多收益,我们需要将配置从容器镜像中移除出去,这样的话,我们就能把相同的容器镜像应用到所有的环境中。将配置提取到应用外部是 12 要素应用的核心原则之一。服务发现是从运行时环境中获取配置信息的方式之一,这样能够避免将其硬编码到应用之中。Kubernetes 自带了服务发现。Kubernetes 还提供了 ConfigMaps 和 [Secrets] (https://kubernetes.io/docs/concepts/configuration/secret/) 用来将配置从应用容器中移除。在运行时环境中,如果要连接数据库这样的服务,我们会存储凭证信息,Secrets 解决了一些这方面所面临的挑战。借助 Kubernetes,我们无需使用外部的服务器或框架。

2. 基本调用

容器中的应用可以通过 Ingress 进行访问,也就是从外部世界路由到你所暴露的服务。OpenShift 提供了基于 HAProxy 的 route objects,它具有各项功能和负载均衡策略。你可以使用路由功能进行轮流部署。这可以作为一些非常复杂的 CI/CD 策略的基础。参见下文的“6. 构建和部署管道”。

如果你想运行一次性的任务,比如一个批处理或者只是使用集群来计算一个结果(比如计算 Pi 的位数),那该怎么办呢?针对这种场景,Kubernetes 提供了 job objects。同时还有一个 cron job,能够管理基于时间的任务。

3. 弹性

在 Kubernetes 中,弹性(elasticity)是通过 ReplicaSets(它过去被称为 Replication Controllers)解决的。与面向 Kubernetes 的大多数配置类似,ReplicaSet 是一种协调所需状态的方式:你告诉 Kubernetes,系统应该处于各种状态,Kubernetes 就能知道如何达到该状态。在任意时间,ReplicaSet 都能控制副本的数量或应用程序精确的实例数量。

但是,如果你所构建的服务受欢迎程度超出了预先的规划,计算资源耗尽了该怎么办呢?你可以借助 Kubernetes Horizontal Pod Autoscaler,它会基于观测到的 CPU 利用率(或所支持的自定义指标,以及应用提供的指标)扩展 pod 的数量。

4. 日志

因为 Kubernetes 集群能够运行容器化应用的多个副本,所以将这些日志聚合起来,以便于在同一个地方进行查看就变得非常重要了。同时,为了利用自动扩展(以及其他云原生应用的功能)所带来的收益,容器应该是不可变的。所以,我们应该将日志存储在容器之外,这样它们才能跨运行时持久化。OpenShift 允许我们部署 EFK 技术栈来聚合来自主机和应用的日志,即便这些日志来自多个容器甚至已删除的 pod 均是可以的。

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读