第 10 期 / 共 10 期 · 收官

MCP / 证书 / hgctl / 收官

补齐周边能力——MCP Server 托管、自动证书、命令行工具、可观测、测试与性能调优,最后给出后续学习与贡献的路线建议。

L01

MCP 协议概念

Model Context Protocol(MCP)由 Anthropic 提出,定义"工具 / 资源"对 LLM 的统一暴露方式。Higress 把网关变成 MCP 中枢:客户端连接到 Higress,背后任意 MCP Server。

注意:代码中还有另一个 mcp 指 Mesh Configuration Protocol(Istio 老协议),别混淆。

思考:MCP 与 OpenAPI Function Calling 关系?答:互补,前者偏服务端协议,后者偏调用语义。
L02

McpServer CRD

apiVersion: networking.higress.io/v1
kind: McpServer
metadata: { name: amap, namespace: higress-system }
spec:
  type: external          # 或 internal
  domain: mcp.example.com
  port: 443
  toolsDescription: "..."  # LLM 可读的工具说明

Higress 据此把这个 MCP Server 暴露到上游 Cluster,并由 mcp-router 插件路由请求。

思考:toolsDescription 给谁看?答:LLM 客户端与 ai-agent 插件。
L03

mcp-router 插件

extensions/mcp-router/ 解析 JSON-RPC 请求里的 method(如 tools/call),根据 params 与配置选择目标 MCP Server upstream。它扮演的角色类似"反向代理路由器",让多个 MCP Server 共享一个入口。

思考:method 维度路由如何与 host 路由配合?答:通常 host 选业务线,method 选具体 Server。
L04

mcp-server 内建

plugins/wasm-go/mcp-servers/ 内置了若干官方 MCP Server 实现:高德地图、GitHub、Notion 等。它们以 Wasm 形态跑在 Envoy 内,不需要独立部署。

思考:内建 vs 外部 MCP Server 选择?答:简单 + 高频选内建;复杂 + 状态化选外部。
L05

pkg/ingress/mcp 协议

这里的 mcp 是 Istio 的 Mesh Configuration Protocol。Higress 用它把配置推给"外部 Pilot"(如已存在的 Istiod),适合多 Pilot 共存的复杂场景。大多数自部署 Higress 不会用到

思考:什么时候才用得着?答:在已有 Istio 集群里只挂 Higress 控制面。
L06

证书 pkg/cert 概览

pkg/cert/
  certmgr.go     # 对外 CertManager
  config.go      # ACME 配置
  controller.go  # Ingress / Secret 监听
  server.go      # ACME HTTP-01 挑战 server
  storage.go     # 证书持久化
  ingress.go     # 与 Ingress 绑定
  secret.go      # 写 Secret
  util.go        # 工具
思考:为什么 Cert 也要单独一个 controller?答:与 Ingress 控制器解耦,按需启用。
L07

CertManager

certmgr.go 维护 ACME account / 已签发证书列表,调度续签 goroutine。被 bootstrap.initAutomaticHttps 拉起。

思考:CertManager 重启后状态怎么恢复?答:从 ConfigMap / Secret 反推。
L08

ACME HTTP-01 server

server.go 启动一个 HTTP server 监听 80 端口的 /.well-known/acme-challenge/,把 token 返回给 CA。完成验证后 CA 返回证书。

思考:80 端口被 Envoy 占用,Higress 怎么解决?答:通过 EnvoyFilter 把该路径路由回 controller pod。
L09

证书存储 Secret

签发完证书写入名为 {domain}-tls 的 Secret,Higress Gateway 通过 SDS 加载。私钥仅在 Secret + Envoy 内存中,不落盘到任何业务容器。

思考:手动 Secret 与自动 Secret 共存时谁优先?答:通常手动优先,自动只填充缺失。
L10

续签调度

过期前 30 天触发续签;失败按指数退避重试;续签后写新 Secret 触发 SDS。证书更替 Envoy 不丢连接,热加载。

思考:长连接 keepalive 与证书更替谁赢?答:旧连接继续用旧证书,新连接使用新证书。
L11

hgctl 命令树

hgctl
├── install     # 装 Higress (基于 Helm)
├── uninstall
├── upgrade
├── plugin      # 插件管理:list/install/test
├── profile     # 安装 profile
├── version
├── docs        # 启动本地文档站
└── debug       # 调试工具

位于 hgctl/,~20k 行 Go。是运维与开发的瑞士军刀。

思考:与 kubectl 关系?答:hgctl 包了 helm + 自定义动作,比 kubectl 高层。
L12

hgctl install

命令实现走的是 helm SDK:渲染 helm/ 下的 chart → 调 K8s API 创建。支持 --set 与 profile(default / ai / local 等)。源代码可看 hgctl/cmd/install.go

思考:profile 与 values.yaml 关系?答:profile 是一组预设 values。
L13

hgctl plugin

插件开发链:

  • hgctl plugin build:调 TinyGo 编译。
  • hgctl plugin test:本地起 Envoy 跑 .wasm。
  • hgctl plugin install:构造 WasmPlugin YAML 一键 apply。
思考:本地测试 Envoy 镜像哪里来?答:hgctl 用 docker 拉对应 tag。
L14

可观测:metrics

控制面用 Istio 默认的 Prometheus 指标 + grpc_prometheus。数据面 Envoy 的 stats 走 envoy admin / Prometheus。Higress 在 ConfigMap 里可控制是否打开 detailed metrics(按 host / route 维度)。

思考:High-cardinality 指标怎么避免爆 Prometheus?答:sampling / labels drop。
L15

可观测:tracing

支持 OTLP / Zipkin / SkyWalking。配置在 ConfigMap higress-configtracing 字段。控制面只下发配置,trace 数据从 Envoy 直接打到 collector,控制面不在数据路径。

思考:trace 采样率怎么配?答:mesh.defaultConfig.tracing.sampling。
L16

可观测:access log

Higress 默认 JSON access log,关键字段含 cluster / route_name / response_code / upstream_host / x-request-id。AI 流量额外有 model / tokens 字段(来自 ai-statistics 插件)。

思考:如何把 access log 推给 SLS / Loki?答:filebeat / fluent-bit 标准做法。
L17

e2e 测试体系

test/e2e/      # Higress 自研端到端
test/gateway/  # Gateway API conformance

e2e 起 kind 集群,安装 Higress,部署样例服务,发请求断言。新功能 PR 通常要求附带 e2e。

思考:本地跑 e2e 需要什么?答:docker + kind + make e2e。
L18

性能调优建议

  • 控制面:调大 DebounceAfter(10ms→100ms),减少 push 风暴。
  • 数据面:合理设置 worker 数 = CPU 核数;开 H2/H3。
  • Wasm:避免大对象 allocation;HttpCall 并发数控制。
  • 多注册中心:尽量减少 watcher 数;用增量协议(Nacos2)。
思考:插件 CPU 占比高时如何归因?答:Envoy stats 里的 wasm.cpu.ns 指标。
L19

贡献者路线

  1. 从修一个 annotations/*_test.go 失败用例或文档错别字开始。
  2. 给 ai-proxy 加一个新模型 provider(参考 deepseek.go)。
  3. 给 IngressConfig 新增一个 annotation 支持。
  4. 写一个 Wasm 插件解决团队真实问题,提交到 extensions/ 收纳。
  5. 关注 release-notes 与 issue 走向,参与设计讨论。
思考:开源贡献最难的是什么?答:保持 review 沟通节奏,不是写代码。
L20

200 讲学完之后

你现在应该能回答

  1. 一条 Ingress YAML 怎么变成 Envoy 配置(控制面)。
  2. 一个 AI 请求怎么经过 Higress 到达 LLM 并返回(数据面)。
  3. 怎么扩展注解 / 注册中心 / Wasm 插件 / LLM Provider(开发)。
  4. 怎么定位线上配置不生效(运维)。

下一步

  • 动手:开一个 PR。
  • 阅读:把 release-notes/ 按时间倒序读一遍,看项目方向。
  • 分享:把这 10 期内容内化成自己的文档,输出比输入更检验掌握。
感谢一路读完 10 期 200 讲。Higress 是一个仍在快速演进的项目,把"核心架构稳定 / 周边能力快速迭代"作为它的脾气,遇到代码细节与本系列不一致时以仓库当前状态为准,思想仍然适用。