k8s实战教程预备:基础知识入门 – wiki基地


Kubernetes (k8s) 实战教程预备:基础知识入门——扬帆起航前的必修课

在当今云原生时代,Kubernetes(常简称为 k8s)已成为容器编排领域的事实标准。它提供了一个强大、可扩展且具有弹性的平台,用于自动化部署、扩展和管理容器化应用程序。无论您是希望提升技能的开发人员、寻求高效运维的工程师,还是对现代基础设施充满好奇的技术爱好者,掌握 Kubernetes 都将为您打开一扇通往新世界的大门。

然而,直接投身于复杂的 Kubernetes 实战操作,往往会因为缺乏必要的基础知识而感到困惑和挫败。如同建造摩天大楼需要坚实的地基一样,深入 K8s 实战之前,充分理解其核心概念、架构和基本原理至关重要。本文旨在为您铺设这条“地基”,详细梳理 Kubernetes 入门所需的基础知识,助您为即将到来的实战教程做好充分准备。

一、 回到起点:为什么需要 Kubernetes?容器化浪潮的挑战

要理解 Kubernetes 的价值,我们首先需要回顾一下容器化技术(尤其是 Docker)带来的变革以及随之而来的挑战。

  1. 容器化的兴起 (以 Docker 为例)

    • 轻量级虚拟化:与传统虚拟机 (VM) 不同,容器共享宿主机的操作系统内核,仅打包应用程序及其依赖项。这使得容器启动速度快、资源占用少、环境一致性高。
    • 解决了“环境不一致”问题:开发人员可以在本地构建包含所有依赖的容器镜像,确保应用在开发、测试、生产环境中表现一致。
    • 微服务架构的助推器:容器非常适合封装和部署独立的微服务单元,促进了敏捷开发和应用的解耦。
  2. 容器化带来的新挑战
    随着应用规模的扩大和微服务数量的增多,手动管理大量容器变得异常复杂:

    • 部署与调度:如何在众多服务器(节点)上高效地部署和分发容器?如何根据资源需求智能地选择合适的节点?
    • 服务发现与负载均衡:当容器(尤其是微服务)动态创建和销毁时,服务之间如何相互发现?如何将流量均匀地分发到提供同一服务的多个容器实例?
    • 弹性伸缩:如何根据负载变化自动增加或减少容器实例的数量?
    • 健康检查与自愈:如何监控容器和节点的健康状况?当容器或节点发生故障时,如何自动替换或恢复?
    • 配置管理与密钥管理:如何安全、便捷地管理应用程序的配置信息和敏感数据(如密码、API 密钥)?
    • 存储管理:对于需要持久化数据的有状态应用,如何为容器提供可靠、持久的存储卷?
    • 滚动更新与回滚:如何实现应用程序的平滑升级(不中断服务),并在出现问题时快速回滚到上一个稳定版本?

正是为了系统性地解决以上这些挑战,以 Google 内部 Borg 系统为基础的 Kubernetes 应运而生。它提供了一个统一的框架和 API,将底层的基础设施(物理机、虚拟机、云资源)抽象为一个巨大的资源池,自动化地管理容器化应用的整个生命周期。

二、 容器基础:理解 Kubernetes 的“积木”

既然 Kubernetes 是容器编排平台,那么理解容器本身,特别是 Docker 的核心概念,是学习 K8s 的前提。

  1. 镜像 (Image)

    • 一个只读的模板,包含了运行应用程序所需的所有内容:代码、运行时库、环境变量、配置文件等。
    • 分层构建:Docker 镜像由多个只读层叠加而成,这种分层结构提高了构建和分发的效率,也节省了存储空间。
    • 类比:可以将其想象成安装操作系统的 ISO 文件或虚拟机的快照模板。
  2. 容器 (Container)

    • 镜像的可运行实例。每个容器都是相互隔离的,拥有自己的文件系统、网络栈和进程空间。
    • 基于镜像创建:容器启动时,会在镜像的最上层添加一个可写层,所有的修改都发生在这个层。
    • 类比:可以将其看作是通过 ISO 文件安装好的操作系统实例,或者是从模板创建出来的虚拟机。
  3. Dockerfile

    • 一个文本文件,包含了一系列指令,用于定义如何构建 Docker 镜像。它描述了基础镜像、需要安装的软件、复制代码、暴露端口、运行命令等步骤。
    • 自动化镜像构建:通过 docker build 命令,可以根据 Dockerfile 自动、可重复地构建镜像。
  4. 仓库 (Registry)

    • 用于存储和分发 Docker 镜像的服务。最著名的公共仓库是 Docker Hub。企业内部也常搭建私有仓库(如 Harbor)。
    • docker pull 从仓库拉取镜像,docker push 将本地构建的镜像推送到仓库。

理解这些概念后,您就能明白 Kubernetes 所管理的“工作负载”最终都是以容器的形式运行在集群节点上的。

三、 Kubernetes 核心架构:宏观视角

一个运行中的 Kubernetes 集群主要由两类节点组成:控制平面节点(Control Plane Nodes, 以前称为 Master Nodes)和工作节点(Worker Nodes)。

  1. 控制平面 (Control Plane)
    控制平面是集群的大脑,负责做出全局决策(例如调度),以及检测和响应集群事件(例如,当 Deployment 的实际副本数不满足期望值时,启动新的 Pod)。控制平面组件可以在集群中的任何节点上运行,但为了简单起见,通常会将它们集中运行在几个专用的节点上,以确保高可用性。主要组件包括:

    • API Server (kube-apiserver):Kubernetes API 的前端,是整个集群的入口点。所有组件(包括用户、kubectl 命令行工具、UI 等)都通过 API Server 进行交互。它负责处理 REST 请求、验证请求、更新对象状态到 etcd
    • etcd: 一个高可用的键值存储系统,用于持久化存储整个集群的状态(配置数据、对象定义、集群状态等)。是集群的“单一事实来源 (Single Source of Truth)”。可靠性至关重要。
    • 调度器 (kube-scheduler):监视新创建的、尚未分配节点的 Pod,并根据资源需求、策略、亲和性/反亲和性规则、数据局部性等因素,选择一个最佳的工作节点来运行该 Pod。
    • 控制器管理器 (kube-controller-manager):运行一系列后台控制器进程。每个控制器负责监控集群状态,并尝试将当前状态驱动到期望状态。常见的控制器包括:
      • Node Controller: 负责节点故障检测和响应。
      • Replication Controller/ReplicaSet Controller: 维护 Pod 的副本数量。
      • Deployment Controller: 管理应用的部署和滚动更新。
      • Service Controller: 根据 Service 定义创建或管理底层云提供商的负载均衡器等。
    • 云控制器管理器 (cloud-controller-manager)(可选):嵌入了特定云平台的控制逻辑。它允许将 Kubernetes 与云提供商的 API(如负载均衡器、存储卷等)进行集成,将云相关的逻辑与核心 K8s 代码解耦。
  2. 工作节点 (Worker Nodes)
    工作节点是集群中真正运行应用程序容器(Pods)的地方。每个工作节点都由控制平面管理,并运行以下关键组件:

    • Kubelet: 运行在每个工作节点上的代理。它负责与控制平面的 API Server 通信,接收 Pod 的规范 (PodSpec),并确保这些 Pod 中的容器按照规范运行。它还负责向 API Server 汇报节点的健康状况和 Pod 的状态。
    • Kube-proxy: 运行在每个工作节点上的网络代理。它维护节点上的网络规则,实现了 Kubernetes Service 的概念。它允许集群内部或外部的网络流量路由到正确的 Pod。它可以基于 iptables、IPVS 或 eBPF 等技术实现。
    • 容器运行时 (Container Runtime):负责实际运行容器的软件。Kubernetes 支持多种容器运行时,最常见的是 Docker,但也支持 containerd、CRI-O 等符合 CRI (Container Runtime Interface) 规范的运行时。Kubelet 通过 CRI 与容器运行时交互。

理解这个主从架构是掌握 K8s 的第一步。控制平面负责管理和决策,工作节点负责执行和运行负载。

四、 Kubernetes 核心对象(API Objects):构建应用的基石

在 Kubernetes 中,一切皆对象。用户通过创建、更新或删除这些对象来定义、部署和管理应用程序。这些对象代表了集群的期望状态。以下是一些最基础、最重要的对象:

  1. Pod

    • 定义:Pod 是 Kubernetes 中可以创建和管理的最小部署单元。它代表了集群中运行的一个进程实例。
    • 构成:一个 Pod 可以包含一个或多个紧密关联的容器。这些容器共享相同的网络命名空间(同一个 IP 地址和端口空间)、存储卷(Volumes),并且通常一起调度到同一个节点上。
    • 用途:通常,一个 Pod 只运行一个主应用程序容器。但对于需要紧密协作的辅助容器(如日志收集器、服务网格 sidecar 代理),可以将它们放在同一个 Pod 中。
    • 生命周期:Pod 是短暂的 (ephemeral)。它们被创建、分配唯一 ID (UID),然后调度到节点上运行,直到它们终止(完成任务或被删除)或节点故障。Pod 不会自动“复活”在另一个节点上;这个任务由更高级别的控制器(如 Deployment)负责。
  2. Service (svc)

    • 定义:Service 是一个抽象层,它定义了一组逻辑上的 Pod(通常由标签选择器 Label Selector 确定)以及访问这些 Pod 的策略(通常是负载均衡)。
    • 解决的问题:由于 Pod 是短暂的,其 IP 地址会随着创建和销毁而改变。Service 提供了一个稳定的 IP 地址和 DNS 名称,客户端可以通过这个稳定的端点访问后端的一组 Pod,而无需关心 Pod 的具体 IP 或它们是否发生了变化。
    • 功能:服务发现和负载均衡。Kube-proxy 在每个节点上根据 Service 的定义设置网络规则(如 iptables 或 IPVS),将访问 Service IP 的流量转发到其后端健康的 Pod 之一。
    • 类型
      • ClusterIP (默认):仅在集群内部可见的虚拟 IP。适用于集群内部服务之间的通信。
      • NodePort:在每个节点的指定静态端口上暴露服务。可以通过 <NodeIP>:<NodePort> 从集群外部访问。
      • LoadBalancer:在支持的云提供商上(如 AWS, GCP, Azure)自动创建一个外部负载均衡器,并将流量导向 Service。这是将服务暴露给公共互联网的标准方式。
      • ExternalName:将 Service 映射到集群外部的一个 DNS 名称,通过返回 CNAME 记录实现。
  3. Deployment

    • 定义:Deployment 是用于管理无状态应用(如 Web 服务器)副本的最常用对象。它提供了一种声明式的方式来定义应用的期望状态。
    • 核心功能
      • 副本管理:确保指定数量(replicas)的 Pod 副本始终处于运行状态。它通过管理底层的 ReplicaSet 来实现这一点。
      • 滚动更新 (Rolling Update):允许您平滑地将应用从一个版本升级到另一个版本,逐个替换旧 Pod,而不会导致服务中断。
      • 回滚 (Rollback):如果新版本出现问题,可以轻松地回滚到之前的稳定版本。
    • 工作机制:当您创建一个 Deployment 时,它会创建一个 ReplicaSet。ReplicaSet 负责维护 Pod 副本数。当您更新 Deployment(例如,更改镜像版本)时,Deployment 会创建一个新的 ReplicaSet,并逐步将 Pod 从旧 ReplicaSet 迁移到新 ReplicaSet,同时控制可用 Pod 的数量,确保服务连续性。
  4. ReplicaSet (rs)

    • 定义:ReplicaSet 的目标是确保任何时候都有指定数量的 Pod 副本在运行
    • 与 Deployment 的关系:通常,您不应直接操作 ReplicaSet。而是通过 Deployment 来管理它们。Deployment 使用 ReplicaSet 来实现副本数量保证和版本控制。
  5. Namespace

    • 定义:Namespace 提供了在同一物理集群内划分虚拟集群的机制。它为资源名称提供了一个作用域。
    • 用途
      • 隔离:不同 Namespace 中的资源名称可以相同。例如,可以在 dev Namespace 和 prod Namespace 中都创建一个名为 my-app 的 Deployment。
      • 资源配额 (Resource Quotas):可以为每个 Namespace 设置资源限制(如 CPU、内存、存储使用量)。
      • 访问控制 (RBAC):可以基于 Namespace 对用户或服务账户的权限进行细粒度控制。
    • 默认 Namespaces:Kubernetes 启动时会创建几个默认 Namespace,如 default (未指定 Namespace 的对象默认在此)、kube-system (运行 K8s 系统组件)、kube-public (公共可读数据)。
  6. ConfigMap & Secret

    • 目的:将配置信息和敏感数据(如密码、API 密钥、TLS 证书)与应用程序的容器镜像解耦。这使得配置更易于管理和更新,也更安全。
    • ConfigMap: 用于存储非敏感的配置数据(键值对)。可以作为环境变量、命令行参数或卷挂载到 Pod 中。
    • Secret: 用于存储敏感数据。存储方式与 ConfigMap 类似,但 Kubernetes 会对其进行特殊处理(例如,默认情况下存储在 etcd 中可能是 base64 编码,可以通过 RBAC 限制访问,某些集成可能会提供加密)。也可以作为环境变量或卷挂载到 Pod 中(通常挂载为文件)。
  7. Volume

    • 定义:Volume 是 Pod 中容器可以访问的存储目录。Kubernetes Volume 的生命周期与 Pod 绑定(通常情况下),但其内容可能比 Pod 本身更持久。
    • 解决的问题:容器的文件系统是临时的。当容器崩溃或重启时,其中的数据会丢失。Volume 提供了一种持久化数据或在 Pod 内多个容器间共享数据的方式。
    • 类型:Kubernetes 支持多种类型的 Volume,包括:
      • emptyDir: 一个临时的空目录,生命周期与 Pod 相同。用于 Pod 内多个容器间共享文件,或作为临时缓存。
      • hostPath: 将宿主机节点上的文件或目录挂载到 Pod 中。需要谨慎使用,因为它将 Pod 与特定节点耦合,且存在安全风险。
      • 云存储卷 (如 awsElasticBlockStore, gcePersistentDisk, azureDisk):直接使用云提供商的块存储服务。
      • 网络文件系统 (如 nfs, cephfs):挂载网络存储。
      • configMap, secret: 将 ConfigMap 或 Secret 的数据作为文件挂载到 Pod 中。
      • persistentVolumeClaim (下一节介绍)。
  8. PersistentVolume (PV) & PersistentVolumeClaim (PVC)

    • 背景:直接使用云存储或网络存储 Volume 会将 Pod 的定义与具体的存储实现细节耦合。为了解耦,Kubernetes 引入了 PV 和 PVC。
    • PersistentVolume (PV):由集群管理员配置的一块网络存储。它是一个集群级别的资源,就像一个节点。PV 封装了底层存储(如 NFS、iSCSI、云硬盘)的实现细节。PV 具有生命周期,独立于使用它的任何 Pod。
    • PersistentVolumeClaim (PVC):由用户(开发者)发起的存储请求。它类似于 Pod 请求 CPU 和内存。用户在 PVC 中指定所需的存储大小、访问模式(如 ReadWriteOnce, ReadOnlyMany, ReadWriteMany)等要求,而不关心具体的存储后端
    • 绑定过程:Kubernetes 控制平面会查找满足 PVC 要求的可用 PV,并将它们绑定 (Bind) 在一起。一旦绑定,用户就可以像使用普通 Volume 一样,在 Pod 定义中引用这个 PVC,从而获得持久化存储。
    • 优势:将存储的“提供 (Provisioning)”(由管理员负责的 PV)与存储的“消费 (Consumption)”(由用户负责的 PVC)分离,提高了抽象性和可移植性。

理解这些核心对象是使用 Kubernetes 的关键。您将主要通过编写 YAML 文件来定义这些对象的期望状态,然后使用 kubectl 工具将其应用到集群中。

五、 与 Kubernetes 交互:kubectl

kubectl 是 Kubernetes 的主要命令行工具。您将使用它来:

  • 查看集群状态kubectl get nodes, kubectl get pods, kubectl get services
  • 查看对象详情kubectl describe pod <pod-name>, kubectl describe service <service-name>
  • 创建、更新、删除资源:通常使用 kubectl apply -f <your-yaml-file.yaml> 来应用 YAML 文件中定义的资源。也可以使用 kubectl create, kubectl edit, kubectl delete
  • 执行命令和调试kubectl exec -it <pod-name> -- /bin/bash 进入容器内部,kubectl logs <pod-name> 查看 Pod 日志。
  • 管理集群配置:切换上下文(连接到不同集群或用户),管理 Namespace 等。

熟练掌握 kubectl 的常用命令是进行 K8s 实战的基础。

六、 网络基础概念

Kubernetes 网络是一个复杂但至关重要的主题。入门阶段需要了解:

  • Pod 网络:每个 Pod 都有自己唯一的 IP 地址(在集群内部)。同一节点上的 Pod 可以直接通信。不同节点上的 Pod 通信需要通过网络插件 (CNI – Container Network Interface) 实现,如 Calico, Flannel, Cilium 等。重要的是,需要保证任何 Pod 都可以直接访问任何其他 Pod 的 IP 地址,无需 NAT
  • Service 网络:Service 提供了一个稳定的虚拟 IP,用于访问一组 Pod。kube-proxy 负责将流量从 Service IP 导向后端 Pod IP。
  • 集群 DNS:Kubernetes 通常会部署一个内部 DNS 服务 (如 CoreDNS),使得可以通过 Service 名称(例如 my-service.my-namespace.svc.cluster.local 或简写 my-service 在同一 Namespace 内)来解析到 Service 的 ClusterIP。这是服务发现的关键机制。
  • Ingress (可选但常用):对于需要从集群外部访问的 HTTP/HTTPS 服务,通常不直接使用 NodePort 或 LoadBalancer 类型的 Service(后者可能成本高昂)。Ingress 资源定义了外部流量如何路由到集群内部的 Services。需要配合 Ingress Controller (如 Nginx Ingress Controller, Traefik) 来工作,Ingress Controller 通常是一个部署在集群内的负载均衡器或代理服务器。

七、 声明式配置与 YAML

Kubernetes 提倡声明式 (Declarative) 的管理方式,而不是命令式 (Imperative)。

  • 命令式:您告诉系统“做什么”,例如 kubectl run my-nginx --image=nginx(创建一个 Nginx Pod)。
  • 声明式:您告诉系统“期望的状态是什么”,例如,编写一个 YAML 文件描述一个包含 Nginx 容器的 Pod,然后使用 kubectl apply -f pod.yaml。Kubernetes 控制器会负责将当前状态调整到您声明的期望状态。

YAML (YAML Ain’t Markup Language) 是 Kubernetes 定义 API 对象的标准格式。它是一种人类可读的数据序列化语言。您需要熟悉 YAML 的基本语法(缩进表示层级,key: value 格式,列表用 - 表示)来编写 Kubernetes 配置文件。

声明式配置的优势
* 幂等性:无论执行 kubectl apply 多少次,只要 YAML 文件不变,最终状态都一样。
* 版本控制:可以将 YAML 文件存储在 Git 等版本控制系统中,追踪变更,方便协作和回滚。
* 自动化 (GitOps):基于 Git 仓库中的 YAML 文件自动部署和管理集群状态。

八、 为实战教程做好准备

在开始具体的 K8s 实战教程之前,建议您准备好以下环境和技能:

  1. 本地 Kubernetes 环境:为了方便实验和学习,您需要在本地机器上运行一个单节点或多节点的 Kubernetes 集群。常用工具包括:
    • Minikube: 在虚拟机或容器中运行一个单节点 K8s 集群。简单易用,适合入门。
    • kind (Kubernetes in Docker): 使用 Docker 容器作为 K8s 集群的节点。启动快,资源占用相对较少。
    • Docker Desktop: 其自带的 Kubernetes 功能可以在 Mac 和 Windows 上轻松启用一个单节点集群。
    • k3s / k3d: 轻量级的 Kubernetes 发行版,k3d 是在 Docker 中运行 k3s 的工具。
  2. 安装 kubectl:确保您的机器上安装了 kubectl 命令行工具,并配置好连接到您的本地集群。
  3. 基本的 Linux 命令行知识:因为经常需要在命令行与 kubectl 交互,并可能需要进入容器内部调试。
  4. Docker 基础:理解 Docker 镜像、容器、Dockerfile 的概念,并能执行基本的 Docker 命令(build, run, pull, push)。
  5. 文本编辑器:熟练使用一款文本编辑器(如 VS Code, Vim, Emacs)来编写和修改 YAML 文件。

结语:基础牢固,方能行稳致远

Kubernetes 是一个功能强大但也相对复杂的系统。本文梳理的基础知识——从容器化的挑战到 K8s 的核心架构、关键对象、交互方式以及网络、存储、配置管理等基本概念——是您踏上 K8s 实战之旅不可或缺的行囊。

理解这些基础,您将能更好地明白实战教程中每个操作背后的原理,而不仅仅是依样画葫芦。当遇到问题时,扎实的基础也能帮助您更快地定位和解决问题。虽然初看内容繁多,但不必追求一次性完全精通。在后续的实战练习中,这些概念会不断被应用和巩固。

现在,您已经对 Kubernetes 的世界有了一个初步的轮廓和地图。带着这些知识,您可以更有信心地翻开实战教程的下一页,开始构建、部署和管理您的第一个容器化应用了!祝您在 Kubernetes 的学习之路上乘风破浪,收获满满!

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部