目标:
实践实验室涵盖 Kubernetes 的基础知识(这个句子的意思是在实验室中通过实践学习 Kubernetes 的基本概念) 在此过程中理解 Kubernetes 概念(这个句子的意思是在学习的过程中理解 Kubernetes 的相关概念)
议程: 开始使用 Kubernetes(这个句子的意思是介绍如何开始学习 Kubernetes)
改编自 Jérôme Petazzoni 的容器培训,可在 GitHub 上找到:https://github.com/jpetazzo/container.training
Jérôme Petazzoni(Jérôme Petazzoni 是一位知名的软件工程师和培训师)(GitHub 是一个面向开源及私有软件项目的托管平台)
开始使用 Kubernetes 容器化
Containerization
标准软件单元,可以打包您的代码及其所有依赖项,使应用程序能够在不同的计算环境中快速且可靠地运行。 —— Docker.com
(这个句子的意思是容器化是一种软件单元的标准化形式,它能够将代码和所有必需的依赖项打包起来,确保应用程序在转移到不同的计算环境时能够快速且稳定地运行。来源于 Docker.com,Docker 是一个支持容器化技术的平台,允许开发者打包应用及其依赖项到一个可移植的容器中,这些容器可以在任何机器上运行,无需担心依赖项问题。)
Dockerfile example
图片显示的是一个 Dockerfile,这是一个用来定义 Docker 容器如何被构建的文本文件。具体来说,这个 Dockerfile 包含了一系列的指令,用于构建一个运行 Node.js 应用的 Docker 容器。以下是每条指令的作用:
-
FROM node:18-alpine - 从 Docker Hub 上获取名为
node:18-alpine
的基础镜像。这个镜像基于 Alpine Linux,预装了 Node.js 版本 18。Alpine Linux 因其轻量级而被广泛用于 Docker 容器中。 -
WORKDIR /frontend - 设置工作目录为
/frontend
。这是接下来的指令将在容器内部操作的默认目录。 -
COPY package.json ./ - 将宿主机(你的电脑)上的
package.json
文件复制到容器的工作目录。package.json
文件定义了 Node.js 项目的依赖。 -
RUN npm install - 运行
npm install
命令,根据package.json
安装项目所需的所有依赖。 -
COPY . . - 将当前目录下的所有文件和目录复制到容器的工作目录。这通常包括你的应用代码和其他必要文件。
-
EXPOSE 3000 - 声明容器在运行时会监听端口 3000。这通常是应用程序运行的端口。
-
CMD npm run dev - 定义容器启动时执行的命令,这里是启动开发服务器。
这个 Dockerfile 的目的是为了创建一个可以在隔离环境中运行、开发和测试 Node.js 前端应用的容器。
疑惑:
现在: 如果我们运行容器的机器崩溃了怎么办? 如果我们想分别容器化我们的前端和后端,并拥有多个容器,该怎么办? 如果突然有流量高峰,我们想快速启动五个实例来均匀分配在负载均衡器后面,然后当比赛结束后杀掉其中三个实例以便我们可以缩减规模,我们该如何操作? 我们如何协调这个部署、管理、自动化和扩展容器化应用程序的过程?
Kubernetes
是一个容器管理系统,它在一个集群上运行和管理容器化应用程序。那这到底意味着什么呢?
Kubernetes 的核心作用是自动化容器操作,包括部署、扩展、维护和运行多容器应用的生命周期管理。具体来说:
-
集群管理:Kubernetes 允许您将物理或虚拟机组成一个集群。这个集群作为一个整体运行容器化的应用程序,提供更强大的计算能力。
-
运行容器化应用:在 Kubernetes 中,您可以将应用程序和其依赖打包成容器,然后部署到集群上。Kubernetes 负责保证这些容器在集群的不同机器上正确运行。
-
自动扩展和管理:Kubernetes 可以根据预设的规则自动调整应用程序的资源使用,比如在流量高峰自动增加应用实例数量,流量减少时自动减少实例。这种自动扩展帮助应用高效并稳定运行。
-
容错处理:如果集群中的节点出现故障,Kubernetes 可以自动重启失败的容器,在其他正常节点上重新部署,确保应用持续可用。
简而言之,Kubernetes 像是一个自动化的容器管理员,
Kubernetes 是一个容器管理系统(Kubernetes 是一个用于自动部署、扩展和管理容器化应用程序的开源平台)
它在一个集群上运行和管理容器化应用程序
意思是 Kubernetes 能够在多台服务器组成的网络(即集群)上,自动运行和管理用于封装和运行应用程序的容器)
那这到底意味着什么呢?
Kubernetes 的核心作用是自动化容器操作,包括部署、扩展、维护和运行多容器应用的生命周期管理
(Kubernetes 主要用来自动化处理与容器相关的任务,比如部署新的应用、调整应用规模或维护应用的运行状态,以确保应用的持续运行和高效性)
Basic things we can ask Kubernetes to do
我们可以要求 Kubernetes 执行的基本操作:
- 使用镜像启动 5 个容器(这意味着 Kubernetes 将根据给定的 Docker 镜像,启动 5 个运行相同应用的容器实例)
atseashop/api:v1.3
- 在这些容器前放置一个内部负载均衡器(负载均衡器将接收到的请求分发给后面运行的多个容器,以提高处理效率和可用性)
- 使用镜像 atseashop/webfront.3 启动 10 个容器(同样地,这表示 Kubernetes 将根据另一个指定的 Docker 镜像启动 10 个容器实例)
atseashop/webfront:v1.3
- 在这些容器前放置一个公共负载均衡器(与内部负载均衡器类似,但它面向的是外部流量,可以直接从互联网接收请求)
如果是黑色星期五(或圣诞节),流量激增,增长我们的集群并添加容器
(在流量大幅增加的特殊日子,Kubernetes 可以自动增加更多容器来处理额外的网络请求,以避免服务器过载)
5.新版本发布!用新的镜像替换我的容器
atseashop/webfront:v1.4
(当应用有新版本时,Kubernetes 可以将旧的容器逐一替换为新版本的容器,确保应用更新不影响服务) 在升级过程中继续处理请求;一次更新一个容器(这意味着 Kubernetes 可以实施滚动更新,逐步替换旧容器,从而在更新过程中不中断服务)
Overview
下面是各个组件的介绍:
控制平面(Control Plane)
控制平面的职责是管理集群的整体状态,包括调度应用程序、维护应用程序的所需状态、扩展应用程序等。
- API Server (api): Kubernetes API服务器,作为集群内所有组件交互的枢纽。(这个组件允许用户和内部Kubernetes组件与集群交互,是所有资源配置活动的前端)
- Scheduler (sched): 调度器,负责分配任务到合适的节点上。(这个组件根据预定的资源使用等需求,为新创建的容器自动选择最合适的节点)
- Controller Manager (c-m): 控制器管理器,运行控制器进程。(这些控制器确保集群的状态与您定义的期望状态相匹配,如维护正确的容器数量)
- etcd: 高可用键值存储,用于所有集群数据。(它存储了整个集群的状态,可以被看作是集群的"数据库")
节点(Nodes)
节点是运行容器化应用的服务器,是Kubernetes集群的工作负载承载者。
- Kubelet (kubelet): 每个节点上的代理,用于确保容器在Pod中运行。(这个组件管理节点上的容器生命周期,如启动、停止容器,它按照 API Server 的指示管理其节点上的容器)
- Kube-Proxy (k-proxy): 网络代理,维护节点上的网络规则。(这个组件维护和管理节点上的网络通讯,如负载均衡和网络流量的转发)
其他组件
- Cloud provider API: 这通常是与Kubernetes集群集成的云服务提供商的API,用于管理跨集群资源的扩展。(这个接口允许 Kubernetes 集群与云提供商的服务交互,如自动扩展硬件资源)
控制平面(Control plane)
控制平面负责整个集群的管理和协调。
- kube-apiserver: Kubernetes 集群的 API 服务器,是管理和操作集群的通信枢纽。(此组件允许用户和系统组件与 Kubernetes 集群进行交互,它处理和响应 API 请求以及更新 etcd 的状态数据)
- kube-scheduler: 负责调度 Pods 到适合的计算机节点上。(调度器选择最适合的节点以运行未分配的 Pod,基于资源需求、策略约束、亲和性规格等因素)
- kube-controller-manager: 运行控制器,这些控制器通过 API 服务器监视集群的共享状态,并进行必要的更改以将当前状态向期望状态移动。(这些控制器负责处理集群中的常规任务,如复制控制、作业跟踪和更多)
- etcd: 一个轻量级、分布式的键值存储,用于保存所有集群数据,即 Kubernetes 的“真实来源”(etcd 存储集群的状态和元数据,是整个集群中数据的中心存储位置)
计算机(Compute machines)
这里描述的是运行 Kubernetes Pods 和容器的节点。
- kubelet: 在集群中的每个节点上运行的代理,它确保容器都在 Pod 中正常运行。(kubelet 是节点级别的管理者,负责启动、停止和维护容器的应用状态)
- kube-proxy: 网络代理,运行在每个节点上,维护节点的网络规则。(kube-proxy 处理节点上的网络通信,例如负载均衡和流量转发)
- Container runtime: 负责运行容器的底层软件。(这是实际运行容器的软件,如 Docker、containerd)
持久存储(Persistent storage)
用于存储应用数据,确保数据在 Pod 重启和替换后依然可用。
容器注册表(Container registry)
存储容器镜像的位置,Kubernetes 可以从这里拉取镜像以部署新的容器或更新现有的容器。
基础设施类型(Underlying infrastructure)
显示 Kubernetes 可以部署在哪些类型的基础设施上:
- 物理(Physical): 直接部署在物理硬件上。
- 虚拟(Virtual): 部署在虚拟机上。
- 私有云(Private): 在私有云环境中部署。
- 公共云(Public): 在公共云提供商上部署。
- 混合云(Hybrid): 结合使用私有云和公共云。