在云原生与多云混合架构成为主流的今天,企业常常面临一个核心挑战:如何高效、统一地管理部署在不同云厂商、私有云或 Kubernetes 集群中的微服务?传统的点对点服务集成方式不仅繁琐,更会带来极高的维护成本和稳定性风险。
腾讯云微服务引擎 TSE(Tencent Cloud Service Engine)提供的 MCP(Mesh Control Plane) 功能,正是为解决这一难题而生。它基于 SMI(Service Mesh Interface)标准中的 MCP(Mesh Configuration Protocol) 协议,扮演了一个“云间服务枢纽”的角色,允许不同的服务网格数据平面(如 Istio)从其集中式控制平面同步服务与路由配置。本文将深入解析 MCP 的核心原理,并手把手带你完成基于 MCP 广场的完整配置流程。
MCP 是一个开放协议,用于在服务网格控制平面和其后端配置存储系统之间传输动态配置信息。你可以将它类比为 Kubernetes 中的 kube-apiserver
,它是一个提供资源的唯一事实来源(Single Source of Truth)的服务器。
在腾讯云的语境下,TSE MCP 广场 就是这个“配置存储系统”或“资源源”。它将腾讯云上注册的服务、其他云或集群中的服务抽象成标准化的资源(如 Service
, VirtualService
, DestinationRule
等),并通过 MCP 协议提供给一个或多个订阅了它的服务网格控制平面(如 TSE Istio)。
istiod
)。ClientResource
消息,告知 Server 它需要订阅哪些资源(如 type.googleapis.com/envoy.config.route.v3.RouteConfiguration
)。istiod
) 接收到新配置后,会将其转换为 xDS 配置,再下发给其下辖的众多数据面 Envoy 代理。(示意图:展示了 MCP Server 与 Client 之间的资源订阅与增量推送流程)
下面我们将一步步演示如何将一个外部的服务网格(假设是自建 Istio)连接到腾讯云 TSE MCP 广场,从而消费其上的服务信息。
前提条件:
istiod
版本建议为 1.9+)。my-onpremise-cluster
),类型选择“Kubernetes”,并填写集群的 API Server 地址和认证信息(Kubeconfig)。MCP 支持多种传输层协议,SSE(Server-Sent Events)是其中一种便于测试和简单使用的基于 HTTP 的协议。
https://your-mcp-instance-id.mcp.tencentcloudapi.com/v1/resources?sse=true
这是最核心的一步。我们需要修改 istiod
的部署配置,让其从腾讯云 MCP 广场拉取配置。
方式一:通过 Helm Values 配置(推荐)
如果你使用 Helm 管理 Istio,可以在 values.yaml
中添加以下配置:
# values.yaml
meshConfig:
# 在 defaultConfig 中指定额外的根 CA(如果腾讯云 MCP 使用私有证书则可能需要)
defaultConfig:
proxyMetadata:
# 通常不需要,除非有特定代理设置
pilot:
env:
# 启用 MCP 客户端功能
ENABLE_MCP: "true"
# 禁用原有的 Galley(如果版本较低),高版本 Istio 已无 Galley
# ENABLE_LEGACY_MCP: "false"
# 配置 MCP Server 地址
configSource:
- address:
- your-mcp-instance-id.mcp.tencentcloudapi.com:443 # 你的 SSE URL 的主机名和端口
tlsSettings:
mode: SIMPLE # 使用 TLS
# 如果服务器使用公共可信证书,则 sni 可省略或设置为相同域名
sni: your-mcp-instance-id.mcp.tencentcloudapi.com
# 指定 MCP 协议为 SSE-over-HTTP
protocol: "HTTP_SSE"
# 资源订阅列表,指定你希望从该 Server 获取哪些类型的资源
resourceTypes:
- type.googleapis.com/istio.networking.v1alpha3.ServiceEntry
- type.googleapis.com/istio.networking.v1alpha3.VirtualService
- type.googleapis.com/istio.networking.v1alpha3.DestinationRule
- type.googleapis.com/istio.security.v1beta1.AuthorizationPolicy
# HTTP 认证 Header(使用腾讯云签名方法 v3)
httpAuth:
# 这是一个自定义的 Auth Header 注入方式。
# 实际上,Istio 原生可能不直接支持腾讯云复杂的签名算法。
# 更常见的做法是使用一个 sidecar 代理来完成签名,如下文方式二所述。
custom:
# 通常需要在这里注入 Authorization Header,但签名计算复杂,建议看方式二
重要提示:直接通过 httpAuth
注入腾讯云签名可能非常复杂,因为签名算法涉及多次哈希和特定格式组装。更可靠的方案是使用一个 Sidecar 代理 来处理请求转发和签名。
方式二:使用 Sidecar 代理进行认证(更可行方案)
1、 编写一个简单的代理程序(例如使用 Python Flask)。这个程序运行在 istiod
Pod 中,接收 istiod
的明文 HTTP SSE 请求,然后将其转发给腾讯云 MCP 广场,并在转发前为请求加上正确的腾讯云签名 v3 的 Authorization Header。 sign_proxy.py
示例(简化概念):
from flask import Flask, request, stream_template
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.signature import sign
import requests
app = Flask(__name__)
TENCENT_MCP_URL = 'https://your-mcp-instance-id.mcp.tencentcloudapi.com/v1/resources?sse=true'
SECRET_ID = 'your_secret_id'
SECRET_KEY = 'your_secret_key'
def get_authorization_header(method, endpoint, data='', content_type='application/json'):
# 使用腾讯云 SDK 或自定义方法生成签名 Header
# 此处为示意,实际签名逻辑非常复杂,请严格参考官方文档:
# https://cloud.tencent.com/document/product/1275/55565
cred = credential.Credential(SECRET_ID, SECRET_KEY)
http_profile = HttpProfile(endpoint="mcp.tencentcloudapi.com", reqMethod=method, reqTimeout=30)
client_profile = ClientProfile(httpProfile=http_profile)
# ... 根据签名算法要求构造规范请求并签名 ...
# 返回 Authorization 头,例如 'TC3-HMAC-SHA256 Credential=AKID***...'
authorization = sign(cred, method, endpoint, data, content_type)
return authorization
@app.route('/v1/resources', methods=['GET', 'POST'])
def proxy():
# 1. 获取 istiod 发来的原始请求内容(对于 SSE GET 请求,可能没有 body)
# 2. 生成指向腾讯云 MCP 的签名 Header
auth_header = get_authorization_header('GET', '/v1/resources')
headers = {key: value for (key, value) in request.headers}
headers['Authorization'] = auth_header
# 3. 将请求转发到腾讯云 MCP,并流式传输响应回 istiod
resp = requests.get(TENCENT_MCP_URL, headers=headers, stream=True)
return stream_template(resp.iter_content(chunk_size=None))
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)
2、 修改 istiod
部署,添加这个代理作为 Sidecar,并让 istiod
的配置源指向这个本地代理。
# 在 istiod 的 Deployment 中添加一个 sidecar 容器
spec:
template:
spec:
containers:
- name: istiod
# ... 原有配置 ...
# 修改 configSource,指向本地 sidecar 代理
env:
- name: PILOT_MCP_CONFIGSOURCE_ADDRESS
value: "localhost:8080" # 指向本地代理
- name: PILOT_MCP_CONFIGSOURCE_PROTOCOL
value: "HTTP_SSE"
- name: mcp-auth-proxy # 新增的代理 Sidecar
image: python:3.9
command: ["python", "/app/sign_proxy.py"]
ports:
- containerPort: 8080
volumeMounts:
- mountPath: /app
name: proxy-code
volumes:
- name: proxy-code
configMap:
name: mcp-proxy-code # 假设代理代码已放入 ConfigMap
istiod
配置,并等待 Pod 重启。istiod
容器的日志,查看是否有 MCP 连接相关的错误信息。理想情况下,应该能看到成功连接到 localhost:8080
并开始订阅资源。mcp-auth-proxy
容器的日志,查看转发请求和签名是否成功。istiod
的业务 Pod 中,尝试解析一个已在腾讯云 MCP 广场上注册的、来自其他集群的服务名。如果配置成功,你应该能成功解析到该服务的地址。 # 进入网格内的一个 Pod
kubectl exec -it <pod-name> -c <container-name> -- /bin/sh
# 尝试解析 MCP 广场上的服务
nslookup <service-name-from-mcp>.<namespace>.svc.cluster.local
如果返回正确的 IP 地址(通常是该服务的 VIP),则证明服务发现同步成功。
腾讯云 TSE MCP 功能通过实现开放的 MCP 协议,为企业构建统一的多云、混合云服务治理层提供了强大的基础设施。它将服务配置的“源”与“端”解耦,允许你在一个控制台管理全局服务,而变更却能近乎实时地生效在所有异构环境中。
虽然初始配置(特别是认证部分)可能需要一些开发工作(如编写签名代理),但一旦打通,后续的运维效率提升将是巨大的。对于正在践行云原生战略并面临多云管理挑战的企业和开发者而言,TSE MCP 无疑是一个值得深入研究和采用的关键工具。
注意事项:
sign_proxy.py
)的实现需要严格按照腾讯云 签名方法 v3 的规范来完成,文中未给出完整实现。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。