什么是k8s

Kubernetes 提供了一个平台或工具来帮助你快速协调或扩展容器化应用,特别是在 Docker 容器。

容器和容器化

容器是继虚拟机之后更高层次的抽象,在这层抽象中,整个应用程序的每个组件被单独打包成一个个独立的单元,这个单元就是所谓的容器。

你可以把容器看成是整个应用堆栈中的一层,每层都依赖于下层的单元。而这就类似于船舶或港口中集装箱的堆叠方式,每个容器的稳定性都依赖于下面的容器的支持。所以应用容器的核心是一个受控的执行环境。它们允许你从头开始定义整个环境,从操作系统开始,到你要使用的各个版本的库,再到你要添加的代码版本。

与容器相关的一个重要概念是微服务。将应用程序的各个组件拆分并打包成独立的服务,这样每个组件都可以很容易地被替换、升级、调试。

Docker

Docker 是最常用的容器化工具,也是最流行的容器运行工具。

k8s举例说明

假设我们有一个应用, 结果应用爆火,每天的注册用户越来越多。

现在,我们需要增加后端资源,使浏览我们网站的用户在浏览页面时加载时间不会过长或者超时。最简单的方式就是增加容器的数量,然后使用负载均衡器将传入的负载(以用户请求的形式)分配给容器。

这样做虽然行之有效,但也只能在用户规模有限的情况下使用。当用户请求达到几十万或几百万时,这种方法也是不可扩展的。你需要管理几十个也许是几百个负载均衡器,这本身就是另一个令人头疼的问题。如果我们想对网站或应用进行任何升级,也会遇到问题,因为负载均衡不会考虑到应用升级的问题。我们需要单独配置每个负载均衡器,然后升级该均衡器所服务的容器。想象一下,当你有 20 个负载均衡器和每周 5 或 6 个小的更新时,你将不得不进行大量的手工劳动。

我们需要的是一种可以一次性将变更传递给所有受控容器的方法,同时也需要一种可以轻松地调度可用容器的方法,这个过程还必须要是自动化的,这正是 Kubernetes 所做的事情。

接下来,我们将探讨 Kubernetes 究竟是如何工作的,它的各种组件和服务,以及更多关于如何使用 Kubernetes 来编排、管理和监控容器化环境。为了简单起见,假设我们使用的是 Docker 容器,尽管如前所述,Kubernetes 除了支持 Docker 之外,还支持其他几种容器平台。

Kubernetes 架构和组件

工作原则

​ Kubernetes 利用了 “期望状态” 原则。就是说,你定义了组件的期望状态,而 Kubernetes 要将它们始终调整到这个状态。

命名空间 (namespace)

​ 第一次设置启动kubernetes时,会创建一个集群,所有其他组件都是集群的一部分,可以创建多个集群,叫命名空间.和在一批物理机器上创建的集群类似.没有明确定义的命名空间,那么你的集群将在始终存在的默认命名空间中创建。

节点 (node)

​ 节点是集群中的单个机器。如果你有自己的硬件,节点可能对应于物理机器,但更可能对应于在云中运行的虚拟机。节点是部署你的应用或服务的地方,是 Kubernetes 工作的地方。

  • master 节点

    主节点是一个控制其他所有节点的特殊节点。

    一方面,它和集群中的任何其他节点一样,这意味着它只是另一台机器或虚拟机。另一方面,它运行着控制集群其他部分的软件。它向集群中的所有其他节点发送消息,将工作分配给它们,工作节点向主节点上的 API Server 汇报。

  • worker 节点

    Woker 节点是 Kubernetes 中真正干活的节点。当你在应用中部署容器或 pod(稍后定义)时,其实是在将它们部署到 worker 节点上运行。Worker 节点托管和运行一个或多个容器的资源。

pod

Kubernetes 中的逻辑而非物理的工作单位称为 pod。一个 pod 类似于 Docker 中的容器。

一个 pod 允许你把多个容器,并指定它们如何组合在一起来创建应用程序。

一个 Kubernetes pod 通常包含一个或多个 Docker 容器,所有的容器都作为一个单元来管理。

service

service 是一组逻辑上的 pod。把一个 service 看成是一个 pod 的逻辑分组,它提供了一个单一的 IP 地址和 DNS 名称,你可以通过它访问服务内的所有 pod。

ReplicationController 或 ReplicaSet

ReplicationController 或 ReplicaSet 是 Kubernetes 的另一个关键功能。它是负责实际管理 pod 生命周期的组件 —— 当收到指令时或 pod 离线或意外停止时启动 pod,也会在收到指示时杀死 pod,也许是因为用户负载减少。所以换句话说,ReplicationController 有助于实现我们所期望的指定运行的 pod 数量的状态。

Kubectl

kubectl 是一个命令行工具,用于与 Kubernetes 集群和其中的 pod 通信。使用它你可以查看集群的状态,列出集群中的所有 pod,进入 pod 中执行命令等。你还可以使用 YAML 文件定义资源对象,然后使用 kubectl 将其应用到集群中。

Kubernetes 中的自动扩展

请记住,我们使用 Kubernetes 而不是直接使用 Docker 的原因之一,是因为 Kubernetes 能够自动扩展应用实例的数量以满足工作负载的需求。

kubernetes Ingress 和 Egress

外部用户或应用程序与 Kubernetes pod 交互,就像 pod 是一个真正的服务器一样。我们需要设置安全规则允许哪些流量可以进入和离开 “服务器”,就像我们为托管应用程序的服务器定义安全规则一样。

进入 Kubernetes pod 的流量称为 Ingress,而从 pod 到集群外的出站流量称为 egress。我们创建入口策略和出口策略的目的是限制不需要的流量进入和流出服务。而这些策略也是定义 pod 使用的端口来接受传入和传输传出数据 / 流量的地方。

Ingress Controller

但是在定义入口和出口策略之前,你必须首先启动被称为 Ingress Controller(入口控制器)的组件;这个在集群中默认不启动。有不同类型的入口控制器,Kubernetes 项目默认只支持 Google Cloud 和开箱即用的 Nginx 入口控制器。通常云供应商都会提供自己的入口控制器。

Replica 和 ReplicaSet

为了保证应用程序的弹性,需要在不同节点上创建多个 pod 的副本。这些被称为 Replica。假设你所需的状态策略是 “让名为 webserver-1 的 pod 始终维持在 3 个副本”,这意味着 ReplicationController 或 ReplicaSet 将监控活动副本的数量,如果其中有任何一个 replica 因任何原因不可用(例如节点的故障),那么 Deployment Controller 将自动创建一个新的系统(定义如下)。

所需状态是在 deployment 中定义的。 Master 节点的中有一个子系统叫做 Deployment Controller,负责实际执行并使当前状态不断趋向于所需状态。

因此,举例来说,如果你目前有 2 个 pod 的副本,而你所希望的状态应该有 3 个,那么 Replication Controller 或 ReplicaSet 会自动检测到这个要求,并指示 Deployment Controller 根据预定义的设置部署一个新的 pod。

Logo

开源、云原生的融合云平台

更多推荐