前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【腾讯云原生】腾讯云跨账号流量统一接入与治理方案

【腾讯云原生】腾讯云跨账号流量统一接入与治理方案

原创
作者头像
imroc
修改于 2022-08-12 10:12:31
修改于 2022-08-12 10:12:31
25.4K0
举报

摘自 Kubernetes 实践指南

需求场景

服务部署在不同腾讯云账号下,想统一在一个腾讯云账号下接入流量,部分流量可能会转发到其它腾讯云账号下的服务。

需求分析

多集群跨 VPC 流量管理,可以通过 腾讯云服务网格(TCM) + 云联网(CCN) 来实现,自动对多个容器集群进行服务发现(Pod IP),利用 isito ingressgateway 统一接入流量,然后直接转发到后端服务的 Pod IP:

但这里需求关键点是跨账号,虽然跨账号网络也可以用云联网打通,但是 TCM 是无法直接管理其它账号下的集群的,原因很明显,关联集群时只能选择本账号下的集群,没有权限关联其它账号下的集群:

幸运的是,我们可以利用 云原生分布式云中心(TDCC) 来管理其它账号的集群 (TDCC 目前还在内测中,需提交 内核申请 进行开通),将其它账号的集群注册到 TDCC 中,然后在 TCM 里添加 TDCC 中注册的集群,TCM 通过关联 TDCC 注册集群来间接对其它账号的集群进行服务发现,以实现多账号下的集群流量统一纳管:

注意事项: 其它账号尽量使用独立集群

istio 注入 sidecar 时需要集群 apiserver 调用 TCM 控制面 webhook:

如果使用托管集群(TKE托管集群或EKS集群),apiserver 是用户不可见的,使用 169 开头的 IP,这个 IP 只在 VPC 内可用。

所以如果将账号B的托管集群注册到账号A的 TDCC 中,账号B的托管集群 apiserver 也无法调用到账号A的TCM控制面,就会导致无法注入 sidecar,而独立集群没这个问题,因为 apiserver 是部署在用户 CVM 上,使用 CVM 的 IP,打通云联网后网络就可以互通,所以推荐其它账号下的集群使用 TKE 独立集群。

当然如果能保证完全没有 sidecar 自动注入的需求,不需要账号 B 的服务通过网格的服务发现主动调用账号 A 的服务,这种情况使用托管集群也可以。

操作步骤

准备集群

在账号A下(用于接入流量的账号),准备好一个或多个 TKE/EKS 集群,在其它账号准备好 TKE 独立集群。

注意,一定保证所有集群使用的网段互不冲突。

使用云联网打通网络

登录账号A,进入云联网控制台里,新建一个云联网,然后点击【新增实例】,将需要账号A下需要打通网络的VPC全部关联进来:

登录其它账号,进入VPC控制台,点击进入需要与账号A打通网络的VPC,点【立即关联】:

选择【其它账号】,输入账号A的ID以及前面创建的云联网的ID以申请加入账号A创建的云联网:

然后再登录账号A,点进前面创建的云联网,同意其它账号VPC加入云联网的申请:

不出意外,不同账号不同 VPC 成功通过云联网打通网络:

如果你使用了 TKE 集群的 Global Router 网络模式,在集群基本信息页面,将容器网络注册到云联网的开关打开,以便让 Global Router 网络模式的容器 IP 通过云联网下发给所有其它 VPC:

开通 TDCC

登录账号A,进入 TDCC 控制台,首次进入需要按流程进行开通操作。

首先会提示为 TDCC 进行授权:

点击【同意授权】:

选择要开通的 TDCC 所在地域以及 VPC 与子网:

需要注意的是:

  • TDCC 是多集群的控制面,可以同时管理多个地域的集群,尽量将 TDCC 所在地域选在服务部署的地域,如果服务分散在多个地域,或者 TDCC 还不支持服务所在地域,可以尽量选择离服务近一点的地域,尽量降低 TDCC 控制面到集群之间的时延。
  • TDCC 与集群如果跨地域,仅仅增加一点控制面之间的时延,不影响数据面。数据面之间的转发时延只取决于集群之间的距离,与 TDCC 无关,比如,集群都在成都地域,但 TDCC 不支持成都,可以将 TDCC 选择广州。
  • 可以将 TDCC 所在 VPC 也加入到云联网,这样其它账号注册集群到 TDCC 时就可以使用内网方式,网络稳定性更有保障。

等待 TDCC 的 Hub 集群创建完成:

完成后,在 TDCC 集群列表页面,点击【注册已有集群】:

虽然其它账号使用的 TKE 独立集群,但这里一定要选择 【非TKE集群】:

因为如果选 【TKE集群】,只能选到本账号的,其它账号的选不了。

选择其它账号集群实际所在地域,然后点【完成】,回到集群列表页面,点击【查看注册命令】:

可以看到自动生成的 yaml,将其下载下来,保存成 agent.yaml:

然后 kubectl 的 context 切换到其它账号中要注册到 TDCC 的集群,使用 kubectl 将 yaml apply 进去:

代码语言:shell
AI代码解释
复制
kubectl apply -f agent.yaml

不出意外,TDCC 集群列表页面可以看到注册集群状态变为了运行中,即将其它账号下的集群成功注册到 TDCC:

创建服务网格

登录账号A,进入 TCM 控制台,点【新建】来创建一个服务网格:

推荐选择最高版本 istio,托管网格:

服务发现就是关联集群,可以在创建网格时就关联,也可以等创建完再关联。

如果将 TDCC 中的注册集群关联进 TCM?在关联集群时,选择 TDCC 所在地域和注册集群类型,然后就可以下拉选择其它账号下注册进来的集群了:

不出意外,账号A和其它账号的集群都关联到同一个服务网格了:

创建 Ingress Gateway

进入账号A创建的网格,在基本信息页面里创建 Ingress Gateway:

配置一下 Ingress Gateway,接入集群 选要统一接入流量的集群:

创建好后,点进去:

可以看到创建出来的 CLB IP 地址以及对应的 CLB ID:

如有需要,创建 Ingress Gateway 时也可以选择已有 CLB。

Ingress Gateway 组件创建好了,再创建一个 Gateway 对象与之关联:

也可以直接用 yaml 创建:

代码语言:yaml
AI代码解释
复制
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: cluster
  namespace: istio-system
spec:
  selector:
    app: istio-ingressgateway
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: HTTP-80
      protocol: HTTP
    hosts:
    - "*.imroc.cc"

配置 DNS 解析

将三个不同的域名都解析到前面创建的 Ingress Gateway 的 CLB IP:

验证一下是否都正确解析到了同一个 IP:

部署测试服务

分别在几个集群部署服务,这里给出一个示例,将 3 个不同服务分别部署在不同集群中,其中一个集群在其它账号下:

  • 3 个服务使用不同域名,但 DNS 都指向同一个 ingressgateway,统一接入流量。
  • 根据不同域名转发给不同的服务。

服务部署使用 prism,模拟不同服务的返回不同,访问根路径分别返回字符串cluster1cluster2cluster3

第一个服务的 yaml (cluster1.yaml):

代码语言:yaml
AI代码解释
复制
apiVersion: v1
kind: ConfigMap
metadata:
  name: cluster1-conf
  namespace: test
data:
  mock.yaml: |
    openapi: 3.0.3
    info:
      title: MockServer
      description: MockServer
      version: 1.0.0
    paths:
      '/':
        get:
          responses:
            '200':
              content:
                'text/plain':
                  schema:
                    type: string
                    example: cluster1
---
apiVersion: v1
kind: Service
metadata:
  name: cluster1
  namespace: test
  labels:
    app: cluster1
spec:
  type: ClusterIP
  ports:
  - port: 80
    name: http
    protocol: TCP
    targetPort: 80
  selector:
    app: cluster1

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cluster1
  namespace: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: cluster1
      version: v1
  template:
    metadata:
      labels:
        app: cluster1
        version: v1
    spec:
      containers:
      - name: cluster1
        image: stoplight/prism:4
        args:
        - mock
        - -h
        - 0.0.0.0
        - -p
        - "80"
        - /etc/prism/mock.yaml
        volumeMounts:
        - mountPath: /etc/prism
          name: config
      volumes:
      - name: config
        configMap:
          name: cluster1-conf

将其 apply 到账号 A 的集群1:

代码语言:shell
AI代码解释
复制
kubectl create ns test
kubectl apply -f cluster1.yaml

等待部署成功:

第二个服务的 yaml (cluster2.yaml):

代码语言:yaml
AI代码解释
复制
apiVersion: v1
kind: ConfigMap
metadata:
  name: cluster2-conf
  namespace: test
data:
  mock.yaml: |
    openapi: 3.0.3
    info:
      title: MockServer
      description: MockServer
      version: 1.0.0
    paths:
      '/':
        get:
          responses:
            '200':
              content:
                'text/plain':
                  schema:
                    type: string
                    example: cluster2
---
apiVersion: v1
kind: Service
metadata:
  name: cluster2
  namespace: test
  labels:
    app: cluster2
spec:
  type: ClusterIP
  ports:
  - port: 80
    name: http
    protocol: TCP
    targetPort: 80
  selector:
    app: cluster2

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cluster2
  namespace: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: cluster2
      version: v1
  template:
    metadata:
      labels:
        app: cluster2
        version: v1
    spec:
      containers:
      - name: cluster2
        image: stoplight/prism:4
        args:
        - mock
        - -h
        - 0.0.0.0
        - -p
        - "80"
        - /etc/prism/mock.yaml
        volumeMounts:
        - mountPath: /etc/prism
          name: config
      volumes:
      - name: config
        configMap:
          name: cluster2-conf

将其 apply 到账号 A 的集群2:

代码语言:shell
AI代码解释
复制
kubectl create ns test
kubectl apply -f cluster2.yaml

类似的,第三个服务的 yaml (cluster3.yaml):

代码语言:yaml
AI代码解释
复制
apiVersion: v1
kind: ConfigMap
metadata:
  name: cluster3-conf
  namespace: test
data:
  mock.yaml: |
    openapi: 3.0.3
    info:
      title: MockServer
      description: MockServer
      version: 1.0.0
    paths:
      '/':
        get:
          responses:
            '200':
              content:
                'text/plain':
                  schema:
                    type: string
                    example: cluster3
---
apiVersion: v1
kind: Service
metadata:
  name: cluster3
  namespace: test
  labels:
    app: cluster3
spec:
  type: ClusterIP
  ports:
  - port: 80
    name: http
    protocol: TCP
    targetPort: 80
  selector:
    app: cluster3

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cluster3
  namespace: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: cluster3
      version: v1
  template:
    metadata:
      labels:
        app: cluster3
        version: v1
    spec:
      containers:
      - name: cluster3
        image: stoplight/prism:4
        args:
        - mock
        - -h
        - 0.0.0.0
        - -p
        - "80"
        - /etc/prism/mock.yaml
        volumeMounts:
        - mountPath: /etc/prism
          name: config
      volumes:
      - name: config
        configMap:
          name: cluster3-conf

将其 apply 到另一个账号的集群:

代码语言:shell
AI代码解释
复制
kubectl create ns test
kubectl apply -f cluster3.yaml

配置 VirtualService 规则

可以在 TCM 控制台可视化操作,也可以用 apply yaml,这里示例使用 yaml。

首先,为三个不同服务创建对应的 VirtualService 并与 Gateway 关联:

代码语言:yaml
AI代码解释
复制
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: cluster1-imroc-cc
  namespace: test
spec:
  gateways:
  - istio-system/cluster
  hosts:
  - 'cluster1.imroc.cc'
  http:
  - route:
    - destination:
        host: cluster1.test.svc.cluster.local
        port:
          number: 80
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: cluster2-imroc-cc
  namespace: test
spec:
  gateways:
  - istio-system/cluster
  hosts:
  - 'cluster2.imroc.cc'
  http:
  - route:
    - destination:
        host: cluster2.test.svc.cluster.local
        port:
          number: 80
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: cluster3-imroc-cc
  namespace: test
spec:
  gateways:
  - istio-system/cluster
  hosts:
  - cluster3.imroc.cc
  http:
  - route:
    - destination:
        host: cluster3.test.svc.cluster.local
        port:
          number: 80

测试效果

使用 curl 请求不同服务的域名,可以看到将请求均正确转发到了对应的集群,并响应了对应不同的结果:

总结

本文给出了在腾讯云上利用 TCM+CCN+TDCC 实现跨账号多集群流量统一接入和治理的方案,示例中的功能相对简单,如有需要,还可以自行配置 istio 规则实现更细粒度的流量治理,比如根据不同 url 路径转发到不同集群的服务,甚至相同 url 同时转发到不同集群,配置流量比例等。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
istio多集群链路追踪,附实操视频
这里的可观察性主要指服务网格的可观察性,也就是需要观测服务网格中运行的微服务。为什么可观察性很重要,因为随着微服务架构的流行,一个系统可能运行成百上千微服务,如果系统出现故障,定位问题带来很大的问题。有了观测系统,就能更好的分析问题发生的原因,已经更好的监控告警。服务网格可观察性主要分为三个大类,分别是log,metrics,tracing。log是指将分布式系统的日志收集起来集中存储,用于日志分析,常用的工具如efk。metrics是指收集服务网格的监控指标,进行监控告警,常用工具比如prometheus。tracing是指分布式链路追踪,用于可视化显示服务调用的依赖关系,及获取延迟数据,常用工具如zipkin,jaeger等。本文关注的是tracing,这里我们用到了zipkin作为tracing工具。
用户5166556
2023/03/18
5910
istio多集群链路追踪,附实操视频
【腾讯云容器服务】使用 TCM 对外暴露 gRPC 服务
gRPC 是长连接服务,而长连接服务负载不均是通病,因为使用四层负载均衡的话,只能在连接调度层面负载均衡,但不能在请求级别负载均衡。不同连接上的请求数量、网络流量、请求耗时、存活时长等可能都不一样,就容易造成不同 Pod 的负载不一样。而 istio 天然支持 gRPC 负载均衡,即在七层进行负载均衡,可以将不同请求转发到不同后端,从而避免负载不均问题,腾讯云容器服务也对 istio 进行了产品化托管,产品叫 TCM,本文介绍如何使用 TCM 来暴露 gRPC 服务。
imroc
2022/07/13
1.4K0
【腾讯云容器服务】在 TKE 上自建 harbor 镜像仓库
腾讯云有 容器镜像服务 TCR,企业级容器镜像仓库,满足绝大多数镜像仓库的需求,如果需要使用镜像仓库,可以首选 TCR,如果是考虑到成本,或想使用 Harbor 最新功能等因素,可以考虑自建 Harbor 镜像仓库,本文介绍如何在腾讯云容器服务中部署 Harbor 作为自建的容器镜像仓库。
imroc
2022/07/18
3.4K0
【腾讯云容器服务】在 TKE 上自建 harbor 镜像仓库
使用 Kubernetes 联邦(Kubefed)进行多集群管理
Federation v2 的安装分两个部分,一是 Controller Plan 和 kubefedctl。
CS实验室
2021/03/22
3.8K0
使用 Kubernetes 联邦(Kubefed)进行多集群管理
istio 实用技巧: 利用 Prism 构造多版本测试服务
Prism 是一个支持 http mock 的开源工具,可以解析 openapi 配置,根据配置进行相应的响应,我们可以利用它来实现部署多版本服务,用于测试 istio 多版本服务相关的功能。本文给出一个简单的示例。
imroc
2021/05/31
7300
Istio多集群实践
为了实现应用高并发和高可用,企业通常会选择将应用部署在多个地域的多个集群,甚至多云、混合云环境中。在这种情况下,如何在多个集群中部署和管理应用,成为了一个挑战,当然多集群方案也逐步成为了企业应用部署的最佳选择了。同样对多云、混合云、虚拟机等异构基础设施的服务治理也是 Istio 重点支持的场景之一,Istio 从 v1.0 版本开始支持一些多集群功能,并在之后的版本中添加了新功能。
我是阳明
2024/01/10
7250
Istio多集群实践
本地部署istio多集群(共享控制面)
这里实际上创建了istio-remote-secret-remote0 secret,该secret具有
有点技术
2020/09/04
1.1K0
TKE跨账号统一监控方案
TDCC注册集群,主要作用是让A账号下prom自动的在B账号的TKE下部署proxy-agent,当proxy-agent创建完成之后,监控的网络,仅仅只和proxy-server互通,这个时候TDCC即时挂掉,也不影响监控,这里其实完全可以在prom中的关联集群那里增加手动关联选项,这样,只要保证2个vpc是互通的,允许链接proxy-server的8008端口就行。(不管是通过vpn方式还是ccn方式都可以)。
蚂蚁上树
2023/01/29
9280
【腾讯云容器服务】在 TKE 上自建 Gitlab 代码仓库
修改这些配置比较繁琐,我已经维护了一份 Gitlab 适配腾讯云容器服务的 chart 包,相关 gitlab 镜像也做了同步,可以实现一键安装。可以通过 git 拉下来:
imroc
2022/07/21
2.9K1
【腾讯云容器服务】在 TKE 上自建 Gitlab 代码仓库
使用 Rafay CLI 配置多集群服务网格
尽管 Istio 提供多集群连接功能,但配置它可能会复杂而繁琐。新工具可以提供帮助。
云云众生s
2024/03/28
1130
使用 Rafay CLI 配置多集群服务网格
分布式云场景下的多集群监控方案最佳实践
杨濡溪,腾讯云后台开发工程师,目前主要负责腾讯云 Prometheus 监控服务、TKE集群巡检等技术研发工作。 杨鹏,腾讯云后台开发工程师,曾负责腾讯云专有云后台技术研发工作,目前主要负责腾讯云 Prometheus 监控服务、TKE集群后台技术研发工作。 引言 Prometheus 作为云原生时代最流行的监控组件,已然成为社区监控事实上的标准,但是在多集群,大集群等场景下,只使用 Prometheus 是远远不够的;单集群场景下我们一般主要关注指标采集、存储、告警、可视化等基础监控能力,随着集群规模的
腾讯云原生
2022/11/24
2.2K0
分布式云场景下的多集群监控方案最佳实践
云原生应用负载均衡系列 (2): 入口流量分发、容错与高可用调度
冉昕,腾讯云服务网格TCM产品经理,现负责云原生流量接入网关与应用通信可观测性等产品特性策划与设计工作。 引言 在云原生应用负载均衡系列第一篇文章《云原生应用负载均衡选型指南》介绍了云原生容器环境的入口流量管理使用场景与解决方案,用 Envoy 作为数据面代理,搭配 Istio 作控制面的 Istio Ingress Gateway,在多集群流量分发、安全、可观测性、异构平台支持等方面的综合对比中,是云原生应用流量管理的最佳方案。 在接入层,我们需要配置路由规则、流量行为(超时、重定向、重写、重试等)、
腾讯云原生
2021/07/02
1.8K0
istio在vm上的流量治理
第一台作为k8s 部署istio,第二台作为vm,系统为centos8,centos 7要升级glibc 麻烦的很,第二台通过静态路由访问 k8s内部的pod,
有点技术
2020/11/25
2.3K1
Hadoop集群部署教程-P7
graph TD A[服务异常] --> B{日志分析} B -->|NameNode| C[检查fsimage完整性] B -->|DataNode| D[验证磁盘空间] B -->|YARN| E[检查资源超配]
奶油话梅糖
2025/04/17
1070
qGPU云原生最佳实践
腾讯云qGPU提供的GPU共享能力,支持在多个容器间共享 GPU 卡并提供容器间显存、算力强隔离能力,在使用中以更小的粒度进行调度。在保证业务稳定的前提下,为云上用户控制资源成本,提高运行效率提供帮助。
远远小七宝
2022/11/04
1.5K0
qGPU云原生最佳实践
Kubernetes多集群管理之路
随着Kubernetes在企业中的应用愈发广泛、普及,越来越多的公司开始在生产环境中运维多个Kubernetes集群。本文主要讲述了一些对于Kubernetes多集群管理的思考,包括为什么需要多集群、多集群的优势以及现有的一些基于Kubernetes衍生出的多集群管理架构。
CNCF
2022/11/28
1.9K0
Kubernetes多集群管理之路
在 TKE 使用 EnvoyGateway 流量网关
EnvoyGateway 是基于 Envoy 实现 Gateway API 的 Kubernetes 网关,你可以通过定义 Gateway API 中定义的 Gateway、HTTPRoute 等资源来管理 Kubernetes 的南北向流量。
imroc
2025/02/27
950
在 TKE 使用 EnvoyGateway 流量网关
Cilium 多集群 Cluster Mesh 介绍
Cluster Mesh 是 Cilium 的多集群实现,可以帮助 Cilium 实现跨数据中心、跨 VPC 的多 Kubernetes 集群管理,Cluster Mesh 主要有以下功能:
Se7en258
2022/06/24
2.5K0
Cilium 多集群 Cluster Mesh 介绍
【腾讯云容器服务】超级节点大镜像解决方案
超级节点(Serverless) 的 Pod,默认分配的系统盘大小是 20GB,当容器镜像非常大的时候(比如镜像中包含大的 AI 模型),拉取镜像会因空间不足而失败:
imroc
2022/07/25
2.8K0
【腾讯云容器服务】超级节点大镜像解决方案
使用 Cert-Manager 实现 Ingress Https
什么是 HTTPS 超文本传输协议 HTTP 协议被用于在 Web 浏览器和网站服务器之间传递信息,HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了 Web 浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP 协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
iMike
2019/07/29
1.6K0
相关推荐
istio多集群链路追踪,附实操视频
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档