原创

Kubernetes简介

温馨提示:
本文最后更新于 2022年11月16日,已超过 20 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

1.概述

在本教程中,我们将简要介绍Kubernetes的理论。特别是,我们将讨论以下主题:

  • 需要容器编排工具
  • Kubernetes的特点
  • Kubernetes架构
  • Kubernet API

为了更深入的了解,我们还可以查看正式文件.

2.容器编排

在这个 上一篇文章,我们已经讨论了一些Docker基础知识,以及如何打包和部署自定义应用程序。

简而言之,Docker是一个容器运行时:它提供了以标准化方式打包、运送和运行应用程序的单个实例的功能,也称为容器。

然而,随着复杂性的增加,出现了新的需求;自动化部署、容器编排、调度应用程序、授予高可用性、管理多个应用程序实例的集群等等。

市场上有很多可用的工具。然而,Kubernetes越来越像一个强大的竞争对手。

3.Kubernetes特点

简而言之,Kubernetes是一个系统 用于跨节点集群协调容器化应用程序,包括网络和存储基础架构。一些最重要的功能是:

  • 资源调度:确保 pod 以最佳方式分布在所有可用节点上
  • 自动扩展:随着负载的增加,集群可以动态分配更多节点,并部署新的 pod 在他们身上
  • 自我修复:集群监控容器,并根据定义的策略在需要时重新启动它们
  • 服务发现: podservice 通过DNS注册和发现
  • 滚动更新/回滚:支持基于Pod和容器的顺序重新部署的滚动更新
  • 机密/配置管理:支持安全处理敏感数据,如密码或API密钥
  • 存储编排:支持多个第三方存储解决方案,可将其用作外部卷以持久化数据

4.了解Kubernetes

这个Master保持集群的所需状态。当我们与集群交互时,例如通过使用 kubectl 命令行界面,我们总是与集群的主机通信。

节点 集群中是运行我们的应用程序的机器(VM、物理服务器等)。主节点控制每个节点。

节点需要 容器运行时.Docker是Kubernetes最常用的运行时。

Minikube 是一个Kubernetes发行版,它使我们能够在工作站上的VM中运行单节点集群以进行开发和测试。

这个 Kubernet API通过将Kubernetes概念封装到对象中,提供了Kubernets概念的抽象(我们将在下一节中查看)。

kubectl是一个命令行工具,我们可以使用它来创建、更新、删除和检查这些API对象。

5.Kubernetes API对象

API对象是“意图记录”-一旦我们创建了对象,集群系统将继续工作以确保对象存在。

每个对象由两部分组成:对象规范和对象状态。规范描述了对象的所需状态。状态描述对象的实际状态,并由集群提供和更新。

在下一节中,我们将讨论最重要的对象。之后,我们将看一个示例,说明规范和状态在现实中的样子。

5.1.基本对象

一个Pod 是Kubernetes处理的基本单元。它封装了一个或多个密切相关的容器、存储资源、唯一的网络IP以及容器应如何运行的配置,从而表示应用程序的单个实例。

Service是一个抽象,它将Pod的逻辑集合分组在一起,并定义如何访问它们。服务是一组容器的接口,因此消费者不必担心单个访问位置之外的任何问题。

使用 卷(Volumes),容器可以访问外部存储资源(因为它们的文件系统是短暂的),并且它们可以读取文件或永久存储文件。卷还支持容器之间的文件共享。一长串 卷类型(volume types)支持。

具有命名空间(Namespace),Kubernetes提供了在一个物理集群上运行多个虚拟集群的可能性。命名空间为资源的名称提供范围,这些名称在命名空间中必须是唯一的。

5.2.控制器

此外,还有一些更高层次的抽象,称为控制器。控制器基于基本对象构建,并提供附加功能:

一个部署(Deployment) 控制器为Pod和ReplicaSet提供声明性更新。我们在部署对象中描述所需的状态,部署控制器将实际状态更改为所需状态。

一个副本集(ReplicaSet) 确保在任何给定时间运行指定数量的Pod副本。

通过 状态集(StatefulSet), 我们可以运行有状态的应用程序:与部署不同,Pods将具有唯一和持久的身份。使用StatefulSet,我们可以实现具有唯一网络标识符或持久存储的应用程序,并可以保证有序、优雅的部署、扩展、删除和终止,以及有序和自动的滚动更新。

通过 守护程序集(DaemonSet), 我们可以确保集群中的所有或一组特定节点运行特定Pod的一个副本。如果我们需要一个在每个节点上运行的守护程序,例如用于应用程序监视或收集日志,这可能会很有用。

一个垃圾填埋场(GarbageCollection) 确保删除某些对象,这些对象曾经拥有所有者,但不再拥有所有者。这有助于通过删除不再需要的对象来节省资源。

一个工作(Job)创建一个或多个Pod,确保特定数量的Pod成功终止,并跟踪成功完成情况。作业有助于并行处理一组独立但相关的工作项,如发送电子邮件、渲染帧、转码文件等。

5.3.对象元数据

元数据是提供有关对象的附加信息的属性。

强制属性为:

  • 每个对象必须具有 命名空间 (我们之前已经讨论过)。如果未显式指定,则对象属于 违约 命名空间。
  • 一个名称(Name) 是其命名空间中对象的唯一标识符。
  • 一个UID 是一个在时间和空间上独一无二的值。它有助于区分已删除和重新创建的对象。

还有可选的元数据属性。其中最重要的是:

  • 标签(Labels) 是一个键/值对,可以附加到对象以对其进行分类。它帮助我们识别满足特定条件的对象集合。它们帮助我们以松散耦合的方式在对象上映射组织结构。
  • 标签选择器(Label selectors) 帮助我们通过标签识别一组对象。
  • 注解(Annotations) 也是键/值对。与标签不同,它们不用于标识对象。相反,它们可以保存有关各自对象的信息,如构建、发布或图像信息。

5.4.示例

在理论上讨论了Kubernetes API之后,我们现在来看一个示例。

API对象可以指定为JSON或YAML文件。 但是,文档建议使用YAML进行手动配置。

在下面,我们将为无状态应用程序的部署定义规范部分。之后,我们将了解从集群返回的状态可能是什么样子。

名为的应用程序的规范 演示后端 可能是这样的:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-backend
spec:
  selector:
      matchLabels:
        app: demo-backend
        tier: backend
  replicas: 3
  template:
    metadata:
      labels:
        app: demo-backend
        tier: backend
    spec:
      containers:
        - name: demo-backend
          image: demo-backend:latest
          ports:
            - containerPort: 8080

如我们所见,我们指定 部署 对象,称为 demo-backend 下面的部分实际上是一个嵌套结构,包含前面几节中讨论的以下API对象:

  • replicase:3 指定 复制集 使用复制因子3(即,我们将有三个部署)
  • template: 指定一个 pod
  • 在此范围内 pod 我们可以使用 规格:containers: 将一个或多个容器分配给我们的 pod 在本例中,我们有一个名为 demo-backend,同时指定为 demo-backend版本 latest,它侦听端口8080
  • 我们还附上 标签(Label) 到我们的pod: app:demo-backend 和 tier:backend
  • 具有 selector:匹配标签,我们将 豆荚部署 控制器(映射到标签 app:demo-backend 和 tier:backend)

如果我们从集群中查询 部署(Deployment) ,响应将如下所示:

Name:                   demo-backend
Namespace:              default
CreationTimestamp:      Thu, 22 Mar 2018 18:58:32 +0100
Labels:                 app=demo-backend
Annotations:            deployment.kubernetes.io/revision=1
Selector:               app=demo-backend
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=demo-backend
  Containers:
   demo-backend:
    Image:        demo-backend:latest
    Port:         8080/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Progressing    True    NewReplicaSetAvailable
  Available      True    MinimumReplicasAvailable
OldReplicaSets:  <none>
NewReplicaSet:   demo-backend-54d955ccf (3/3 replicas created)
Events:          <none>

正如我们所看到的,部署似乎已经启动并在运行,我们可以从规范中识别出大部分元素。

我们有一个复制因子为3的Deployment,其中一个pod包含一个容器,从镜像中实例化 demo-backend:latest.

响应中存在但规范中未定义的所有属性都是默认值。

6.Kubernetes入门

我们可以在各种平台上运行Kubernetes:从我们的笔记本电脑到云提供商上的虚拟机,或者一架裸机服务器。

为了开始, Kubectl 可能是最简单的选择:它使我们能够在本地工作站上运行单节点集群进行开发和测试。

看看 正式文件 进一步的本地机器解决方案、托管解决方案、在IaaS云上运行的发行版等等。

7.结论

在本文中,我们快速了解了一些Kubernetes基础知识。

简单地说,我们涵盖了以下方面:

  • 为什么我们可能需要容器编排工具
  • Kubernetes的一些最重要的特性
  • Kubernetes架构及其最重要的组件
  • Kubernetes API以及我们如何使用它来指定集群的所需状态
正文到此结束