Kubernetes CSI 简介:工作流程和原理
本文将会以 CSI driver - NFS 为例,讲述 CSI
驱动的工作流程和原理。
CSI 概述
CSI
驱动通常分为两个部分:
Controller plugin
: 负责存储资源的管理,如卷的创建、删除、扩容、快照等。Node plugin
: 处理节点级别的存储操作,负责在具体的节点上执行卷的挂载和卸载等任务。
本文将会以 CSI driver - NFS 为例,讲述 CSI
驱动的工作流程和原理。
CSI
驱动通常分为两个部分:
Controller plugin
: 负责存储资源的管理,如卷的创建、删除、扩容、快照等。Node plugin
: 处理节点级别的存储操作,负责在具体的节点上执行卷的挂载和卸载等任务。在容器化技术的演进中,OCI
(Open Container Initiative)提供了一套标准化的规范,帮助统一容器的构建、分发和运行。OCI
规范包含三个部分:
kubectl
是与 Kubernetes 集群交互的命令行工具,用户通过它可以对集群资源进行操作和管理。你有没有想过,当我们执行一条 kubectl
命令之后,背后都发生了什么?
根据通信类型,我把 kubectl
命令分为两类:单向通信和双向通信。
在互联网早期,随着连接设备数量的增加,IP 地址的管理与记忆变得越来越复杂。为了简化网络资源的访问,DNS
(Domain Name System)应运而生。DNS
的核心作用是将用户可读的域名(如 www.example.com)解析为对应的 IP 地址(如 93.184.215.34),从而使用户无需记忆复杂的数字串,便能轻松访问全球各地的网络资源。
网络是容器通信的基础,Kubernetes 本身并未提供开箱即用的网络互通功能,只提出了两点基本要求:
- pods can communicate with all other pods on any other node without NAT
- agents on a node (e.g. system daemons, kubelet) can communicate with all pods on that node
至于如何实现这些通信能力,通常依赖于 CNI
插件来完成。
当一个新的 Pod 被提交创建之后,Kubelet
、CRI
、CNI
这三个组件之间进行了哪些交互?
如上图所示:
Kubelet
从 kube-api-server 处监听到有新的 pod 被调度到了自己的节点且需要创建。Kubelet
创建 sandbox 并配置好 Pod 的环境,其中包括:Kubelet
通过 gRPC 调用 CRI
组件创建 sandbox。CRI
通过命令行调用 CNI
设置 pod 的网络。Kubelet
创建 container 阶段:CRI
拉取镜像。CRI
创建 container。CRI
启动 container。注意:
随着 Kubernetes 在云原生领域的广泛使用,流量管理成为了至关重要的一环。为了有效地管理从外部流入集群的流量,Kubernetes 提供了多种解决方案,其中最常见的是 Ingress
和新兴的 Gateway API
。
常见的网络拓扑结构如下图所示:
在此拓扑中,终端设备通过 WiFi 连接到路由器,路由器再连接到光猫(或终端设备通过移动网络 4G/5G 连接到基站),之后 ISP 网络服务提供商接管网络通信,将请求最终转发至应用服务器。
本文基于《Designing Data-Intensive Applications》一书(设计数据密集型应用,简称 DDIA
),深入探讨了 Redis
、Kafka
和 Elasticsearch
等常用组件的分区与复制机制。通过这些案例分析,我们可以更好地理解分布式系统的基本原理和实际应用。
本文将会描述一个典型的系统架构,然后分析其在理论上是否能够支撑百万并发的请求。
为了降低复杂性,笔者将系统简化为了下图所示: