容器与编排入门 - SRE 须知的 Docker 与 Kubernetes 基础

伢赞

关注

阅读 10

05-26 09:00

容器与编排入门 - SRE 须知的 Docker 与 Kubernetes 基础

在上一篇我们探讨了 Linux 操作系统基础。虽然理解底层 OS 很重要,但现代软件开发和部署的趋势是将应用程序及其依赖打包到容器中,然后在像 Kubernetes 这样的平台上进行大规模管理。这种方式极大地提高了部署效率、资源利用率和环境一致性。

什么是容器化?(以 Docker 为例)

想象一下,你在本地开发了一个应用,依赖特定版本的 Python、某个库和一些配置文件。如何确保它在测试环境、预发环境、生产环境都能以完全相同的方式运行,而不会因为环境差异(比如库版本不同、依赖缺失)而出问题?容器化就是解决这个问题的利器。

  • 核心概念: 容器化是一种轻量级的虚拟化技术,它将应用程序代码及其所有依赖项(库、运行时、系统工具、配置文件等)打包到一个标准化的单元中,称为容器镜像 (Container Image)。这个镜像可以在任何支持容器技术的机器上运行,每次运行时都会创建一个隔离的容器实例 (Container Instance)
  • 与虚拟机的区别 (Contrast with VMs):
  • 虚拟机 (VM):在物理硬件上运行一个 Hypervisor(虚拟机监控器),然后在 Hypervisor 上创建包含完整操作系统的虚拟机实例。每个 VM 都有自己的内核、系统文件等,资源开销较大,启动较慢。
  • 容器 (Container):容器共享宿主机 (Host OS) 的操作系统内核,它们只打包应用程序本身及其依赖库和二进制文件。容器内的进程直接运行在宿主机内核上,但在独立的进程空间、文件系统和网络空间中隔离。因此,容器更轻量、启动更快、资源利用率更高
  • Docker 的关键概念:
  • 镜像 (Image):一个只读的模板,包含了运行容器所需的文件系统内容和配置(如应用程序代码、运行时、库、环境变量)。镜像是分层的,可以基于其他镜像构建。
  • 容器 (Container):镜像的运行时实例。你可以启动、停止、删除容器。容器与宿主机和其他容器隔离。
  • Dockerfile: 一个文本文件,包含了一系列指令,用于自动化构建 Docker 镜像。
  • 镜像仓库 (Registry):用于存储和分发 Docker 镜像的服务(如 Docker Hub, Harbor, AWS ECR, GCP Artifact Registry)。
  • 容器化的优势:
  • 可移植性 (Portability):一次构建,随处运行。
  • 一致性 (Consistency):确保开发、测试、生产环境高度一致。
  • 隔离性 (Isolation):应用及其依赖与宿主机和其他容器隔离。
  • 效率与速度 (Efficiency & Speed):启动快,资源占用少。
  • 常用 Docker 命令 (简介):
  • docker build: 根据 Dockerfile 构建镜像。
  • docker run: 基于镜像启动一个新容器。
  • docker ps: 列出正在运行的容器。
  • docker logs: 查看容器的日志输出。
  • docker pull: 从镜像仓库拉取镜像。
  • docker push: 将本地镜像推送到镜像仓库。

为何需要容器编排?(Kubernetes 的由来)

容器化解决了“打包和运行单个应用”的问题,非常棒!但是,当你的应用由几十、几百甚至上千个容器组成,需要部署到多台机器上时,新的挑战又来了:

  • 调度 (Scheduling):如何决定哪个容器运行在哪台机器上,考虑机器资源和容器需求?
  • 扩缩容 (Scaling):如何根据负载自动增加或减少容器实例的数量?
  • 服务发现与负载均衡 (Service Discovery & Load Balancing):容器 IP 是动态变化的,服务之间如何找到对方并进行负载均衡?
  • 存储管理 (Storage):如何为有状态应用(如数据库)提供持久化存储?
  • 自愈能力 (Self-healing):当某个容器或机器宕机时,如何自动替换或重启,保证服务可用?
  • 发布管理 (Rollouts & Rollbacks):如何安全地进行版本更新(如滚动更新)和回滚?

手动管理这一切几乎是不可能的。这时,容器编排 (Container Orchestration) 工具就应运而生了。

Kubernetes (K8s) 基础

Kubernetes(常简称为 K8s)是目前事实上的容器编排标准,是一个开源的、用于自动化容器化应用程序部署、扩展和管理的平台。

  • 核心架构 (简介):
  • 控制平面 (Control Plane):集群的“大脑”,负责管理整个集群的状态。主要组件包括:API Server (提供交互入口), etcd (存储集群状态的分布式键值存储), Scheduler (负责 Pod 调度), Controller Manager (运行各种控制器维护状态)。
  • 节点 (Nodes):工作节点,实际运行容器的地方。主要组件包括:Kubelet (与控制平面通信,管理节点上的 Pod), Kube-proxy (负责网络代理和 Service 的实现), Container Runtime (如 Docker, containerd, CRI-O,负责运行容器)。
  • 关键对象 (你需要了解的基本单元):
  • Pod: K8s 中最小的可部署和调度单元。一个 Pod 包含一个或多个紧密关联的容器(通常是一个主应用容器加可选的 Sidecar 容器),它们共享网络和存储卷。Pod 的生命周期是短暂的,会被动态创建和销毁。
  • Service: 为一组功能相同的 Pod 提供一个稳定的、统一的访问入口(一个虚拟 IP 和 DNS 名称)。Service 负责将请求负载均衡到后端的健康 Pod 上,解决了 Pod IP 变化和服务发现的问题。
  • Deployment: 最常用的管理无状态应用的对象。你声明期望运行的 Pod 副本数量和 Pod 模板(用什么镜像等),Deployment Controller 会自动创建和管理 ReplicaSet,确保实际状态与期望状态一致,并支持滚动更新和回滚策略。
  • ReplicaSet: 确保指定数量的 Pod 副本在任何时候都处于运行状态。(通常你不需要直接操作 ReplicaSet,而是通过 Deployment 来管理它)。
  • Namespace: 提供虚拟的集群隔离机制,可以将一个物理集群划分为多个逻辑集群,用于不同团队、项目或环境(如 dev, staging, prod)。
  • 常用 kubectl 命令 (与 K8s 交互的命令行工具):
  • kubectl get <pods|services|deployments...>: 查看资源列表。
  • kubectl describe <pod|service...>/<name>: 查看资源的详细状态和事件。
  • kubectl logs <pod-name> [-c container-name]: 查看 Pod 内容器的日志。
  • kubectl exec -it <pod-name> -- /bin/bash: 进入运行中的容器执行命令。
  • kubectl apply -f <filename.yaml>: 根据 YAML 文件创建或更新资源。
  • kubectl delete <resource-type>/<name>: 删除资源。

SRE 与容器/K8s 的关系

对于现代 SRE 来说,容器和 Kubernetes 已经成为日常工作的重要组成部分:

  • 平台基础: K8s 通常是 SRE 需要保障其可靠性的底层平台之一。
  • 应用载体: 绝大多数需要 SRE 关注的应用程序都运行在 K8s 之上。
  • 运维对象: SRE 需要监控 K8s 集群本身和运行在上面的应用;排查 Pod 启动失败、服务无法访问、资源不足等问题;使用 K8s 的能力进行应用的发布、扩缩容和故障恢复。
  • IaC/GitOps: SRE 通常会使用 IaC 工具 (如 Terraform) 管理 K8s 集群资源,使用 GitOps 工具 (如 Argo CD, Flux) 管理 K8s 上的应用部署。

总结:现代应用运行的基石

容器化技术(以 Docker 为代表)提供了一种标准化的方式来打包和运行应用,解决了环境一致性和依赖管理的问题。而容器编排平台(以 Kubernetes 为核心)则解决了在规模化场景下管理大量容器的复杂性,提供了自动化部署、扩展、自愈和网络服务等关键能力。

对于 SRE 来说,熟练掌握容器和 K8s 的基本概念、核心对象以及常用操作,是理解和维护现代分布式应用系统可靠性的必备技能。它们是你日常排查问题、实施变更、优化性能的重要阵地。

精彩评论(0)

0 0 举报