Kubernetes概念


文档摘要

Kubernetes 概念 目录: 介绍 Kubernetes 对象 Kubernetes 架构 教程资源 参考 介绍 什么是 Kubernetes? Kubernetes,最基础的,是一个用于跨多台机器协调运行容器化应用程序的系统。它是一个平台,旨在通过提供可预测性、可扩展性和高可用性的方法来完全管理容器化应用程序和服务的生命周期。 作为 Kubernetes 用户,您可以定义您的应用程序应该如何运行以及它们应该如何与其他应用程序或外部世界交互。您可以扩展或缩减服务规模,执行平滑的滚动更新,并在不同版本的应用程序之间切换流量以测试功能或回滚有问题的部署。Kubernetes 提供了接口和可组合的平台原语,使您能够以高度灵活、强大和可靠的方式定义和管理应用程序。

Kubernetes 概念

目录:

介绍

  • 什么是 Kubernetes?

    • Kubernetes,最基础的,是一个用于跨多台机器协调运行容器化应用程序的系统。它是一个平台,旨在通过提供可预测性、可扩展性和高可用性的方法来完全管理容器化应用程序和服务的生命周期。

    • 作为 Kubernetes 用户,您可以定义您的应用程序应该如何运行以及它们应该如何与其他应用程序或外部世界交互。您可以扩展或缩减服务规模,执行平滑的滚动更新,并在不同版本的应用程序之间切换流量以测试功能或回滚有问题的部署。Kubernetes 提供了接口和可组合的平台原语,使您能够以高度灵活、强大和可靠的方式定义和管理应用程序。

Kubernetes 对象

  • Kubernetes 包含许多表示系统状态的抽象:部署的容器化应用程序和工作负载、它们相关的网络和磁盘资源以及其他关于集群正在做什么的信息。这些抽象由 Kubernetes API 中的对象表示。有关更多详细信息,请参阅理解 Kubernetes 对象。

    • 基本的 Kubernetes 对象包括:

      • Pod
      • 服务
      • 命名空间
    • Pod

      • Pod(如鲸鱼群或豌豆荚中的一个)是一组一个或多个共享存储/网络并具有运行容器规范的容器(例如 Docker 容器)的集合。
    • 副本集(Replica Set)

      • 副本集确保任何时候都有指定数量的 Pod 副本正在运行。换句话说,副本集确保一个 Pod 或一组同质的 Pod 始终处于活动和可用状态。副本集帮助您定义有多少个 Pod 可用。如果您定义的副本数为三个,那么当一个 Pod 挂掉时,副本集会创建一个新的 Pod 以保持总数为三个。
    • 部署(Deployment)

      • 部署控制器提供了对 Pod 和副本集的声明式更新。您可以在一个部署对象中描述所需的状态,然后部署控制器将以受控的速度将实际状态更改为所需状态。您可以定义部署来创建新的副本集,或者移除现有的部署并使用新的部署采用所有资源。部署包括 Pod 和副本集。它还帮助在部署新版本时更新资源。
    • 服务(Service)

      • Kubernetes 服务是一种抽象,它定义了一组逻辑 Pod 和访问它们的策略——有时称为微服务。如果您创建了一个 Pod,您不知道它在哪里。此外,Pod 可能会被某人或节点资源短缺所杀死。服务为您的 Pod 提供了一个端点。如果您指定了“type=LoadBalancer”,它实际上会创建一个 Azure 负载均衡器,以通过公共 IP 地址暴露 Pod。
    • 存储类(Storage Class)

      • 存储类提供了一种方式,让管理员描述他们提供的“存储类别”。它代表了持久卷,例如 Azure 磁盘或 Azure 文件或其他存储。
    • 持久卷声明(Persistent Volume Claim)

      • 持久卷声明是持久卷的抽象。持久卷是基础设施的物理资源。Kubernetes 希望隐藏开发人员的物理声明细节。使用持久卷声明,您可以隐藏持久卷或存储类定义的物理声明。Pod 可以使用持久卷声明对象挂载卷。
    • DaemonSet 与部署的区别

      • Kubernetes 部署管理在集群上运行的无状态服务(而不是像 StatefulSets 这样的管理有状态服务)。其目的是保持一组相同的 Pod 运行并以受控方式升级它们。例如,您可以在部署定义中定义要运行的应用程序副本数,Kubernetes 将在节点上分配这些副本。如果您说在 3 个节点上有 5 个副本,则某些节点将运行应用程序的多个副本。

      • DaemonSet 管理一组重复的 Pod。然而,DaemonSet 力求实现每节点一个 Pod 的模型,要么在整个集群中,要么在节点子集中。DaemonSet 不会在每个节点上运行超过一个副本。使用 DaemonSet 的另一个优势是,如果您向集群添加一个节点,DaemonSet 将自动在该节点上生成 Pod,而部署则不会这样做。

      • DaemonSet 适用于部署需要在所有或某些节点上运行且不需要用户干预的持续后台任务。此类任务的例子包括存储守护进程(如 Ceph)、日志收集守护进程(如 Fluentd)和节点监控守护进程(如 Collected)。

      让我们看看您在问题中提到的例子,为什么 kube-dns 是部署而 kube-proxy 是 DaemonSet?

      原因在于 kube-proxy 需要在集群中的每个节点上运行以运行 IP 表,从而使每个节点上的所有 Pod 可访问,无论它们位于哪个节点。因此,当我们使 kube-proxy 成为 DaemonSet 并稍后向集群添加一个新节点时,kube-proxy 将自动在该节点上启动。

      kube-dns 的职责是通过名称发现服务 IP,即使只有一个 kube-dns 副本也足以将服务名称解析为其 IP,因此我们将 kube-dns 设定为部署,因为我们不需要在每个节点上都运行 kube-dns。

    • 目标端口(Target Port)

      • 目标端口使我们可以将服务可用的端口与应用程序监听的端口区分开来。目标端口是应用程序配置为监听的端口。端口是从外部访问应用程序的方式。
    • 集群 IP(Cluster IP)

      • 集群 IP 是创建 Kubernetes 服务时的默认方法。服务被分配一个内部 IP,其他组件可以使用该 IP 来访问 Pod。通过拥有一个单一的 IP 地址,服务能够在多个 Pod 之间进行负载均衡。
    • 节点端口(NodePort)

      • 当目标端口和集群 IP 使其在集群内可用时,节点端口通过定义的静态端口在每个节点的 IP 上暴露服务。无论您在集群内的哪个节点上访问,只要定义的端口号正确,服务都可以访问。
    • 外部 IP

      • 使服务在集群外可用的另一种方法是通过外部 IP 地址。
    • 负载均衡器(LoadBalancer)

      • 当在云中运行,如 EC2 或 Azure 时,可以配置和分配通过云提供商提供的公共 IP 地址。这将通过负载均衡器(如 ELB)分配给 Kubernetes 集群。这允许在不直接与云提供商交互的情况下为 Kubernetes 集群分配额外的公共 IP 地址。
    • 入口(Ingress)

      • 入口启用外部可访问的 URL,负载均衡流量,终止 SSL,并为 Kubernetes 集群提供基于名称的虚拟主机。
      • 入口规则是 Kubernetes 中的一种对象类型。这些规则可以基于请求主机(域名)、请求路径或两者的组合。
      • Kubernetes 入口是一组路由规则,用于管理如何从外部访问在 Kubernetes 集群中运行的服务。
    • 在 Kubernetes 中,有三种一般方法可以公开您的应用程序。

      • 使用类型为 NodePort 的 Kubernetes 服务,该服务在每个节点上暴露应用程序。
      • 使用类型为 LoadBalancer 的 Kubernetes 服务,该服务创建一个指向集群中 Kubernetes 服务的外部负载均衡器。
      • 使用 Kubernetes Ingress 资源。
    • Kubernetes 持久卷

      • 持久卷由称为持久卷声明(PVC)的东西消耗。PVC 是用户的存储请求。它类似于 Pod。Pod 消耗节点资源,而 PVC 消耗 PV 资源。Pod 可以请求特定级别的资源(CPU 和内存)。PVC 可以请求特定大小和访问模式(例如读写或只读)。
    • 就绪和存活探针

    • Kubernetes 大小

      • KiB 是在计算机科学领域设计用来替换 Kilobyte 的术语,当 Kilobyte 被用来表示 1024 字节时,这与 SI 定义的前缀 kilo(1000)相冲突。

      • 因此,如您所见,5G 表示 5 GB,而 5Gi 表示 5 GiB。它们的数量如下:

      • 5 G = 5000000 KB / 5000 MB

      • 5 Gi = 5368709.12 KB / 5368.70 MB

      • 正确地说,一个是 10 的幂,另一个是 2 的幂。所以,

      • 10^3 是 10 的幂。结果是 1000,即 1G

      • 2^10 是 2 的幂。结果是 1024,即 1Gi

alt 文本

Kubernetes 架构

  • 要了解 Kubernetes 如何提供这些功能,最好从高层次了解其设计和组织方式。Kubernetes 可以被视为分层构建的系统,每一层都抽象出下层的复杂性。

  • 最底层,Kubernetes 将单独的物理或虚拟机组成一个集群,使用共享网络在服务器之间通信。这个集群是所有 Kubernetes 组件、功能和工作负载配置的物理平台。

  • 集群中的每台机器都在 Kubernetes 生态系统中扮演一个角色。一台服务器(或在高可用部署中的一小组服务器)充当主服务器。这台服务器充当集群的网关和大脑,通过公开一个供用户和客户端使用的 API、健康检查其他服务器、决定如何最好地划分和分配工作(称为“调度”),以及协调其他组件之间的通信,来充当集群的主要接触点。主服务器充当集群的主要接触点,并负责提供 Kubernetes 提供的大部分中心逻辑。

  • 集群中的其他机器被指定为节点:负责接受和运行工作负载的服务器,使用本地和外部资源。为了帮助隔离、管理和灵活性,Kubernetes 在容器中运行应用程序和服务,因此每个节点都需要配备一个容器运行时(如 Docker 或 rkt)。节点从主服务器接收工作指令,并根据需要创建或销毁容器,调整网络规则以适当地路由和转发流量。

  • 如前所述,应用程序和服务本身在集群内以容器的形式运行。底层组件确保应用程序的实际状态与集群的期望状态相匹配。用户通过直接或通过客户端和库与主 API 服务器交互来与集群交互。要启动一个应用程序或服务,可以提交一个定义创建什么以及如何管理它的声明性计划,该计划以 JSON 或 YAML 格式定义。主服务器然后通过检查要求和系统的当前状态来确定如何在基础设施上运行该计划。这一组根据指定计划运行的用户定义的应用程序代表了 Kubernetes 的最终层。

架构图

教程资源

Kubernetes.io 官方教程

- [基础知识](https://kubernetes.io/docs/tutorials/#basics) - [配置 Kubernetes](https://kubernetes.io/docs/tutorials/#configuration) - [无状态应用](https://kubernetes.io/docs/tutorials/#stateless-applications) - [有状态应用](https://kubernetes.io/docs/tutorials/#stateful-applications) - [CI/CD 管道](https://kubernetes.io/docs/tutorials/#ci-cd-pipeline) - [管理 Kubernetes 集群](https://kubernetes.io/docs/tutorials/#clusters) - [服务](https://kubernetes.io/docs/tutorials/#services)

DigitalOcean 教程

- 这是一系列精心编写和组织良好的文章。有时它们专注于在 DigitalOcean 上运行 Kubernetes,但您仍然会学到很多适用于任何其他基础设施的 Kubernetes 基础知识。一些值得注意的主题包括: - [Kubernetes 入门](https://www.digitalocean.com/community/tutorials/an-introduction-to-kubernetes) - [Kubernetes DNS 服务简介](https://www.digitalocean.com/community/tutorials/an-introduction-to-the-kubernetes-dns-service) - [Kubernetes 的软件包管理器 Helm 入门](https://www.digitalocean.com/community/tutorials/an-introduction-to-helm-the-package-manager-for-kubernetes) - [面向 Kubernetes 现代化应用程序](https://www.digitalocean.com/community/tutorials/modernizing-applications-for-kubernetes) - [为 Kubernetes 构建优化容器](https://www.digitalocean.com/community/tutorials/building-optimized-containers-for-kubernetes) - [Kubernetes 网络详解](https://www.digitalocean.com/community/tutorials/kubernetes-networking-under-the-hood) - [面向 Kubernetes 的应用程序架构](https://www.digitalocean.com/community/tutorials/architecting-applications-for-kubernetes) - [使用 Kubernetes 进行 CI/CD 的构建块](https://www.digitalocean.com/community/tutorials/webinar-series-building-blocks-for-doing-ci-cd-with-kubernetes) - [如何使用 Heptio Ark 在 DigitalOcean 上备份和恢复 Kubernetes 集群](https://www.digitalocean.com/community/tutorials/how-to-back-up-and-restore-a-kubernetes-cluster-on-digitalocean-using-heptio-ark) - [如何在 DigitalOcean Kubernetes 上设置带有 Cert-Manager 的 Nginx 入口](https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nginx-ingress-with-cert-manager-on-digitalocean-kubernetes) - [如何检查 Kubernetes 网络](https://www.digitalocean.com/community/tutorials/how-to-inspect-kubernetes-networking)

参考

声明:
本文件灏天文库团队进行了翻译。尽管我们力求准确,但请注意,翻译可能包含错误或不准确之处。原文档以其原始语言为准。我们不对因使用此翻译而产生的任何误解或误译负责。


作者与出处
原作者: Tikam02
来源:Tikam02
许可证:MIT
整理: 灏天文库整理
由灏天文库结构化整理,提供目录导航、全文检索与在线阅读,便于系统化学习
发布者: 作者: Tikam02 转发
评论区 (0)
U