11. Kubernetes 开章

本章讲解知识点

  • Kubernetes 概念
  • 为什么要使用 Kubernetes
  • Kubernetes 的部署架构
  • Kubernetes 基本命令

<br>

本章主要是针对 Kubernetes 基本概念为读者讲解,读者能有一个大概印象即可,不需要过于斟酌细节,针对 Kubernetes 的概念将在后面章节中详细讲解。

1. Kubernetes 概念

我们在之前的章节讲过,容器技术大行其道,其中以 Docker 为代表,随着越来越多的服务被容器化后,人们发现容器管理和编排成了一大难题,另一方面出于商业目的,Kubernetes 出现在大众视野并一跃成为 PaaS 平台代表。

Kubernetes(通常简称为 “K8s”)是一种开源的容器编排平台,它提供了一组丰富的概念和组件(kube-apiserver、kube-controller-manager、kube-scheduler、kubelet、kube-proxy),用于管理和运行容器化应用程序

以下是一些常见的 Kubernetes 概念:

  • Pod:Pod 是 Kubernetes 中最小的调度单元,它包含一个或多个相关的容器,这些容器共享相同的网络命名空间和数据卷,并且可以通过 localhost 相互通信。
  • Service:Service 是一种逻辑组件,用于公开一个或多个 Pod,提供一个稳定的 DNS 名称和 IP 地址,以及负载平衡和服务发现功能。
  • Deployment:Deployment 是一种控制器,用于管理 Pod 的副本数量和版本控制,支持滚动升级、回滚、暂停和恢复等操作。
  • ReplicaSet:ReplicaSet 是 Deployment 的底层实现,它确保在任何时间点都有指定数量的 Pod 在运行,并可以自动扩展和缩小 Pod 的数量。
  • Namespace:Namespace 是一种逻辑隔离机制,用于将集群划分为多个虚拟集群,每个 Namespace 中的对象都可以使用唯一的名称进行标识。
  • ConfigMap:ConfigMap 是一种 Kubernetes 对象,用于存储配置信息,包括环境变量、命令行参数、配置文件等。
  • Secret:Secret 是一种 Kubernetes 对象,用于存储敏感信息,如密码、API 密钥等。
  • Volume:Volume 是一种抽象的文件系统,它可以在 Pod 和容器之间共享数据,并且可以支持多种类型的存储介质,包括本地存储、云存储等。
  • StatefulSet:StatefulSet 是一种控制器,用于管理有状态的应用程序,如数据库、缓存等,支持有序部署、有序删除、有序扩展等操作。

以上仅是 Kubernetes 中的一小部分概念,Kubernetes 还包括其他许多概念和组件,如 DaemonSet、Job、CronJob、Ingress 等,每个组件都有其特定的作用和用法。

以上k8s的概念我们将在后面章节一一为大家展开详解。

<br>

2. 为什么要使用 Kubernetes

2.1. Kubernetes 使用背景

我们在讲云计算时,梳理了云计算发展的流程,提到PaaS的来历:

容器虚拟化技术大行其道后,传统业务全部容器化,享受到容器化技术的便捷,同时问题也随之而来,当容器越来越多时,容器的管理、编排成了大难题

容器的生命周期如何管理,容器故障如何监控,相互有依赖关系的容器如何部署等等问题。

人们发现,需要借助一个平台来管理我们的容器,PaaS时代随之来临。其中以 Kubernetes 为代表。Kubernetes,简称K8s,是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效(powerful), Kubernetes 提供了应用部署,规划,更新,维护的一种机制

2.2. Kubernetes 的优点

Kubernetes 可以帮助开发人员和 DevOps 团队更轻松地构建、部署和运行可伸缩、可靠和高度可用的应用程序。以下是使用 Kubernetes 的一些主要优点:

  • 自动化:Kubernetes 可以自动化部署、扩展和管理容器化应用程序,减轻了开发人员和 DevOps 团队的工作负担。如部署实例时,通过部署 Deployment 或 StatefulSet 就能自动扩展出实例来。
  • 可伸缩性:Kubernetes 支持自动水平扩展和垂直扩展,可以根据应用程序的需求动态调整容器数量和资源。
  • 可靠性:Kubernetes 提供了故障转移和自动恢复功能,能够确保应用程序在节点故障、容器崩溃等情况下的高可用性。如 kubelet 针对容器的健康检查机制,kube-scheduler 针对 Pod 的最优调度机制等。
  • 灵活性:Kubernetes 支持多种容器运行时和云平台,可以轻松地迁移应用程序和工作负载。
  • 安全性:Kubernetes 提供了多种安全机制,包括身份验证、授权、加密等,可以保护容器化应用程序的安全。

2.3. Kubernetes 与传统部署场景对比举例

场景一:手动部署 vs 自动化部署:在传统部署场景中,应用程序的部署通常是手动进行的,需要人工干预,这里面还有一个难题,当服务越来越多,相互之间还存在依赖的情况下,先后部署顺序就是一个麻烦事。而在 Kubernetes 中,可以使用自动化工具(如 Helm、Kustomize 等)编写模板,进行应用程序的自动化部署和管理,一次下发,提高了部署效率和可靠性。

场景二:故障检测 vs 高可用性:在传统部署场景中,应用程序故障检测是个比较麻烦的事,传统业务自己写健康检查脚本来判断程序内部是否正常,难点就在于正常或不正常该如何处理,判断的标准又是什么,对于传统业务来说不好做。而在 Kubernetes 中,Kubernetes 作为一个管理容器的平台,从外部对业务容器进行健康检查,提供了多种检查探针如 livenessProbe、startupProbe、readinessProbe 以及多种检查方式如 cmd、http、socket 接口,同时提供了健康检查失败对应的策略。较之传统业务自己写脚本实现健康检查要可靠得多。

场景三:手动升级 vs 自动化升级:在传统部署场景中,应用程序的升级通常是手动进行的,需要人工干预,是先停服务再升级,还是热升级,升级过程中流量转接怎么处理,相当复杂。而在 Kubernetes 中,可以使用自动化特性(如滚动更新、灰度升级等策略)进行应用程序的自动化升级和管理,提高了升级效率和可靠性。

Kubernetes 相对传统服务和 docker 上,还有很多的优势,如自动扩展、管理运维,不再一一展开。总的来说,与传统部署场景相比,Kubernetes 可以提供更高效、更可靠、更灵活、更可扩展的应用程序部署和管理方式,可以大大简化应用程序的部署、管理、升级等操作,提高了开发效率和运维效率。

以上 Kubernetes 的优点在后面章节的详细讲解中,读者将有一个直观的体验和感受

<br>

3. Kubernetes 的部署架构

3.1. Kubernetes 的部署架构

一个从实际场景出发的部署架构,往往需要考虑高可用性、高可靠性、容灾、主从等因素,Kubernetes 的部署同样也不能例外。

下图展示了 Kubernetes 的实际应用的部署架构

可以看到有三个 Master 节点,共同组成了管理面集群,三个 Master 就是考虑到了高可靠性、容灾。三个 Master 节点通过 Load Balancer 实现负载均衡(负载均衡 Load Balancer 是一种分布式系统架构中常用的技术,用于将访问流量分发到多个服务器上,以实现高可用、高性能、高扩展性的网络服务。)

三个 Master 节点组成管理面集群,之所以称之为管理面,顾名思义,管理面是不跑业务的,业务要运行在数据面节点,即 Node 或 Worker 上,Master 是管理 Node 的,注意这一层关系,即主从关系

3.2. Kubernetes 的核心管理组件

Master 节点作为管理面节点,是通过几个核心组件来实现的管理职责的。

核心组件包括以下几个:

  • kube-apiserver:kube-apiserver 是 Kubernetes 的控制中心,所有的集群操作都通过 kube-apiserver 来完成,是集群管理、资源配置、安全机制的入口。kube-apiserver 提供了 RESTful API 接口,支持对集群资源的创建、修改、查询和删除等操作。
  • kube-controller-manager:kube-controller-manager 是 Kubernetes 的控制器管理组件,用于运行多个内置控制器来保证集群的健康和稳定,保证pod或其他资源到达期望值。例如,Replication Controller、Service Controller、Node Controller 等都是由 Controller Manager 管理的。
  • kube-scheduler:kube-scheduler 是 Kubernetes 的调度器,负责将容器应用程序调度到集群中的适当节点上。Scheduler 通过一系列的算法,根据容器应用程序的资源需求、节点资源使用情况和调度策略等因素来决定在哪个节点上运行容器应用程序。
  • etcd:etcd 是一个高可用的分布式键值存储系统,被用来存储 Kubernetes 集群中的所有配置数据和状态信息。etcd 具有高可用、强一致性和快速响应等特性,可以保证 Kubernetes 集群的数据可靠性和一致性。不过 etcd 不算 Kubernetes 自研组件,etcd 自身是一个开源组件,Kubernetes 集成了它而已。

3.3. Kubernetes 的数据面组件

Node 就是我们的工作节点,上面会运行 Kubernetes 组件来保证 Master 实现管理能力。

  • kubelet:kubelet 是 Kubernetes 的主要工作节点代理,运行在每个节点上,负责管理该节点上的容器。kubelet 从 API Server 获取 Pod 的配置信息,然后根据配置信息创建和管理 Pod 中的容器,并监控容器的运行状态,确保容器正常运行。同时向 Master 节点上报工作节点的状态。
  • kube-proxy:是主要负责为集群中的服务提供负载均衡和代理功能。负载 pod 与 pod 之间的通信和负载均衡。kube-proxy 会监视 Kubernetes API 服务器上的服务和端点对象,并根据它们的状态更新工作节点上的网络规则,以确保服务和端点之间的正确路由。它支持三种负载均衡模式:iptables、IPVS和Userspace,并且可以配置为在服务之间轮流选择、根据源IP地址选择等多种模式下运行。

当然,kubelet 和 kube-proxy 在 Master 节点也是有的,这一点请注意。

kubelet 是数据面核心组件,在 Kubernetes 项目中,kubelet 主要负责同容器运行时(比如 Docker 项目)打交道。而这个交互所依赖的,是一个称作 CRI(Container Runtime Interface)的远程调用接口,这个接口定义了容器运行时的各项核心操作,比如:启动一个容器需要的所有参数。这也是为何,Kubernetes 项目并不关心你部署的是什么容器运行时、使用的什么技术实现,只要你的这个容器运行时能够运行标准的容器镜像,它就可以通过实现 CRI 接入到 Kubernetes 项目当中。而 kubelet 的另一个重要功能,则是调用网络插件和存储插件为容器配置网络和持久化存储。这两个插件与 kubelet 进行交互的接口,分别是 CNI(Container Networking Interface)和 CSI(Container Storage Interface)。

3.4. Kubernetes 管理容器的过程

下图展示了 Kubernetes 管理容器的过程:

yaml 部署文件通过命令向 kube-apiserver 发出请求创建资源,如 Pod, kube-controller-manager 将资源控制到期望数目,kube-scheduler 帮助调度资源到筛选出来的节点,etcd 用来存储资源信息,kubelet 在节点上创建对应的业务容器,同时监控节点 Pod 的状态,并上报节点信息,proxy 则更新 endpoint 与生成对应 iptables 规则用于流量转发。

可以发现,kube-scheduler、kube-controller-mana

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

云计算面试题全解析 文章被收录于专栏

本专刊适合于立志转行云计算的小白,有一定的编程、操作系统、计算机网络、数据结构、算法基础。 本专刊同时也适合于面向云计算(Docker + Kubernetes)求职的从业者。 本专刊囊括了云计算、VMWare、Docker、Kubernetes、Containerd等一系列知识点的讲解,并且最后总

全部评论

相关推荐

讯飞老萌新:站住!有人25还没有找到工作的吗
点赞 评论 收藏
分享
02-24 17:39
门头沟学院 Java
神哥不得了:神哥来啦~专业技能的话建议不要前面空那么多,八股的话建议先把高频top 50的八股多巩固几遍,千万不要看那些假高频八股。项目的话,建议换两个高质量的项目上去
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务