kubernetes中文手册
  • 前言
    • 序言
  • 云原生
    • 云原生(Cloud Native)的定义
    • 云原生的设计哲学
    • Kubernetes 的诞生
    • Kubernetes 与云原生应用概览
    • 云原生应用之路 —— 从 Kubernetes 到云原生
    • 定义云原生应用
      • OAM
        • Workload
        • Component
        • Trait
        • Application Scope
        • Application Configuration
      • Crossplane
    • 云原生编程语言
      • 云原生编程语言 Ballerina
      • 云原生编程语言 Pulumi
    • 云原生的未来
  • 快速入门
    • 云原生新手入门指南
    • Play with Kubernetes
    • 快速部署一个云原生本地实验环境
    • 使用 Rancher 在阿里云上部署 Kubenretes 集群
  • 概念与原理
    • Kubernetes 架构
      • 设计理念
      • Etcd 解析
      • 开放接口
        • CRI - Container Runtime Interface(容器运行时接口)
        • CNI - Container Network Interface(容器网络接口)
        • CSI - Container Storage Interface(容器存储接口)
      • 资源对象与基本概念解析
    • Pod 状态与生命周期管理
      • Pod 概览
      • Pod 解析
      • Init 容器
      • Pause 容器
      • Pod 安全策略
      • Pod 的生命周期
      • Pod Hook
      • Pod Preset
      • Pod 中断与 PDB(Pod 中断预算)
    • 集群资源管理
      • Node
      • Namespace
      • Label
      • Annotation
      • Taint 和 Toleration(污点和容忍)
      • 垃圾收集
    • 控制器
      • Deployment
      • StatefulSet
      • DaemonSet
      • ReplicationController 和 ReplicaSet
      • Job
      • CronJob
      • Horizontal Pod Autoscaling
        • 自定义指标 HPA
      • 准入控制器(Admission Controller)
    • 服务发现与路由
      • Service
      • 拓扑感知路由
      • Ingress
        • Traefik Ingress Controller
      • Kubernetes Service API
        • Service API 简介
    • 身份与权限控制
      • ServiceAccount
      • 基于角色的访问控制(RBAC)
      • NetworkPolicy
    • 网络
      • Kubernetes 中的网络解析 —— 以 flannel 为例
      • Kubernetes 中的网络解析 —— 以 calico 为例
      • 具备 API 感知的网络和安全性管理开源软件 Cilium
        • Cilium 架构设计与概念解析
    • 存储
      • Secret
      • ConfigMap
        • ConfigMap 的热更新
      • Volume
      • 持久化卷(Persistent Volume)
      • Storage Class
      • 本地持久化存储
    • 集群扩展
      • 使用自定义资源扩展 API
      • 使用 CRD 扩展 Kubernetes API
      • Aggregated API Server
      • APIService
      • Service Catalog
    • 多集群管理
      • 多集群服务 API(Multi-Cluster Services API)
      • 集群联邦(Cluster Federation)
    • 资源调度
      • 服务质量等级(QoS)
  • 用户指南
    • 用户指南概览
    • 资源对象配置
      • 配置 Pod 的 liveness 和 readiness 探针
      • 配置 Pod 的 Service Account
      • Secret 配置
      • 管理 namespace 中的资源配额
    • 命令使用
      • Docker 用户过渡到 kubectl 命令行指南
      • kubectl 命令概览
      • kubectl 命令技巧大全
      • 使用 etcdctl 访问 Kubernetes 数据
    • 集群安全性管理
      • 管理集群中的 TLS
      • kubelet 的认证授权
      • TLS Bootstrap
      • 创建用户认证授权的 kubeconfig 文件
      • IP 伪装代理
      • 使用 kubeconfig 或 token 进行用户身份认证
      • Kubernetes 中的用户与身份认证授权
      • Kubernetes 集群安全性配置最佳实践
    • 访问 Kubernetes 集群
      • 访问集群
      • 使用 kubeconfig 文件配置跨集群认证
      • 通过端口转发访问集群中的应用程序
      • 使用 service 访问群集中的应用程序
      • 从外部访问 Kubernetes 中的 Pod
      • Cabin - Kubernetes 手机客户端
      • Lens - Kubernetes IDE/桌面客户端
      • Kubernator - 更底层的 Kubernetes UI
    • 在 Kubernetes 中开发部署应用
      • 适用于 Kubernetes 的应用开发部署流程
      • 迁移传统应用到 Kubernetes 中 —— 以 Hadoop YARN 为例
      • 使用 StatefulSet 部署用状态应用
  • 最佳实践
    • 最佳实践概览
    • 在 CentOS 上部署 Kubernetes 集群
      • 创建 TLS 证书和秘钥
      • 创建 kubeconfig 文件
      • 创建高可用 etcd 集群
      • 安装 kubectl 命令行工具
      • 部署 master 节点
      • 安装 flannel 网络插件
      • 部署 node 节点
      • 安装 kubedns 插件
      • 安装 dashboard 插件
      • 安装 heapster 插件
      • 安装 EFK 插件
    • 生产级的 Kubernetes 简化管理工具 kubeadm
      • 使用 kubeadm 在 Ubuntu Server 16.04 上快速构建测试集群
    • 服务发现与负载均衡
      • 安装 Traefik ingress
      • 分布式负载测试
      • 网络和集群性能测试
      • 边缘节点配置
      • 安装 Nginx ingress
      • 安装配置 DNS
        • 安装配置 Kube-dns
        • 安装配置 CoreDNS
    • 运维管理
      • Master 节点高可用
      • 服务滚动升级
      • 应用日志收集
      • 配置最佳实践
      • 集群及应用监控
      • 数据持久化问题
      • 管理容器的计算资源
    • 存储管理
      • GlusterFS
        • 使用 GlusterFS 做持久化存储
        • 使用 Heketi 作为 Kubernetes 的持久存储 GlusterFS 的 external provisioner
        • 在 OpenShift 中使用 GlusterFS 做持久化存储
      • GlusterD-2.0
      • Ceph
        • 用 Helm 托管安装 Ceph 集群并提供后端存储
        • 使用 Ceph 做持久化存储
        • 使用 rbd-provisioner 提供 rbd 持久化存储
      • OpenEBS
        • 使用 OpenEBS 做持久化存储
      • Rook
      • NFS
        • 利用 NFS 动态提供 Kubernetes 后端存储卷
    • 集群与应用监控
      • Heapster
        • 使用 Heapster 获取集群和对象的 metric 数据
      • Prometheus
        • 使用 Prometheus 监控 Kubernetes 集群
        • Prometheus 查询语言 PromQL 使用说明
      • 使用 Vistio 监控 Istio 服务网格中的流量
    • 分布式追踪
      • OpenTracing
    • 服务编排管理
      • 使用 Helm 管理 Kubernetes 应用
      • 构建私有 Chart 仓库
    • 持续集成与发布
      • 使用 Jenkins 进行持续集成与发布
      • 使用 Drone 进行持续集成与发布
    • 更新与升级
      • 手动升级 Kubernetes 集群
      • 升级 dashboard
    • 扩展控制器
      • OpenKruise
        • 原地升级
    • 安全策略
      • 开放策略代理(OPA)
      • 云原生安全
  • 服务网格
    • 服务网格(Service Mesh)
    • 企业级服务网格架构
      • 服务网格基础
      • 服务网格技术对比
      • 服务网格对比 API 网关
      • 采纳和演进
      • 定制和集成
      • 总结
    • Istio
      • 使用 Istio 前需要考虑的问题
      • Istio 中 sidecar 的注入规范及示例
      • 如何参与 Istio 社区及注意事项
      • Istio 免费学习资源汇总
      • Sidecar 的注入与流量劫持
      • Envoy Sidecar 代理的路由转发
      • Istio 如何支持虚拟机
      • Istio 支持虚拟机的历史
    • Envoy
      • Envoy 的架构与基本术语
      • Envoy 作为前端代理
      • Envoy mesh 教程
  • 领域应用
    • 领域应用概览
    • 微服务架构
      • 微服务中的服务发现
      • 使用 Java 构建微服务并发布到 Kubernetes 平台
        • Spring Boot 快速开始指南
    • 大数据
      • Spark 与 Kubernetes
        • Spark standalone on Kubernetes
        • 运行支持 Kubernetes 原生调度的 Spark 程序
    • Serverless 架构
      • 理解 Serverless
      • FaaS(函数即服务)
        • OpenFaaS 快速入门指南
      • Knative
    • 边缘计算
    • 人工智能
    • 可观察性
  • 开发指南
    • 开发指南概览
    • SIG 和工作组
    • 开发环境搭建
      • 本地分布式开发环境搭建(使用 Vagrant 和 Virtualbox)
    • 单元测试和集成测试
    • client-go 示例
      • client-go 中的 informer 源码分析
    • Operator
      • operator-sdk
    • kubebuilder
      • 使用 kubebuilder 创建 operator 示例
    • 高级开发指南
    • 社区贡献
    • Minikube
  • 社区及生态
    • 云原生计算基金会(CNCF)
      • CNCF 章程
      • CNCF 特别兴趣小组(SIG)说明
      • 开源项目加入 CNCF Sandbox 的要求
      • CNCF 中的项目治理
      • CNCF Ambassador
    • 认证及培训
      • 认证 Kubernetes 服务提供商(KCSP)说明
      • 认证 Kubernetes 管理员(CKA)说明
  • 附录
    • 附录说明
    • Kubernetes 中的应用故障排查
    • Kubernetes 相关资讯和情报链接
    • Docker 最佳实践
    • Kubernetes 使用技巧
    • Kubernetes 相关问题记录
    • Kubernetes 及云原生年度总结及展望
      • Kubernetes 与云原生 2017 年年终总结及 2018 年展望
      • Kubernetes 与云原生 2018 年年终总结及 2019 年展望
    • CNCF 年度报告解读
      • CNCF 2018 年年度报告解读
      • CNCF 2020 年年度报告解读
由 GitBook 提供支持
在本页
  • 角色
  • 资源模型
  • GatewayClass
  • Gateway
  • {HTTP,TCP,Foo} Route
  • BackendPolicy
  • 路由绑定
  • 组合类型
  • 请求流程
  • TLS 配置
  • 扩展点
  1. 概念与原理
  2. 服务发现与路由
  3. Kubernetes Service API

Service API 简介

上一页Kubernetes Service API下一页身份与权限控制

最后更新于3年前

在了解了 Service API 的 后,接下来我们再看下它的资源模型、请求流程、TLS 配置及扩展点等。

角色

Service API 开发者为其使用场景定义四类角色:

  • 基础设施提供方:如 AWS、GKE 等

  • 集群运维:管理整个集群的计算、存储、网络、安全等

  • 应用程序开发者:为自己开发的应用负责,管理应用的健壮性

  • 应用管理员:不是所有的公司都有,通常在一些复杂系统中会有专门的应用管理员

资源模型

注意:资源最初将作为 CRD 存在于 networking.x-k8s.io API 组中。未限定的资源名称将隐含在该 API 组中。

Service API 的资源模型中,主要有三种类型的对象:

  • GatewayClass:定义了一组具有共同配置和行为的网关。

  • Gateway:请求一个点,在这个点上,流量可以被翻译到集群内的服务。

  • Route:描述了通过 Gateway 而来的流量如何映射到服务。

GatewayClass

GatewayClass 定义了一组共享共同配置和行为的 Gateway,每个 GatewayClass 由一个控制器处理,但控制器可以处理多个 GatewayClass。

GatewayClass 是一个集群范围的资源。必须至少定义一个 GatewayClass,Gateway 才能够生效。实现 Gateway API 的控制器通过关联的 GatewayClass 资源来实现,用户可以在自己的 Gateway 中引用该资源。

Gateway

Gateway 描述了如何将流量翻译到集群内的服务。也就是说,它定义了一个方法,将流量从不了解 Kubernetes 的地方翻译到了解 Kubernetes 的地方。例如,由云负载均衡器、集群内代理或外部硬件负载均衡器发送到 Kubernetes 服务的流量。虽然许多用例的客户端流量源自集群的 "外部",但这并不强求。

Gateway 定义了对实现 GatewayClass 配置和行为合同的特定负载均衡器配置的请求。该资源可以由运维人员直接创建,也可以由处理 GatewayClass 的控制器创建。

由于 Gateway 规范捕获了用户意图,它可能不包含规范中所有属性的完整规范。例如,用户可以省略地址、端口、TLS 设置等字段。这使得管理 GatewayClass 的控制器可以为用户提供这些设置,从而使规范更加可移植。这种行为将通过 GatewayClass 状态对象来明确。

一个 Gateway 可以包含一个或多个 Route 引用,这些 Route 引用的作用是将一个子集的流量引导到一个特定的服务上。

{HTTP,TCP,Foo} Route

Route 对象定义了特定协议的规则,用于将请求从 Gateway 映射到 Kubernetes 服务。

HTTPRoute 和 TCPRoute 是目前唯一已定义的 Route 对象。未来可能会添加其他特定协议的 Route 对象。

BackendPolicy

BackendPolicy 提供了一种配置 Gateway 和后端之间连接的方法。在这个 API 中,后端是指路由可以转发流量的任何资源。后端的一个常见例子是 Service。这个级别的配置目前仅限于 TLS,但将来会扩展到支持更高级的策略,如健康检查。

路由绑定

当 Route 绑定到 Gateway 时,代表应用在 Gateway 上的配置,配置了底层的负载均衡器或代理。哪些 Route 如何绑定到 Gateway 是由资源本身控制的。Route 和 Gateway 资源具有内置的控制,以允许或限制它们之间如何相互选择。这对于强制执行组织政策以确定 Route 如何暴露以及在哪些 Gateway 上暴露非常有用。看下下面的例子。

一个 Kubernetes 集群管理员在 Infra 命名空间中部署了一个名为 shared-gw 的 Gateway,供不同的应用团队使用,以便将其应用暴露在集群之外。团队 A 和团队 B(分别在命名空间 "A" 和 "B" 中)将他们的 Route 绑定到这个 Gateway。它们互不相识,只要它们的 Route 规则互不冲突,就可以继续隔离运行。团队 C 有特殊的网络需求(可能是性能、安全或关键性),他们需要一个专门的 Gateway 来代理他们的应用到集群外。团队 C 在 "C" 命名空间中部署了自己的 Gateway specialive-gw,该 Gateway 只能由 "C" 命名空间中的应用使用。

不同命名空间及 Gateway 与 Route 的绑定关系如下图所示。

在如何将路由与网关绑定以实现不同的组织政策和责任范围方面,有很大的灵活性。下面是网关和路由之间可能的对应关系:

  • 一对一:网关和路由可以由一个所有者部署和使用,并具有一对一的关系。团队 C 就是一个例子。

  • 一对多:一个网关可以有许多路由与之绑定,这些路由由来自不同命名空间的不同团队所拥有。团队 A 和 B 就是这样的一个例子。

  • 多对一:路由也可以绑定到多个网关,允许一个路由同时控制不同 IP、负载均衡器或网络上的应用暴露。

总之,网关选择路由,路由控制它们的暴露。当网关选择一个允许自己暴露的路由时,那么该路由将与网关绑定。当路由与网关绑定时,意味着它们的集体路由规则被配置在了由该网关管理的底层负载均衡器或代理服务器上。因此,网关是一个网络数据平面的逻辑表示,可以通过路由进行配置。

路由选择

Gateway 根据 Route 元数据,特别是 Route 资源的种类、命名空间和标签来选择 Route。Route 实际上被绑定到 Gateway 中的特定监听器上,因此每个监听器都有一个 listener.routes 字段,它通过以下一个或多个标准来选择 Route。

  • Label:Gateway 可以通过资源上存在的标签来选择 Route(类似于 Service 通过 Pod 标签选择 Pod 的方式)。

  • Kind:网关监听器只能选择单一类型的路由资源。可以是 HTTPRoute、TCPRoute 或自定义 Route 类型。

  • Namespace:Gateway 还可以通过 namespaces.from 字段控制可以从哪些 Namespace、 Route 中选择。它支持三种可能的值。

    • SameNamespace 是默认选项。只有与该网关相同的命名空间中的路由才会被选择。

    • All 将选择来自所有命名空间的 Route。

    • Selector 意味着该网关将选择由 Namespace 标签选择器选择的 Namespace 子集的 Route。当使用 Selector 时,那么 listeners.route.namespaces.selector 字段可用于指定标签选择器。All 或 SameNamespace 不支持该字段。

下面的 Gateway 将在集群中的所有 Namespace 中选择 expose: prod-web-gw 的所有 HTTPRoute 资源。

kind: Gateway
...
spec:
  listeners:  
  - routes:
      kind: HTTPRoute
      selector:
        matchLabels:
          expose: prod-web-gw 
      namespaces:
        from: All

路由暴露

路由可以决定它们如何通过网关暴露。gateways.allow 字段支持三个值。

  • All:如果没有指定,则是默认值。这使得所有的 Route 标签和 Namespace 选择器都绑定在网关上。

  • SameNamespace 只允许该路由与来自同一 Namespace 的网关绑定。

  • FromList 允许指定一个明确的网关列表,以便路由与之绑定。

下面的 my-route Route 只选择 foo-namespace 中的 foo-gateway,而不能与其他 Gateway 绑定。注意,foo-gateway 与 my-route 在不同的 Namespace 中。如果 foo-gateway 允许跨 Namespace 绑定,并且也选择了这个 Route,那么 my-route 就会与之绑定。

kind: HTTPRoute
metadata:
  name: my-route
  namespace: bar-namespace
spec:
  gateways:
    allow: FromList
    gatewayRefs:
    - name: foo-gateway
      namespace: foo-namespace

请注意,网关和路由的绑定是双向的。这意味着两个资源必须相互选择才能绑定。如果一个Gateway的Route标签选择器不匹配任何现有的Route,那么即使Route的spec.gateways.allow = All,也不会有任何东西与之绑定。同样,如果一个Route引用了一个特定的Gateway,但该Gateway没有选择Route的Namespace,那么它们也不会绑定。只有当两个资源相互选择时,才会发生绑定。

从资源规范中可能并不总是能明显看出哪些网关和路由是绑定的,但可以通过资源状态来确定绑定。路由状态将列出路由所绑定的所有网关以及绑定的任何相关条件。

组合类型

GatewayClass、Gateway、xRoute 和 Service 的组合将定义一个可实现的负载均衡器。下图说明了不同资源之间的关系。

请求流程

使用反向代理实现的网关的一个典型的客户端 / 网关 API 请求流程是:

  • 客户端向 http://foo.example.com 发出请求。

  • DNS 将该名称解析为网关地址。

  • 可选地,反向代理可以根据 HTTPRoute 的匹配规则执行请求头和 / 或路径匹配。

  • 可选地,反向代理可以根据 HTTPRoute 的过滤规则修改请求,即添加 / 删除头。

  • 最后,反向代理可以根据 HTTPRoute 的 forwardTo 规则,将请求转发到集群中的一个或多个对象,即 Service。

TLS 配置

TLS 配置在 Gateway 监听器上。此外,对于某些自助服务用例,TLS 证书可以配置在路由对象上。

扩展点

API 中提供了一些扩展点,以灵活处理大量通用 API 无法处理的用例。

以下是 API 中扩展点的摘要。

  • XRouteMatch.ExtensionRef:这个扩展点应该用来扩展特定核心 Route 的匹配语义。这是一个实验性的扩展点,未来会根据反馈进行迭代。

  • XForwardTo.BackendRef:这个扩展点应该用于将流量转发到核心 Kubernetes 服务资源以外的网络端点。例如 S3 bucket、Lambda 函数、文件服务器等。

  • HTTPRouteFilter:HTTPRoute 为这一 API 类型提供了一种方法,可以钩入 HTTP 请求的请求 / 响应生命周期。

  • 自定义路由:如果上述扩展点都不能满足用例的需求,实现者可以选择为目前 API 中不支持的协议创建自定义路由资源。

这类似于 Ingress 的 和 PersistentVolumes 的 。在 Ingress v1beta1 中,最接近 GatewayClass 的是 ingress-class 注解,而在 IngressV1 中,最接近的类似物是 IngressClass 对象。

一些后端配置可能会根据针对后端的 Route 而有所不同。在这些情况下,配置字段将放在 Route 上,而不是 BackendPolicy 上。有关该资源未来可能配置的更多信息,请参考相关的 。

反向代理在 Listener 上接收请求,并使用 来匹配 HTTPRoute。

目的
IngressClass
StorageClass
GitHub issue
Host 头
路由绑定示意图
Service API 流程图