写点什么

详细教程丨如何利用 Rancher 和 Kong 实现服务网格?

用户头像
RancherLabs
关注
发布于: 2021 年 01 月 09 日
详细教程丨如何利用Rancher和Kong实现服务网格?

服务网格(Service mesh)是当前新兴的架构模式,越来越受到人们的青睐。与 Kubernetes 一起,服务网格可以形成一个强大的平台,它可以解决在微服务集群或服务基础设施上发现的高度分布式环境中出现的技术需求。服务网格是一个专门的基础设施层,用于促进微服务之间的服务到服务通信。


服务网格解决了基于微服务的应用中典型的通信需求,包括加密隧道、健康检查、断路器、负载均衡以及流量许可。如果离开微服务来解决这些需求,会导致开发过程中产生高昂的费用和耗时。


在本文中,我们将对服务网格架构模式解决的最常见的微服务通信需求进行概述。


微服务动态和内在挑战


当你意识到微服务实现了相当多的与最初分配给它们的业务逻辑无关的代码时,问题就出现了。此外,有可能你有多个微服务在非标准化的流程中实现了类似的功能。换句话说,微服务开发团队应该专注于业务逻辑,并将低级通信能力留给特定的层。


继续推进我们的方案,需要考虑微服务的内在动态。在给定的时间内,你可能由于以下几个原因而拥有一个微服务的多个实例:


  • 吞吐量(Throughput):根据传入的请求,你可能拥有更多或更少的微服务实例

  • 金丝雀发布

  • 蓝绿部署

  • A/B 测试


简而言之,微服务到微服务的通信有特定的需求和问题需要解决。以下图片展示了这一方案:



该图示描述了几个技术挑战。显然,Microservice 1 的主要职责是均衡所有 Microservice 2 实例之间的负载。因此,Microservice 1 必须弄清楚我们在请求时刻有多少个 Microservice 2 实例。换句话说,Microservice 1 必须实现服务发现和负载均衡。


另一方面,Microservice 2 必须实现一些服务注册功能以告知 Microservice 1 何时有全新的实例。


想要拥有一个完全动态的环境,以下这些功能应该是微服务开发的一部分:


  • 流量控制:负载均衡的自然演变。我们想指定应该发送到每个 Microservice 2 实例的请求数量。

  • 在 Microservice 1 和 2 之间加密通信

  • 借助断路器和健康检查以解决和克服网络问题


总而言之,主要问题是开发团队花费了大量资源编写十分复杂的代码,而这些代码与微服务预期交付的业务逻辑不直接相关。


有潜力的解决方案


如何将所有微服务都可以调用的外部标准化组件中的所有非功能和操作功能外部化?例如,下图编译了所有功能,这些功能不属于给定的微服务。因此,在确定所有功能之后,我们需要决定在哪里实现它们。



Solution #1 :将所有功能封装在一个 library 中


开发者将负责调用 library 提供的函数来解决微服务通信需求。


这个解决方案有几个缺点:


  • 这是一个紧密耦合的解决方案,意味着微服务高度依赖于 library

  • 这个模式对于分布和升级新版本的 library 来说并不容易

  • 这不符合微服务多语言的原则,因为这会将不同的编程语言应用于不同的上下文。


Solution #2:透明代理(Transparent Proxy)



这个解决方案实现了同样的功能集合。但是,采用了一种非常不同的方法:每个微服务都有一个特定的组件,扮演代理的角色,负责处理它的传入和传出流量。代理解决了我们之前描述的库的缺点,具体如下:


  • 代理是透明的,这意味着微服务不会意识到它正在附近运行并实现了与其他微服务进行通信所需的所有功能。

  • 由于它是一个透明的代理,开发者不需要改变代码来引用代理。因此,从微服务开发的角度来看,升级代理将是一个并不会对开发流程造成太大影响。

  • 代理可以使用微服务使用的不同技术和编程语言进行开发。


服务网格架构模式


虽然透明代理的方法给微服务开发团队和微服务通信需求带来了一些好处,但仍有一些缺失的部分:


  • 代理只是执行策略来实现通信需求,例如负载均衡、金丝雀发布等。

  • 由什么来负责定义这样的策略,并在所有运行的代理上发布呢?


解决方案架构需要另一个组件,这些组件将被管理员用来定义策略,它将负责向代理传播策略。


以下图片展示了最终架构,也就是服务网格模式:



如你所见,该模式包含了我们所描述的两个主要组件。


  • 数据平面:也被称为 sidecar,它扮演着透明代理的角色。同样,每个微服务都会有自己的数据平面,拦截所有的入站和出站流量,并应用之前描述的策略。

  • 控制平面:由管理员用来定义策略并发布到数据平面。


一些重要的事情需要注意:


这是一个 "push-based "的架构。数据平面不做 "调用 "来获取策略——那将会消耗网络。


数据平面通常向控制平面或特定的基础设施报告使用指标。


手把手教你使用 Rancher、Kong 和 Kong Mesh


Kong 提供了一个企业级的综合服务连接平台,其包括了 API gateway、Kubernetes ingress controller 以及服务网格实现。该平台允许用户部署多个环境,如本地、混合云、多区域以及多云环境。


让我们借助运行在独立于云架构(cloud-agnostic)的 Kubernetes 集群上的金丝雀发布来实现服务网格,该集群可能包括 GKE 集群或任何其他的 Kubernetes 发行版。服务网格将由 Kong Mesh 实现,并由 Kong for Kubernetes 作为 Kubernetes Ingress Controller。一般而言,ingress controller 负责定义进入你的 Kubernetes 集群的入口点,暴露部署在其内部的微服务,并对其实行消费策略。


首先,确保你已经安装 Rancher 以及正在运行一个由 Rancher 管理的 Kubernetes 集群。在登录到 Rancher 之后,选在我们将要使用的 Kubernetes 集群,在本例中为“kong-rancher”。点击 Cluster Explorer。你将会重定向到以下页面:


现在,让我们从服务网格开始:


1、 Kong Mesh Helm Chart


回到 Rancher Cluster Manger 主页并再次选择你的集群。点击菜单栏的“Tools”选项然后点击 Catalogs,以创建一个新的 catalog。点击 Add Catalog 按钮,将 Kong Mesh 的 Helm chart 收录其中(https://kong.github.io/kong-mesh-charts/)。


选择 Global 作为范围,Helm v3 作为 Helm 版本。



现在点击 Apps Launch 来查看在 Catalog 中可用的 Kong Mesh。请注意,Kong 作为 Rancher 的合作伙伴默认提供了 Kong for Kubernetes 的 Helm chart:



2、 安装 Kong Mesh


点击顶部菜单栏 Namespaces 选项并创建一个“kong-mesh-system”命名空间。



将鼠标移到 kong-rancher 顶部菜单选项上,点击 kong-rancher 活动集群。



点击 Launch kubetcl



创建一个名为“license.json”的文件,用于存放你从 Kong Mesh 收到的 license。格式如下:



{“license”:{“version”:1,“signature”:“6a7c81af4b0a42b380be25c2816a2bb1d761c0f906ae884f93eeca1fd16c8b5107cb6997c958f45d247078ca50a25399a5f87d546e59ea3be28284c3075a9769”,“payload”:{“customer”:“Kong_SE_Demo_H1FY22”,“license_creation_date”:“2020-11-30”,“product_subscription”:“Kong Enterprise Edition”,“support_plan”:“None”,“admin_seats”:“5”,“dataplanes”:“5”,“license_expiration_date”:“2021-06-30”,“license_key”:“XXXXXXXXXXXXX”}}}
复制代码


现在使用以下命令创建一个 Kubernetes 通用密钥:


kubectl create secret generic kong-mesh-license -n kong-mesh-system --from-file=./license.json
复制代码


关闭 kubectl 会话,点击 Default 项目以及顶部菜单栏的 Apps。点击 Launch 按钮并选择 kong-mesh Helm chart。


点击 Use an existing namespace 并选择我们刚刚创建的那个。这有几个参数(https://artifacthub.io/packages/helm/kong-mesh/kong-mesh)来配置 Kong Mesh,但我们将保留所有默认值。点击 Launch 之后,你应该看到 Kong Mesh 应用程序部署完成。



你可以再次使用 Rancher Cluster Explorer 来检查安装。点击左侧菜单的 Pods 并选择 kong-mesh-system 的命名空间。


你也可以像这样使用 kubectl:


NAMESPACE          NAME                                                      READY   STATUS    RESTARTS   AGEcattle-system      cattle-cluster-agent-785fd5f54d-r7x8r                     1/1     Running   0          75mfleet-system       fleet-agent-77c78f9c74-f97tv                              1/1     Running   0          75mkong-mesh-system   kuma-control-plane-5b9c6f4598-nvq8q                       1/1     Running   0          16mkube-system        event-exporter-gke-666b7ffbf7-n9lfl                       2/2     Running   0          76mkube-system        fluentbit-gke-xqsdv                                       2/2     Running   0          76mkube-system        gke-metrics-agent-gjrqr                                   1/1     Running   0          76mkube-system        konnectivity-agent-4c4hf                                  1/1     Running   0          76mkube-system        kube-dns-66d6b7c877-tq877                                 4/4     Running   0          76mkube-system        kube-dns-autoscaler-5c78d65cd9-5hcxs                      1/1     Running   0          76mkube-system        kube-proxy-gke-c-kpwnf-default-0-be059c1c-49qp            1/1     Running   0          76mkube-system        l7-default-backend-5b76b455d-v6dvg                        1/1     Running   0          76mkube-system        metrics-server-v0.3.6-547dc87f5f-qntjf                    2/2     Running   0          75mkube-system        prometheus-to-sd-fdf9j                                    1/1     Running   0          76mkube-system        stackdriver-metadata-agent-cluster-level-68d94db6-64n4r   2/2     Running   1          75m
复制代码

3、 微服务部署


我们的 Service Mesh 部署是基于一个简单的微服务到微服务的通信场景。由于我们运行的是金丝雀发布,被调用的微服务有两个版本:


  • “magnanimo”:通过 Kong 暴露 Kubernetes ingress controller。

  • “benigno”:提供了一个 “hello” endpoint,在这个端点中,它呼应了当前的 datetime。它有一个金丝雀发布,会发送一个稍微不同的响应。


下图展示了这一架构:


创建一个带有 sidecar 注入注释的命名空间。你可以再次使用 Rancher Cluster Manager:选择你的集群,然后单击 Projects/Namespaces。点击 Add Namespace。输入 “kong-mesh-app” 作为名称,并包含一个带有 “kuma.io/sidecar-injection” 键和 “enabled” 作为其值的注释。


当然,你也可以选择使用 kubectl


kubectl create namespace kong-mesh-app
kubectl annotate namespace kong-mesh-app kuma.io/sidecar-injection=enabled
Submit the following declaration to deploy Magnanimo injecting the Kong Mesh data plane
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: magnanimo
namespace: kong-mesh-app
spec:
replicas: 1
selector:
matchLabels:
app: magnanimo
template:
metadata:
labels:
app: magnanimo
spec:
containers:
- name: magnanimo
image: claudioacquaviva/magnanimo
ports:
- containerPort: 4000
---
apiVersion: v1
kind: Service
metadata:
name: magnanimo
namespace: kong-mesh-app
labels:
app: magnanimo
spec:
type: ClusterIP
ports:
- port: 4000
name: http
selector:
app: magnanimo
EOF
复制代码


使用 Rancher Cluster Manager 检查你的部署。将鼠标移动至 kong-rancher 菜单上,点击 Default 项目,可以看到当前的部署情况:



点击 magnanimo 检查部署的细节,包括其 pods:



点击 magnanimo pod,检查其内部运行的容器。



我们可以看到,pod 有两个运行的容器:


  • magnanimo:微服务实际运行的地方。

  • kuma-sidecar:在部署的时候注入,作为 Kong Mesh 的数据平面。


同理,部署 Benigno 的时候,也有自己的 sidecar:



cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: benigno-v1
namespace: kong-mesh-app
spec:
replicas: 1
selector:
matchLabels:
app: benigno
template:
metadata:
labels:
app: benigno
version: v1
spec:
containers:
- name: benigno
image: claudioacquaviva/benigno
ports:
- containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
name: benigno
namespace: kong-mesh-app
labels:
app: benigno
spec:
type: ClusterIP
ports:
- port: 5000
name: http
selector:
app: benigno
EOF
And finally, deploy Benigno canary release. Notice that the canary release will be abstracted by the same Benigno Kubernetes Service created before:
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: benigno-v2
namespace: kong-mesh-app
spec:
replicas: 1
selector:
matchLabels:
app: benigno
template:
metadata:
labels:
app: benigno
version: v2
spec:
containers:
- name: benigno
image: claudioacquaviva/benigno\_rc
ports:
- containerPort: 5000
EOF
复制代码


使用以下命令检查部署和 Pods:



$ kubectl get pod --all-namespacesNAMESPACE NAME READY STATUS RESTARTS AGEcattle-system cattle-cluster-agent-785fd5f54d-r7x8r 1/1 Running 0 75mfleet-system fleet-agent-77c78f9c74-f97tv 1/1 Running 0 75mkong-mesh-app benigno-v1-fd4567d95-drnxq 2/2 Running 0 110skong-mesh-app benigno-v2-b977c867b-lpjpw 2/2 Running 0 30skong-mesh-app magnanimo-658b67fb9b-tzsjp 2/2 Running 0 5m3skong-mesh-system kuma-control-plane-5b9c6f4598-nvq8q 1/1 Running 0 16mkube-system event-exporter-gke-666b7ffbf7-n9lfl 2/2 Running 0 76mkube-system fluentbit-gke-xqsdv 2/2 Running 0 76mkube-system gke-metrics-agent-gjrqr 1/1 Running 0 76mkube-system konnectivity-agent-4c4hf 1/1 Running 0 76mkube-system kube-dns-66d6b7c877-tq877 4/4 Running 0 76mkube-system kube-dns-autoscaler-5c78d65cd9-5hcxs 1/1 Running 0 76mkube-system kube-proxy-gke-c-kpwnf-default-0-be059c1c-49qp 1/1 Running 0 76mkube-system l7-default-backend-5b76b455d-v6dvg 1/1 Running 0 76mkube-system metrics-server-v0.3.6-547dc87f5f-qntjf 2/2 Running 0 75mkube-system prometheus-to-sd-fdf9j 1/1 Running 0 76mkube-system stackdriver-metadata-agent-cluster-level-68d94db6-64n4r 2/2 Running 1 75m

$ kubectl get service --all-namespacesNAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEdefault kubernetes ClusterIP 10.0.16.1 <none> 443/TCP 79mkong-mesh-app benigno ClusterIP 10.0.20.52 <none> 5000/TCP 4m6skong-mesh-app magnanimo ClusterIP 10.0.30.251 <none> 4000/TCP 7m18skong-mesh-system kuma-control-plane ClusterIP 10.0.21.228 <none> 5681/TCP,5682/TCP,443/TCP,5676/TCP,5678/TCP,5653/UDP 18mkube-system default-http-backend NodePort 10.0.19.10 <none> 80:32296/TCP 79mkube-system kube-dns ClusterIP 10.0.16.10 <none> 53/UDP,53/TCP 79mkube-system metrics-server ClusterIP 10.0.20.174 <none> 443/TCP 79m
复制代码


你也可以使用 Kong Mesh 控制台来检查微服务和数据平面。在 Terminal 上运行以下命令:


kubectl port-forward service/kuma-control-plane -n kong-mesh-system 5681
复制代码


重定向你的浏览器到 http://localhost:5681/gui。点击 Skip to Dashboard All Data Plane Proxies



启动一个循环,看看金丝雀发布的运行情况。注意服务已经被部署为 ClusterIP 类型,所以你需要用 “port-forward”直接暴露它们。下一步将展示如何用 Ingress Controller 暴露服务。


在本地 terminal 上运行:

kubectl port-forward service/magnanimo -n kong-mesh-app 4000
复制代码


打开另一个 Terminal,开始循环。请求要到 Magnanimo 提供的 4000 端口。路径“/hw2 ”将请求路由到 Benigno 服务,它后面有两个 endpoint,与 Benigno 两个版本有关:


while [1]; do curl http://localhost:4000/hw2; echo; done
复制代码


你应该看到类似下方的结果:


Hello World, Benigno: 2020-11-20 12:57:05.811667Hello World, Benigno: 2020-11-20 12:57:06.304731Hello World, Benigno, Canary Release: 2020-11-20 12:57:06.789208Hello World, Benigno: 2020-11-20 12:57:07.269674Hello World, Benigno, Canary Release: 2020-11-20 12:57:07.755884Hello World, Benigno, Canary Release: 2020-11-20 12:57:08.240453Hello World, Benigno: 2020-11-20 12:57:08.728465Hello World, Benigno: 2020-11-20 12:57:09.208588Hello World, Benigno, Canary Release: 2020-11-20 12:57:09.689478Hello World, Benigno, Canary Release: 2020-11-20 12:57:10.179551Hello World, Benigno: 2020-11-20 12:57:10.662465Hello World, Benigno: 2020-11-20 12:57:11.145237Hello World, Benigno, Canary Release: 2020-11-20 12:57:11.618557Hello World, Benigno: 2020-11-20 12:57:12.108586Hello World, Benigno, Canary Release: 2020-11-20 12:57:12.596296Hello World, Benigno, Canary Release: 2020-11-20 12:57:13.093329Hello World, Benigno: 2020-11-20 12:57:13.593487Hello World, Benigno, Canary Release: 2020-11-20 12:57:14.068870
复制代码


4、 控制金丝雀发布的成本


正如我们所见,两个 Benigno 微服务发布的请求使用了循环策略。也就是说,我们无法控制金丝雀发布的花销。Service Mesh 允许我们定义何时以及如何将金丝雀发布暴露给我们的 consumer(在本例中指 Magnanimo 微服务)。


要定义一个策略来控制流向两个版本的流量,需要使用下面这个声明。它说 90%的流量应该流向当前版本,而只有 10%的流量应该重定向到金丝雀发布。


cat <<EOF | kubectl apply -f -    apiVersion: kuma.io/v1alpha1    kind: TrafficRoute    mesh: default    metadata:    namespace: default    name: route-1    spec:    sources:    - match:    kuma.io/service: magnanimo\_kong-mesh-app\_svc\_4000    destinations:    - match:    kuma.io/service: benigno\_kong-mesh-app\_svc\_5000    conf:    split:    - weight: 90    destination:    kuma.io/service: benigno\_kong-mesh-app\_svc\_5000    version: v1    - weight: 10    destination:    kuma.io/service: benigno\_kong-mesh-app\_svc\_5000    version: v2    EOF
复制代码


应用声明之后,你应该看到如下结果:



Hello World, Benigno: 2020-11-20 13:05:02.553389Hello World, Benigno: 2020-11-20 13:05:03.041120Hello World, Benigno: 2020-11-20 13:05:03.532701Hello World, Benigno: 2020-11-20 13:05:04.021804Hello World, Benigno: 2020-11-20 13:05:04.515245Hello World, Benigno, Canary Release: 2020-11-20 13:05:05.000644Hello World, Benigno: 2020-11-20 13:05:05.482606Hello World, Benigno: 2020-11-20 13:05:05.963663Hello World, Benigno, Canary Release: 2020-11-20 13:05:06.446599Hello World, Benigno: 2020-11-20 13:05:06.926737Hello World, Benigno: 2020-11-20 13:05:07.410605Hello World, Benigno: 2020-11-20 13:05:07.890827Hello World, Benigno: 2020-11-20 13:05:08.374686Hello World, Benigno: 2020-11-20 13:05:08.857266Hello World, Benigno: 2020-11-20 13:05:09.337360Hello World, Benigno: 2020-11-20 13:05:09.816912Hello World, Benigno: 2020-11-20 13:05:10.301863Hello World, Benigno: 2020-11-20 13:05:10.782395Hello World, Benigno: 2020-11-20 13:05:11.262624Hello World, Benigno: 2020-11-20 13:05:11.743427Hello World, Benigno: 2020-11-20 13:05:12.221174Hello World, Benigno: 2020-11-20 13:05:12.705731Hello World, Benigno: 2020-11-20 13:05:13.196664Hello World, Benigno: 2020-11-20 13:05:13.680319
复制代码


5、 安装 Kong for Kubernetes


让我们回到 Rancher 中安装我们的 Kong for Kubernetes Ingress Controller,并控制服务网格的暴露。在 Rancher Catalog 页面中,点击 Kong 图标。接受默认值,然后点击 Launch



你应该看到 Kong 和 Kong Mesh 这两个应用程序都已经部署完成:




再次使用 kubectl 检查安装:



$ kubectl get pod --all-namespacesNAMESPACE NAME READY STATUS RESTARTS AGEcattle-system cattle-cluster-agent-785fd5f54d-r7x8r 1/1 Running 0 84mfleet-system fleet-agent-77c78f9c74-f97tv 1/1 Running 0 83mkong-mesh-app benigno-v1-fd4567d95-drnxq 2/2 Running 0 10mkong-mesh-app benigno-v2-b977c867b-lpjpw 2/2 Running 0 8m47skong-mesh-app magnanimo-658b67fb9b-tzsjp 2/2 Running 0 13mkong-mesh-system kuma-control-plane-5b9c6f4598-nvq8q 1/1 Running 0 24mkong kong-kong-754cd6947-db2j9 2/2 Running 1 72skube-system event-exporter-gke-666b7ffbf7-n9lfl 2/2 Running 0 85mkube-system fluentbit-gke-xqsdv 2/2 Running 0 84mkube-system gke-metrics-agent-gjrqr 1/1 Running 0 84mkube-system konnectivity-agent-4c4hf 1/1 Running 0 84mkube-system kube-dns-66d6b7c877-tq877 4/4 Running 0 84mkube-system kube-dns-autoscaler-5c78d65cd9-5hcxs 1/1 Running 0 84mkube-system kube-proxy-gke-c-kpwnf-default-0-be059c1c-49qp 1/1 Running 0 84mkube-system l7-default-backend-5b76b455d-v6dvg 1/1 Running 0 85mkube-system metrics-server-v0.3.6-547dc87f5f-qntjf 2/2 Running 0 84mkube-system prometheus-to-sd-fdf9j 1/1 Running 0 84mkube-system stackdriver-metadata-agent-cluster-level-68d94db6-64n4r 2/2 Running 1 84m

$ kubectl get service --all-namespacesNAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEdefault kubernetes ClusterIP 10.0.16.1 <none> 443/TCP 85mkong-mesh-app benigno ClusterIP 10.0.20.52 <none> 5000/TCP 10mkong-mesh-app magnanimo ClusterIP 10.0.30.251 <none> 4000/TCP 13mkong-mesh-system kuma-control-plane ClusterIP 10.0.21.228 <none> 5681/TCP,5682/TCP,443/TCP,5676/TCP,5678/TCP,5653/UDP 24mkong kong-kong-proxy LoadBalancer 10.0.26.38 35.222.91.194 80:31867/TCP,443:31039/TCP 78skube-system default-http-backend NodePort 10.0.19.10 <none> 80:32296/TCP 85mkube-system kube-dns ClusterIP 10.0.16.10 <none> 53/UDP,53/TCP 85mkube-system metrics-server ClusterIP 10.0.20.174 <none> 443/TCP 85m
复制代码


6、 创建 Ingress


通过下面的声明,我们将通过一个 Ingress 和它的路由 “/route1” 来暴露 Magnanimo 微服务。


cat <<EOF | kubectl apply -f -    apiVersion: extensions/v1beta1    kind: Ingress    metadata:    name: route1    namespace: kong-mesh-app    annotations:    konghq.com/strip-path: "true"    spec:    rules:    - http:    paths:    - path: /route1    backend:    serviceName: magnanimo    servicePort: 4000    EOF
复制代码


现在,临时的 “port-forward” 暴露机制可以被正式的 Ingress 所取代。而我们的循环也可以开始消耗 Ingress,结果如下:


while [1]; do curl http://35.222.91.194/route1/hw2; echo; done
复制代码


原文链接:详细教程丨如何利用Rancher和Kong实现服务网格?


用户头像

RancherLabs

关注

牛牛本牛ヾ(◍°∇°◍)ノ゙ 2019.09.17 加入

Rancher Labs由CloudStack之父梁胜创建。旗舰产品Rancher是一个开源的企业级Kubernetes管理平台,实现了Kubernetes集群在混合云+本地数据中心的集中部署与管理。

评论

发布
暂无评论
详细教程丨如何利用Rancher和Kong实现服务网格?