Posts for: #Kubernetes

Introducing Kubernetes Gateway API

Kubernetes Gateway API 是一个由 SIG-Network 孵化和维护的 开放、标准、可扩展的 API,旨在为 Kubernetes 集群内部和外部的统一流量管理提供更强大、更灵活、更具表现力的方式。

它被视为 Ingress API 的继任者和演进,解决了 Ingress 在灵活性、可扩展性、角色分离和 L4-L7 支持方面的诸多局限性。Gateway API 不仅仅关注 HTTP 流量,还支持 TCP、UDP 以及 TLS 路由,覆盖了更广泛的网络场景。

为什么需要 Gateway API

在 Gateway API 出现之前,Kubernetes 主要使用 Ingress 来管理集群的 L7 HTTP/HTTPS 流量。然而,Ingress 存在一些固有的局限性,促使了 Gateway API 的诞生:

  1. 功能有限: Ingress 本身功能非常基础,只支持主机和路径路由。任何高级功能(如流量拆分、重写、限速、认证等)都必须通过特定于 Ingress 控制器(如 NGINX Ingress, Traefik, AWS ALB Ingress 等)的 注解(Annotations) 来实现。
  2. 可移植性差: 注解是特定于实现的,这意味着用 NGINX Ingress 注解编写的规则无法直接移植到 Traefik 或其他 Ingress 控制器上,造成供应商锁定。
  3. 缺乏角色分离: Ingress 资源将网络基础设施的配置(例如暴露的端口、TLS 证书)与应用程序的路由规则混在一起,这使得集群管理员和应用开发者之间的职责难以清晰划分。
  4. L4 流量支持不足: Ingress 仅专注于 HTTP/HTTPS (L7) 流量。对于 TCP、UDP 或 TLS 直通(Passthrough)等 L4 流量,通常需要使用 LoadBalancer 类型的 Service 或其他的解决方案。
  5. 表达能力有限: 难以表达复杂的路由策略,如基于请求头、查询参数的匹配,细粒度的流量权重分配等。

Gateway API 旨在解决这些问题,提供一个更加健壮和通用的流量管理框架。

Kubernetes CSI 简介

K8s CSI 是 Kubernetes 中非常重要的一个组件,它解决了存储与计算分离的复杂性,并为容器化应用提供了持久化存储的能力。

1. 基本概念

CSI (Container Storage Interface) 译为 容器存储接口。它是由 Kubernetes 社区与存储厂商共同制定的一套标准接口规范。

在 CSI 出现之前,Kubernetes 存储插件的开发和管理存在以下痛点:

  • 紧耦合问题: Kubernetes 内部集成了大量的存储驱动(In-tree 存储插件),例如 AWS EBS、GCE PD、Azure Disk、Ceph RBD 等。这意味着每当存储厂商需要支持 Kubernetes 时,他们都必须将其存储驱动代码提交到 Kubernetes 的核心代码库中。这种方式导致了:
    • Kubernetes 代码库臃肿: 集成了大量存储逻辑,增加了核心代码的复杂性和维护难度。
    • 发布周期长: 存储驱动的更新需要跟随 Kubernetes 的发布周期,新功能和 bug 修复不能及时推送到用户。
    • 存储厂商开发受限: 每次更新都需要与 Kubernetes 社区协调,开发和测试流程繁琐。
  • 兼容性问题: 不同存储厂商的存储系统差异巨大,缺乏统一的接口规范,导致存储系统与 Kubernetes 之间的集成困难。

CSI 的目标就是解决这些问题,实现存储系统与 Kubernetes 的解耦。 它定义了一套通用的接口,允许任何存储厂商开发自己的 CSI 驱动,然后通过这些驱动来与 Kubernetes 进行交互,从而为容器提供存储服务。

1.1. 资源定义

1.1.1. Volumes

Volumes 是 Kubernetes 中 Pod 通过文件系统访问和共享数据的抽象。它主要提供了如下功能:

  • 通过 ConfigMap 或者 Secret 共享配置;
  • 跨容器、跨 Pod 甚至跨 Node 共享数据;
  • 数据持久化。在 Pod 销毁之后仍能继续访问数据。 对于 Pod 来说,Volumes 通过 .spec.volumes 提供给 Pod,容器通过 .spec.containers[*].volumeMounts 来将指定 Volumes 挂载到指定目录。

1.1.2. Persistent Volumes 和 Persistent Volumes Claim

PV 和 PVC 提供了两套 API 将存储的提供和消费分离。