From a275b0a1f13ec2a375a9f8d394422e24f3f4fdf9 Mon Sep 17 00:00:00 2001 From: Jimmy Song Date: Wed, 9 Mar 2022 17:19:33 +0800 Subject: [PATCH] remove outdated content --- README.md | 2 +- SUMMARY.md | 2 - ...ve-summary-in-2018-and-outlook-for-2019.md | 10 +- cloud-native/quick-start.md | 2 +- concepts/crd.md | 2 +- images/github-banner.jpg | Bin 0 -> 58249 bytes practice/vistio-visualize-your-istio-mesh.md | 137 -------- usecases/conduit.md | 16 - usecases/dubbo-on-x-protocol-in-sofa-mesh.md | 292 ------------------ ...routing-of-istio-service-mesh-deep-dive.md | 11 - usecases/envoy.md | 1 + usecases/integrating-vms.md | 2 +- usecases/istio-community-tips.md | 2 +- usecases/istio-tutorial.md | 2 +- usecases/istio-tutorials-collection.md | 63 ---- usecases/istio.md | 8 +- usecases/linkerd.md | 122 -------- 17 files changed, 16 insertions(+), 658 deletions(-) create mode 100644 images/github-banner.jpg delete mode 100644 practice/vistio-visualize-your-istio-mesh.md delete mode 100644 usecases/conduit.md delete mode 100644 usecases/dubbo-on-x-protocol-in-sofa-mesh.md delete mode 100644 usecases/envoy-sidecar-routing-of-istio-service-mesh-deep-dive.md delete mode 100644 usecases/istio-tutorials-collection.md delete mode 100644 usecases/linkerd.md diff --git a/README.md b/README.md index e169ce67e..fe261d991 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,7 @@ Kubernetes Handbook 项目始于 2016 年底,开源于 2017 年 3 月,作为

- 加入云原生社区 + 加入云原生社区

diff --git a/SUMMARY.md b/SUMMARY.md index 3e99e96ca..2a3933b90 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -225,9 +225,7 @@ * [使用 Istio 前需要考虑的问题](usecases/before-using-istio.md) * [Istio 中 sidecar 的注入规范及示例](usecases/sidecar-spec-in-istio.md) * [如何参与 Istio 社区及注意事项](usecases/istio-community-tips.md) - * [Istio 免费学习资源汇总](usecases/istio-tutorials-collection.md) * [Sidecar 的注入与流量劫持](usecases/understand-sidecar-injection-and-traffic-hijack-in-istio-service-mesh.md) - * [Envoy Sidecar 代理的路由转发](usecases/envoy-sidecar-routing-of-istio-service-mesh-deep-dive.md) * [Istio 如何支持虚拟机](usecases/how-to-integrate-istio-with-vm.md) * [Istio 支持虚拟机的历史](usecases/istio-vm-support.md) * [Envoy](usecases/envoy.md) diff --git a/appendix/kubernetes-and-cloud-native-summary-in-2018-and-outlook-for-2019.md b/appendix/kubernetes-and-cloud-native-summary-in-2018-and-outlook-for-2019.md index 45803e403..435e33bdc 100644 --- a/appendix/kubernetes-and-cloud-native-summary-in-2018-and-outlook-for-2019.md +++ b/appendix/kubernetes-and-cloud-native-summary-in-2018-and-outlook-for-2019.md @@ -80,14 +80,14 @@ Kubernetes 并不直接对外提供业务能力,而是作为应用运行的底 - 2018 年 5 月 30 日,[Envoy 最新官方文档中文版发布 —— 由 Service Mesh 爱好者倾情奉献](https://www.servicemesher.com/envoy/)。 - 2018 年 6 月 21 日,[启用新的社区 logo](https://mp.weixin.qq.com/s?__biz=MzIwNDIzODExOA==&mid=2650165956&idx=2&sn=8ef0f080fd428b6307389fce4546103a&chksm=8ec1ce8db9b6479b846b37e0fdffbc0f1a6b23c17329032af7e1b9e6dc6412966f42edcf08f9&scene=21#wechat_redirect)。 - 2018 年 6 月 30 日,[开启新域名 servicemesher.com](https://www.servicemesher.com/)。 -- 2018 年 6 月 30 日,举办了第一届 Service Mesh Meetup 杭州站,见 [ServiceMesher 杭州 Meetup 圆满完成](https://www.servicemesher.com/blog/hangzhou-meetup-20180630/)。 +- 2018 年 6 月 30 日,举办了第一届 Service Mesh Meetup 杭州站,见 [ServiceMesher 杭州 Meetup 圆满完成](https://cloudnative.to/blog/hangzhou-meetup-20180630/)。 - 2018 年 7 月,ServiceMesher 社区成为 [Istio 社区中国合作伙伴](https://istio.io/about/community/)。 -- 2018 年 7 月 29 日,举办了第二届 Service Mesh Meetup 北京站,见[第二届 Service Mesh Meetup 北京站回顾、视频回放和资料下载](https://www.servicemesher.com/blog/beijing-meetup-20180729/)。 -- 2018 年 8 月 25 日,举办了第三届 Service Mesh Meetup 深圳站,见 [Service Mesh Meetup 深圳站回顾、视频回放及 PPT 资料分享](https://www.servicemesher.com/blog/service-mesh-meetup-shenzhen-20180825/)。 +- 2018 年 7 月 29 日,举办了第二届 Service Mesh Meetup 北京站,见[第二届 Service Mesh Meetup 北京站回顾、视频回放和资料下载](https://cloudnative.to/blog/beijing-meetup-20180729/)。 +- 2018 年 8 月 25 日,举办了第三届 Service Mesh Meetup 深圳站,见 [Service Mesh Meetup 深圳站回顾、视频回放及 PPT 资料分享](https://cloudnative.to/blog/service-mesh-meetup-shenzhen-20180825/)。 - 2018 年 9 月 19 日,开始了开源电子书 [istio-handbook](https://github.com/rootsongjc/istio-handbook/) 的创作。 - 2018 年 11 月 13 日,[ServiceMesher 社区成员聚首 KubeCon&CloudNativeCon 上海](https://jimmysong.io/blog/kubecon-cloudnativecon-china-2018/)。 -- 2018 年 11 月 25 日,举办了第四届 Service Mesh Meetup 上海站,见[第四届 Service Mesh Meetup 上海站活动回顾与资料下载](https://www.servicemesher.com/blog/service-mesh-meetup-shanghai-20181125/)。 -- 2019 年 1 月 6 日,举办了第五届 Service Mesh Meetup 广州站,见[第五届 Service Mesh Meetup 广州站活动回顾与资料下载](https://www.servicemesher.com/blog/service-mesh-meetup-guangzhou-20190106/)。 +- 2018 年 11 月 25 日,举办了第四届 Service Mesh Meetup 上海站,见[第四届 Service Mesh Meetup 上海站活动回顾与资料下载](https://cloudnative.to/blog/service-mesh-meetup-shanghai-20181125/)。 +- 2019 年 1 月 6 日,举办了第五届 Service Mesh Meetup 广州站,见[第五届 Service Mesh Meetup 广州站活动回顾与资料下载](https://cloudnative.to/blog/service-mesh-meetup-guangzhou-20190106/)。 ## Serverless diff --git a/cloud-native/quick-start.md b/cloud-native/quick-start.md index 1b4ec8ce0..2167ea9c0 100644 --- a/cloud-native/quick-start.md +++ b/cloud-native/quick-start.md @@ -116,7 +116,7 @@ kubectl 是一个命令行工具,用于与 Kubernetes 集群和其中的 pod 如果没有服务网格,对容器来说这项工作将十分繁琐,因为这涉及到逐一更改所有其他容器上的配置,将它们所包含的服务从 Container1 指向 Container2,然后在测试失败后,将它们全部改回来。 -在前面这部分 Kubernetes 指南中,我们介绍了一些与 Kubernetes 网络相关的概念。Kubernetes 中的网络可能很棘手,很难理解,如果你刚刚开始,你可能需要一些实践来理解这里。关于服务网格的更多内容请参考 [Istio Handbook——Istio 服务网格进阶实战](https://www.servicemesher.com/istio-handbook)。 +在前面这部分 Kubernetes 指南中,我们介绍了一些与 Kubernetes 网络相关的概念。Kubernetes 中的网络可能很棘手,很难理解,如果你刚刚开始,你可能需要一些实践来理解这里。关于服务网格的更多内容请参考 [《Istio 服务网格》](https://jimmysong.io/istio-handbook/)。 在下一部分中,我们将展开更多关于 Kubernetes 的话题:如何开始学习 Kubernetes,如何在本地安装和测试 Kubernetes,以及 Kubernetes 的一些优秀的监控工具。 diff --git a/concepts/crd.md b/concepts/crd.md index 7340634b2..86c4c0348 100644 --- a/concepts/crd.md +++ b/concepts/crd.md @@ -2,7 +2,7 @@ 本文是如何创建 CRD 来扩展 Kubernetes API 的教程。CRD 是用来扩展 Kubernetes 最常用的方式,在 Service Mesh 和 Operator 中也被大量使用。因此读者如果想在 Kubernetes 上做扩展和开发的话,是十分有必要了解 CRD 的。 -在阅读本文前您需要先了解[使用自定义资源扩展 API](custom-resource.md), 以下内容译自 [Kubernetes 官方文档](https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/),有删改,推荐阅读[如何从零开始编写一个 Kubernetes CRD](https://www.servicemesher.com/blog/kubernetes-crd-quick-start/)。 +在阅读本文前您需要先了解[使用自定义资源扩展 API](custom-resource.md), 以下内容译自 [Kubernetes 官方文档](https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/),有删改,推荐阅读[如何从零开始编写一个 Kubernetes CRD](https://cloudnative.to/blog/kubernetes-crd-quick-start/)。 ## 创建 CRD(CustomResourceDefinition) diff --git a/images/github-banner.jpg b/images/github-banner.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f80515357dc522609e65e3015613fd3d6181ef13 GIT binary patch literal 58249 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 literal 0 HcmV?d00001 diff --git a/practice/vistio-visualize-your-istio-mesh.md b/practice/vistio-visualize-your-istio-mesh.md deleted file mode 100644 index 8f4b95498..000000000 --- a/practice/vistio-visualize-your-istio-mesh.md +++ /dev/null @@ -1,137 +0,0 @@ -# 使用Vistio监控Istio服务网格中的流量 - -Vistio GitHub地址: - -[Vizceral](https://github.com/Netflix/vizceral)是Netflix发布的一个开源项目,用于近乎实时地监控应用程序和集群之间的网络流量。Vistio是使用Vizceral对Istio和网格监控的改进。它利用Istio Mixer生成的指标,然后将其输入Prometheus。Vistio查询Prometheus并将数据存储在本地以允许重播流量。 - -Vizceral有两个可视化级别,全局可视化和集群级别可视化。在全局范围内(如上所示),您可以通过Istio Ingress Gateway等入口点将从Internet到Istio服务网格网络的网络流量可视化,或者您可以在Istio服务网格网络中显示总网络流量。 - -在集群级别(如下所示),您可以可视化内部网格的流量。通过设置警告和错误级别警报,当应用程序出现问题时可以被快速检测出来。 - -![Vistio的集群级别可视化](../images/00704eQkgy1fshft5oxlwj318g0pe0wp.jpg) - -### 在Istio服务网格中安装Vistio - -**依赖** - -- Prometheus -- Istio 0.7或更高版本 - -**假设** - -以下Demo使得这些假设更容易部署。如果您的环境设置不同,则可能需要将代码下载到本地并编辑一些文件。 - -- Prometheus部署在`istio-system` namespace下,可以通过`http://prometheus.istio-system:9090`地址访问 -- Istio mixer启用了`istio_request_count` metric -- Kubernetes集群包含有`standard` StorageClass -- 为了便于部署已安装了Helm(可选) - -**前言** - -如果您还尚未部署服务网格,可以按照Istio Bookinfo Demo 中的说明部署Istio及其示例应用程序。您需要能够在应用程序之间生成流量。要测试指标是否从Mixer正确发送到Prometheus,您可以运行以下Prometheus查询`istio_request_count`,应该会看到多个条目。 - -![Prometheus查询](../images/00704eQkgy1fshg0vw25ij318g0jzqjq.jpg) - -### 部署Vistio - -我们直接使用kubectl命令来部署。 - -**使用kubectl部署** - -```bash -kubectl apply -f https://raw.githubusercontent.com/rootsongjc/kubernetes-handbook/master/manifests/vistio/vistio-mesh-only.yaml -n default -``` - -### 验证和暴露Vistio Web/API - -验证应用程序已经启动并在运行。使用`kubectl port-forward`命令暴露应用程序。 - -**验证vistio-api** - -```bash -kubectl describe statefulset vistio-api -n default -``` - -**日志检查(可选的)** - -您应该能够从vistio-api的日志中查看是否存在与Prometheus的连接/查询相关的错误。 - -```bash -kubectl logs -n default -c vistio-api $(kubectl -n default get pod -l app=vistio-api -o jsonpath='{.items[0].metadata.name}') -``` - -**验证vistio-web** - -```bash -kubectl describe deployment vistio-web -n default -``` - -**暴露vistio-api** - -我们使用`kubectl port-forward`将vistio-api暴露到[http://localhost:9191](http://localhost:9191/)。 - -```bash -kubectl -n default port-forward $(kubectl -n default get pod -l app=vistio-api -o jsonpath='{.items[0].metadata.name}') 9091:9091 & -``` - -**验证visito-api** - -vistio-web调用vistio-api来渲染服务网格。访问您应该会看到类似下列的输出。 - -![vistio-api的期望输出](../images/00704eQkgy1fshi61t04oj310q17c0y1.jpg) - -**暴露Vistio** - -在另一个命令行终端中,暴露Vizcera UI到[http://localhost:8080](http://localhost:8080/)。 - -```bash -kubectl -n default port-forward $(kubectl -n default get pod -l app=vistio-web -o jsonpath='{.items[0].metadata.name}') 8080:8080 & -``` - -**访问Vistio** - -如果一切都已经启动并准备就绪,您就可以访问Vistio UI,开始探索服务网格网络,访问[http://localhost:8080](http://localhost:8080/)您将会看到类似下图的输出。 - -![Vistio主页面](../images/00704eQkgy1fshi98duzgj318g0l2406.jpg) - -### 探索 - -在全局范围内,您将看到Istio网格内所有请求的总和。如果您部署了istio-ingressgateway,则可以选择显示通过其他配置从网格外部接收的流量,参考[使用Ingress Gateway部署Vistio](https://github.com/nmnellis/vistio#deploy-vistio-with-istio-ingress-gateway-helm)。 - -如果您点击istio-mesh气泡,您将能够查看您的网状网络。 - -![istio mesh的网络流量](../images/00704eQkgy1fshibdwcj3j318g0p8th1.jpg) - -在您的Istio网格中,您可以使用许多可视化工具来帮助您查明故障的应用程序。 - -![查明网络问题](../images/00704eQkgy1fshicc7or1j318g0p8ahr.jpg) - -使用屏幕右上方的过滤器可以快速过滤出错误率较高的应用程序。通过高级配置,当错误率超过特定值时,也可以触发警报。警报将显示给定应用程序的当前错误率趋势。 - -### 问题排查 - -访问,如果您从vistio-api中看到以下输出,表示某些功能无法正常工作。正确的输出显示在教程上面。 - -![vistio api的不正确输出](../images/00704eQkgy1fshie7wxkyj30ks0f4myd.jpg) - -**1.** 检查vistio-api日志中是否有错误——在大多数情况下,vistio-api将记录与Prometheus通信时遇到的任何问题。 - -```bash -kubectl logs -n default -c vistio-api $(kubectl -n default get pod -l app=vistio-api -o jsonpath='{.items[0].metadata.name}') -``` - -**2.** 验证Prometheus查询——vistio-api使用以下查询检索其数据。您应该确保Prometheus内部的数据都存在。 - -```bash -# Global Level Query -sum(rate(istio_request_count[1m])) by (response_code) -# Cluster Level Query -sum(rate(istio_request_count[1m])) by (source_service,destination_service,response_code) -``` - -**3.** 提交Issue——如果遇到问题无法解决请提交Issue: - -## 参考 - -- https://github.com/nmnellis/vistio -- [Vistio—使用Netflix的Vizceral可视化Istio service mesh](https://servicemesher.github.io/blog/vistio-visualize-your-istio-mesh-using-netflixs-vizceral/) diff --git a/usecases/conduit.md b/usecases/conduit.md deleted file mode 100644 index c0f542c6e..000000000 --- a/usecases/conduit.md +++ /dev/null @@ -1,16 +0,0 @@ -# Conduit - 基于Kubernetes的轻量级Service Mesh - -> **注意**:Conduit在发布0.5版本后已经停止开发,而是合并入Linkerd 2.0,详见[Conduit 0.5发布—以及R.I.P. Conduit](http://www.servicemesher.com/blog/rip-conduit/)。 - -2017年12月在得克萨斯州的Asdin,KubeCon和CloudNativeCon上,创造了Service Mesh这个词汇并开源了[Linkerd](https://linkerd.io)的公司[Buoyant](https://buoyant.io),又开源了一款针对Kubernetes的超轻量Service Sesh——[Conduit](https://github.com/runconduit/conduit)。它可以透明得管理服务运行时之间的通信,使得在Kubernetes上运行服务更加安全和可靠;它还具有不用修改任何应用程序代码即可改进应用程序的可观测性、可靠性及安全性等方面的特性。 - -Condiut与[Linkerd](https://linkerd.io)的设计方式不同,它跟[Istio](https://istio.io)一样使用的是Sidecar模式,但架构又没Istio那么复杂。Conduit只支持Kubernetes,且只支持HTTP2(包括gRPC)协议。 - -Conduit使用Rust和Go语言开发,GitHub地址 https://github.com/runconduit/conduit - -安装Conduit必须使用Kubernetes1.8以上版本。 - -## 参考 - -- Conduit GitHub:https://github.com/runconduit/conduit -- 关于Conduit的更多资源请参考官方网站:https://conduit.io/ diff --git a/usecases/dubbo-on-x-protocol-in-sofa-mesh.md b/usecases/dubbo-on-x-protocol-in-sofa-mesh.md deleted file mode 100644 index e3fcf9c42..000000000 --- a/usecases/dubbo-on-x-protocol-in-sofa-mesh.md +++ /dev/null @@ -1,292 +0,0 @@ -# SOFAMesh中运行Dubbo on x-protocol - - **注意:本书中的 Service Mesh 章节已不再维护,请转到 [istio-handbook](https://www.servicemesher.com/istio-handbook) 中浏览。** - -原文作者:彭泽文,阿里巴巴UC事业部高级开发工程师,有改动。 - -X-protocol 的定位是云原生、高性能、低侵入性的通用 Service Mesh 落地方案,依托 Kubernetes 基座,利用其原生的服务注册和服务发现机制,支持各种私有 RPC 协议低成本、易扩展的接入,快速享受 Service Mesh 所带来的红利。 - -本文将以 [Dubbo](https://dubbo.incubator.apache.org/) 为例,演示 Dubbo on x-protocol 场景下 Service Mesh 路由功能,涵盖 Version route 、Weighted route 功能。 - -关于 x-protocol 的介绍请参考 [蚂蚁金服开源的 SOFAMesh 的通用协议扩展解析](http://www.servicemesher.com/blog/ant-financial-sofamesh-common-protocol-extension/)。 - -## 前期准备 - -1. 部署 Kubernetes 集群,建议使用 https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster -2. 安装 kubectl 命令行工具,请参考 [https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl) -3. 安装 VM Driver,推荐安装 Virtual Box、Mac 用户也可以选择 hyperkit -4. 了解 Istio Traffic Management 相关概念 - -## 部署 - -先看部署效果图: - -![Mosn x-protocol部署图](../images/1536291419546-2aa160de-69cd-497f-a280-fae20a1f87a3.png) - -本示例中dubbo-consumer的部署方式采用直连模式,即不走注册中心,完全依托kubernetes平台提供的服务注册及服务发现能力。 - -### 1. 安装 Kubernetes - -安装 kubectl 命令行工具 -推荐使用 Kubernetes 1.10 版本,并使用合适的 VM Driver,推荐使用默认的 VirtualBox。 - -```bash -minikube start --memory=8192 --cpus=4 --kubernetes-version=v1.10.0 \ - --extra-config=controller-manager.cluster-signing-cert-file="/var/lib/localkube/certs/ca.crt" \ - --extra-config=controller-manager.cluster-signing-key-file="/var/lib/localkube/certs/ca.key" -``` - -Mac OSX 用户使用的 hyperkit 需要特别指定: - -```bash -minikube start --memory=8192 --cpus=4 --kubernetes-version=v1.10.0 \ - --extra-config=controller-manager.cluster-signing-cert-file="/var/lib/localkube/certs/ca.crt" \ - --extra-config=controller-manager.cluster-signing-key-file="/var/lib/localkube/certs/ca.key" \ - --vm-dirver=hyperkit -``` - -等待 Kubernetes 启动完毕,通过 kubectl 命令检查 - -```bash -kubectl get pods --namespace=kube-system -``` - -### 2. 部署 SOFAMesh - -本示例演示从源代码的 master 分支直接安装最新的 SOFAMesh,安装过程使用 Helm 完成。 - -从 GitHub 拉取最新代码: - -```bash -git clone https://github.com/sofastack/sofa-mesh.git -cd sofa-mesh -``` - -创建 SOFAMesh 需要的 CRD: - -```bash -kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml -kubectl apply -f install/kubernetes/helm/istio/charts/certmanager/templates/crds.yaml -``` - -使用 Helm 安装 SOFAMesh: - -```bash -kubectl apply -f install/kubernetes/helm/helm-service-account.yaml -helm init --service-account tiller -helm install install/kubernetes/helm/istio --name istio --namespace istio-system -``` - -安装 istioctl 命令行工具: - -```bash -# 使用 make 工具安装 istioctl -make istioctl-install -``` - -### 3. 创建示例的命名空间 - -以下示例都将运行在 e2e-dubbo 命名空间下,如无 e2e-dubbo 命名空间,需先创建该命名空间: - -```bash -kubectl apply -f samples/e2e-dubbo/platform/kube/e2e-dubbo-ns.yaml -``` - -### 4. 注入 MOSN - -部署 dubbo-consumer 和 dubbo-provider,部署前需要先使用 istioctl 进行 sidecar 注入,以下示例采用手动注入方式,也可以通过 istio namespace inject 功能来自动注入。 - -```bash -# mosn sidecar inject and deploy -kubectl apply -f <(istioctl kube-inject -f samples/e2e-dubbo/platform/kube/dubbo-consumer.yaml) -kubectl apply -f <(istioctl kube-inject -f samples/e2e-dubbo/platform/kube/dubbo-provider-v1.yaml) -kubectl apply -f <(istioctl kube-inject -f samples/e2e-dubbo/platform/kube/dubbo-provider-v2.yaml) -``` - -### 5. 部署示例应用 - -部署 dubbo consumer service 及 dubbo provider service。 - -```bash -# http service for dubbo consumer -kubectl apply -f samples/e2e-dubbo/platform/kube/dubbo-consumer-service.yaml - -# dubbo provider service -kubectl apply -f samples/e2e-dubbo/platform/kube/dubbo-provider-service.yaml -``` - -检查部署状态: - -```bash -#kubectl get pods -n e2e-dubbo -NAME READY STATUS RESTARTS AGE -e2e-dubbo-consumer-589d8c465d-cp7cx 2/2 Running 0 13s -e2e-dubbo-provider-v1-649d7cff94-52gfd 2/2 Running 0 13s -e2e-dubbo-provider-v2-5f7d5ff648-m6c45 2/2 Running 0 13s - -#kubectl get svc -n e2e-dubbo -NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -e2e-dubbo-consumer ClusterIP 192.168.1.7 8080/TCP 10s -e2e-dubbo-provider ClusterIP 192.168.1.62 12345/TCP 10s -``` - -e2e-dubbo-consumer 是一个 Dubbo 客户端应用,它暴露了一个 8080 端口的 HTTP 服务,方便我们进行验证,e2e-dubbo-provider 是一个 Dubbo 应用。 -当 e2e-dubbo-consumer 通过 12345 端口调用 e2e-dubbo-provider 时,流量会被 IPtable 规则拦截,导流给 MOSN。 - -## 验证路由能力 - -本示例将验证 Version route 和 Weighted route 能力。 - -### 1. 验证 Version Route 能力 - -本例将演示控制 dubbo-consumer的所有请求指向 dubo-provider-v1 -配置DestinationRule: - -```bash -istioctl create -f samples/e2e-dubbo/platform/kube/dubbo-consumer.destinationrule.yaml -``` - -`dubbo-consumer.destinationrule.yaml` 内容如下: - -```yaml -apiVersion: networking.istio.io/v1alpha3 -kind: DestinationRule -metadata: - name: e2e-dubbo-provider - namespace: e2e-dubbo -spec: - host: e2e-dubbo-provider - subsets: - - name: v1 - labels: - ver: v1 - - name: v2 - labels: - ver: v2 -``` - -配置VirtualService: - -```bash -istioctl create -f samples/e2e-dubbo/platform/kube/dubbo-consumer.version.vs.yaml -``` - -`dubbo-consumer.version.vs.yaml` 内容如下: - -```yaml -apiVersion: networking.istio.io/v1alpha3 -kind: VirtualService -metadata: - name: e2e-dubbo-provider - namespace: e2e-dubbo -spec: - hosts: - - e2e-dubbo-provider - http: - - route: - - destination: - host: e2e-dubbo-provider - subset: v1 -``` - -路由策略已经生效,可以 http 请求 dubbo consumer 来触发 rpc 请求观察效果,由于使用 Minikube 的关系,需要启动一个 Pod 用来测试 - -```bash -# 启动一个 busybox Pod 并登陆 -kubectl run -i -t busybox --image=yauritux/busybox-curl --restart=Never -# 使用 e2e-dubbo-consumer 的域名访问服务 -curl e2e-dubbo-consumer.e2e-dubbo.svc.cluster.local:8080/sayHello?name=dubbo-mosn -``` - -清理路由策略: - -```bash -istioctl delete -f samples/e2e-dubbo/platform/kube/dubbo-consumer.destinationrule.yaml -istioctl delete -f samples/e2e-dubbo/platform/kube/dubbo-consumer.version.vs.yaml -``` - -退出 Minikube shell - -### 2. 验证 Weight Route 能力 - -本例将演示控制 dubbo-consumer 的请求指向 dubo-provider-v1,dubo-provider-v2。并控制流量分配比例为 v1:20%,v2:80%。 - -配置DestinationRule: - -```bash -# 如果在上一示例中已经创建好了,请跳过这一步 -istioctl create -f samples/e2e-dubbo/platform/kube/dubbo-consumer.destinationrule.yaml -``` - -`dubbo-consumer.destinationrule.yaml` 内容如下: - -```yaml -apiVersion: networking.istio.io/v1alpha3 -kind: DestinationRule -metadata: - name: e2e-dubbo-provider - namespace: e2e-dubbo -spec: - host: e2e-dubbo-provider - subsets: - - name: v1 - labels: - ver: v1 - - name: v2 - labels: - ver: v2 -``` - -配置 VirtualService: - -```bash -istioctl create -f samples/e2e-dubbo/platform/kube/dubbo-consumer.weight.vs.yaml -``` - -`dubbo-consumer.weight.vs.yaml` 内容如下: - -```yaml -apiVersion: networking.istio.io/v1alpha3 -kind: VirtualService -metadata: - name: e2e-dubbo-provider - namespace: e2e-dubbo -spec: - hosts: - - e2e-dubbo-provider - http: - - route: - - destination: - host: e2e-dubbo-provider - subset: v1 - weight: 20 - - destination: - host: e2e-dubbo-provider - subset: v2 - weight: 80 -``` - -路由策略已经生效,可以 http 请求 dubbo consumer 来触发 rpc 请求观察效果: - -```bash -# 启动一个 busybox Pod 并登陆 -kubectl run -i -t busybox --image=yauritux/busybox-curl --restart=Never -# 使用 e2e-dubbo-consumer 的域名访问服务 -curl e2e-dubbo-consumer.e2e-dubbo.svc.cluster.local:8080/sayHello?name=dubbo-mosn -``` - -清理路由策略: - -```bash -istioctl delete -f samples/e2e-dubbo/platform/kube/dubbo-consumer.destinationrule.yaml -istioctl delete -f samples/e2e-dubbo/platform/kube/dubbo-consumer.weight.vs.yaml -``` - -SOFAMesh Github 地址:https://github.com/sofastack/sofa-mesh - -## 参考文档 - -- [蚂蚁金服开源的 SOFAMesh 的通用协议扩展解析 - servicemesher.com](http://www.servicemesher.com/blog/ant-financial-sofamesh-common-protocol-extension/) -- [Dubbo quick start - dubbo.incubator.apache.org](https://dubbo.incubator.apache.org/en-us/docs/user/quick-start.html) - -- 关于SOFAMesh的更多信息请访问 https://www.sofastack.tech diff --git a/usecases/envoy-sidecar-routing-of-istio-service-mesh-deep-dive.md b/usecases/envoy-sidecar-routing-of-istio-service-mesh-deep-dive.md deleted file mode 100644 index c89e673ea..000000000 --- a/usecases/envoy-sidecar-routing-of-istio-service-mesh-deep-dive.md +++ /dev/null @@ -1,11 +0,0 @@ -# 深入理解Istio Service Mesh中的Envoy Sidecar代理的路由转发 - -**注意:本文基于 Istio 1.5。** - -本文以 Istio 官方的 bookinfo 示例来讲解在进入 Pod 的流量被 iptables 转交给 Envoy sidecar 后,Envoy 是如何做路由转发的,详述了 Inbound 和 Outbound 处理过程。关于流量拦截的详细分析请参考[理解 Istio Service Mesh 中 Envoy 代理 Sidecar 注入及流量劫持](understand-sidecar-injection-and-traffic-hijack-in-istio-service-mesh.md)。 - -下面是 Istio 官方提供的 bookinfo 的请求流程图,假设 bookinfo 应用的所有服务中没有配置 DestinationRule。 - -![Bookinfo 示例](../images/006tNbRwgy1fvlwjd3302j31bo0ro0x5.jpg) - -请读者参考 ServiceMesher 社区出品的 Istio Handbook 中的 [Sidecar 流量路由机制分析](https://www.servicemesher.com/istio-handbook/concepts/sidecar-traffic-route.html)一节。 \ No newline at end of file diff --git a/usecases/envoy.md b/usecases/envoy.md index dcb02b9ce..aa09f037c 100644 --- a/usecases/envoy.md +++ b/usecases/envoy.md @@ -36,3 +36,4 @@ Matt Klein 是在他的文章中指出 sidecar 模式的 proxy 将取代另外 - [Introduction to modern network load balancing and proxying - blog.envoyproxy.io](https://blog.envoyproxy.io/introduction-to-modern-network-load-balancing-and-proxying-a57f6ff80236) - [Envoy 官方文档中文版 - cloudnative.to](https://cloudnative.to/envoy/) +- [Envoy 基础教程 - jimmysong.io](https://jimmysong.io/envoy-handbook/) diff --git a/usecases/integrating-vms.md b/usecases/integrating-vms.md index 9ff108478..06df7ee9c 100644 --- a/usecases/integrating-vms.md +++ b/usecases/integrating-vms.md @@ -1,6 +1,6 @@ # 集成虚拟机 -**注意:本文档已失效,请浏览 [Istio 官方文档](https://istio.io)。本书中的 Service Mesh 章节已不再维护,请转到 [istio-handbook](https://www.servicemesher.com/istio-handbook) 中浏览。** +**注意:本文档已失效,请浏览 [Istio 官方文档](https://istio.io)。本书中的服务网格章节已不再维护,请转到 [istio-handbook](https://jimmysong.io/istio-handbook) 中浏览。** 该示例跨越 Kubernetes 集群和一组虚拟机上部署 Bookinfo 服务,描述如何使用 Istio service mesh 将此基础架构以单一 mesh 的方式操控。 diff --git a/usecases/istio-community-tips.md b/usecases/istio-community-tips.md index 0d396a308..4c5285c12 100644 --- a/usecases/istio-community-tips.md +++ b/usecases/istio-community-tips.md @@ -35,7 +35,7 @@ Istio 的代码规范沿用 [CNCF 社区的代码规范](https://github.com/cncf ### 设计文档 -所有的设计文档都保存在 [Google Drive](https://drive.google.com/drive/u/0/folders/0AIS5p3eW9BCtUk9PVA) 中,其中包括以下资源: +所有的设计文档都保存在 [Google Drive](https://drive.google.com/drive/folders/0ADmbrU7ueGOUUk9PVA) 中,其中包括以下资源: - Technical Oversight Committee:ToC管理的文档 - Misc:一些杂项 diff --git a/usecases/istio-tutorial.md b/usecases/istio-tutorial.md index d6de52191..b3e912d9e 100644 --- a/usecases/istio-tutorial.md +++ b/usecases/istio-tutorial.md @@ -1,6 +1,6 @@ # Istio 教程 -**注意:本文档已失效,请浏览 [Istio 官方文档](https://istio.io)。本书中的 Service Mesh 章节已不再维护,请转到 [istio-handbook](https://www.servicemesher.com/istio-handbook) 中浏览。** +**注意:本文档已失效,请浏览 [Istio 官方文档](https://istio.io)。本书中的 Service Mesh 章节已不再维护,请转到 [istio-handbook](https://jimmysong.io/istio-handbook/) 中浏览。** 本文是 Istio 管理 Java 微服务的案例教程,使用的所有工具和软件全部基于开源方案,替换了 [redhat-developer-demos/istio-tutorial](https://github.com/redhat-developer-demos/istio-tutorial) 中的 minishift 环境,使用 [kubernetes-vagrant-centos-cluster](https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster) 替代,沿用了原有的微服务示例,使用 Zipkin 做分布式追踪而不是 Jaeger。 diff --git a/usecases/istio-tutorials-collection.md b/usecases/istio-tutorials-collection.md deleted file mode 100644 index 136b9e6ef..000000000 --- a/usecases/istio-tutorials-collection.md +++ /dev/null @@ -1,63 +0,0 @@ -# Istio 学习资源汇总 - -在本地搭建起来还是有些门槛,稍显复杂,本文中将向你推荐几个可以在线上学习 Istio 的地方。 - -## Tetrate 提供的 Istio 基础课程 - -推荐指数:⭑⭑⭑⭑⭑ - -推荐原因:Tetrate 是企业级服务网格提供商,是 Istio 的核心贡献者之一,Tetrate 提供的免费的 Istio 基础课程,其中包括文字加视频讲解,覆盖全面,课后还有自主测试,内容最新最完整。 - -![Tetrate Istio 基础教程](../images/tetrate-istio-fundamentals.png) - -该基础教程已推出[英文版](https://academy.tetrate.io/courses/istio-fundamentals)和[中文版](https://academy.tetrate.io/courses/istio-fundamentals-zh)。 - -## Katacode 上的 Istio 学习环境 - -推荐指数:⭑⭑⭑⭑ - -推荐原因:使用简单,使用官方示例,免费,快速,无需注册,可直接通过互联网访问示例应用页面,支持最新版的 Istio。 - -你[查看Katacoda 已支持 Istio 的学习环境](https://www.katacoda.com/courses/istio/deploy-istio-on-kubernetes)。 - -![katacoda](../images/006tNc79gy1ftwe77v4u5j31kw0ziwtw.jpg) - -![weavescope](../images/006tNc79gy1ftwhtmzhfej31kw0ziww1.jpg) - -只要傻瓜式操作就可以部署一个 Istio 出来,同时还提供了 Weave scope 可以对服务网格的中的服务关系做可视化呈现。 - -![weavescope](../images/006tNc79gy1ftwhvtu1vxj31kw0zitvc.jpg) - -同时还能提供部分监控功能,比如服务状态,CPU 和内存使用情况。 - -## 红帽提供的 Istio 教程 - -推荐指数:⭑⭑⭑⭑ - -推荐原因:教程章节划分简洁得当,红帽大力加持,[查看详情](https://developers.redhat.com/topics/service-mesh)。 - -![Red Hat](../images/006tNc79gy1ftwiolw1tyj31kw0zib29.jpg) - -![Red Hat developers](../images/006tNc79gy1ftwjyxiw1pj31kw0zi4qp.jpg) - -## IBM 的 Istio 示例教程 - -推荐指数:⭑⭑⭑ - -推荐原因:IBM 作为 Istio 项目的早期参与者,在 Istio 中也有大量的积淀,[查看详情](https://developer.ibm.com/code/patterns/manage-microservices-traffic-using-istio)。 - -![IBM developerWorks](../images/006tNc79gy1ftweryj0zrj31kw0zix6q.jpg) - -![IBM developers](../images/006tNc79gy1ftwesjg1e2j31kw0s8woq.jpg) - -## Istio Handbook - -推荐指数:⭑⭑⭑⭑⭑ - -推荐原因:由 ServiceMesher 共同撰写的开源 Istio 电子书,这本书是社区经验的结晶,你可以[查看本书的预览版](https://www.servicemesher.com/istio-handbook/),实体书将于 2022 年春季上市。 - -## Istio Workshop 视频教程 - -推荐指数:⭑⭑⭑⭑⭑ - -推荐原因:由笔者出品,图文并茂的定期更新 Istio 视频教程,你可以在 [Bilibili](https://space.bilibili.com/515485124/channel/collectiondetail?sid=184924) 或者[云原生社区](https://cloudnative.to)的视频号上查看合集。 \ No newline at end of file diff --git a/usecases/istio.md b/usecases/istio.md index 99e36b98d..171964ec4 100644 --- a/usecases/istio.md +++ b/usecases/istio.md @@ -1,4 +1,4 @@ -# Istio简介 +# Istio [Istio](https://istio.io) 是由 Google、IBM 和 Lyft 开源的微服务管理、保护和监控框架。Istio 为希腊语,意思是”起航“。 @@ -112,6 +112,6 @@ Galley 是 Istio 的配置验证、提取、处理和分发组件。它负责将 ## 参考 -- [Istio:一个用于微服务间通信的服务网格开源项目](https://www.infoq.cn/article/2017/05/istio) -- [Istio 是什么?](https://istio.io/docs/concepts/what-is-istio/) -- [Istio Handbook —— Istio 服务网格进阶实战](https://www.servicemesher.com/istio-handbook) +- [Istio:一个用于微服务间通信的服务网格开源项目 - infoq.cn](https://www.infoq.cn/article/2017/05/istio) +- [Istio 是什么?- istio.io](https://istio.io/docs/concepts/what-is-istio/) +- [Istio 服务网格—— 云原生应用网络构建指南 - jimmysong.io](https://jimmysong.io/istio-handbook/) diff --git a/usecases/linkerd.md b/usecases/linkerd.md deleted file mode 100644 index ae9dd4315..000000000 --- a/usecases/linkerd.md +++ /dev/null @@ -1,122 +0,0 @@ -# Linkerd简介 - -> **注意**:Linkerd最初版本是使用Scala开发的,现在已开始开发Linkerd2,使用Go语言开发,该公司的另一款轻量级Service Mesh conduit也寿终正寝,合并入Linkerd 2.0,详见[Conduit 0.5发布—以及R.I.P. Conduit](http://www.servicemesher.com/blog/rip-conduit/)。 - -Linkerd是一个用于云原生应用的开源、可扩展的service mesh(服务网格)。 - -## Linkerd是什么 - -Linkerd的出现是为了解决像twitter、google这类超大规模生产系统的复杂性问题。Linkerd不是通过控制服务之间的通信机制来解决这个问题,而是通过在服务实例之上添加一个抽象层来解决的。 - -![source https://linkerd.io](../images/diagram-individual-instance.png) - -Linkerd负责跨服务通信中最困难、易出错的部分,包括延迟感知、负载平衡、连接池、TLS、仪表盘、请求路由等——这些都会影响应用程序伸缩性、性能和弹性。 - -## 如何运行 - -Linkerd作为独立代理运行,无需特定的语言和库支持。应用程序通常会在已知位置运行linkerd实例,然后通过这些实例代理服务调用——即不是直接连接到目标服务,服务连接到它们对应的linkerd实例,并将它们视为目标服务。 - -在该层上,linkerd应用路由规则,与现有服务发现机制通信,对目标实例做负载均衡——与此同时调整通信并报告指标。 - -通过延迟调用linkerd的机制,应用程序代码与以下内容解耦: - -- 生产拓扑 -- 服务发现机制 -- 负载均衡和连接管理逻辑 - -应用程序也将从一致的全局流量控制系统中受益。这对于多语言应用程序尤其重要,因为通过库来实现这种一致性是非常困难的。 - -Linkerd实例可以作为sidecar(既为每个应用实体或每个主机部署一个实例)来运行。 由于linkerd实例是无状态和独立的,因此它们可以轻松适应现有的部署拓扑。它们可以与各种配置的应用程序代码一起部署,并且基本不需要去协调它们。 - -## 详解 - -Linkerd 的基于 Kubernetes 的 Service Mesh 部署方式是使用 Kubernetes 中的 **DaemonSet** 资源对象,如下图所示。 - -![Linkerd 部署架构(图片来自https://buoyant.io/2016/10/14/a-service-mesh-for-kubernetes-part-ii-pods-are-great-until-theyre-not/)](https://buoyant.io/wp-content/uploads/2017/07/buoyant-k8s-daemonset-mesh.png) - -这样 Kubernetes 集群中的每个节点都会运行一个 Linkerd 的 Pod。 - -但是这样做就会有几个问题: - -- 节点上的应用如何发现其所在节点上的 Linkerd 呢? -- 节点间的 Linkerd 如何路由的呢? -- Linkerd 如何将接收到的流量路由到正确的目的应用呢? -- 如何对应用的路有做细粒度的控制? - -这几个问题在 Buoyant 公司的这篇博客中都有解答:[A Service Mesh for Kubernetes, Part II: Pods are great until they’re not](https://buoyant.io/2016/10/14/a-service-mesh-for-kubernetes-part-ii-pods-are-great-until-theyre-not/),我们下面将简要的回答上述问题。 - -### 节点上的应用如何发现其所在节点上的 Linkerd 呢? - -简而言之,是使用环境变量的方式,如在应用程序中注入环境变量 `http_proxy`: - -```yaml -env: -- name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName -- name: http_proxy - value: $(NODE_NAME):4140 -args: -- "-addr=:7777" -- "-text=Hello" -- "-target=world" -``` - -这要求应用程序必须支持该环境变量,为应用程序所在的 Pod 设置了一个代理,实际上对于每种不同的协议 Linkerd 都监听不同的端口。 - -- 4140 for HTTP -- 4240 for HTTP/2 -- 4340 for gRPC - -关于 Linkerd 作为 Service Mesh 的详细配置请参考 [serivcemesh.yml](https://github.com/rootsongjc/kubernetes-handbook/blob/master/manifests/linkerd/servicemesh.yml)。 - -### 节点间的 Linkerd 如何路由的以及 Linkerd 如何将接收到的流量路由到正确的目的应用呢? - -通过 **transformer** 来确定节点间的 Linkerd 路由,参考下面的配置: - -```yaml -routers: -- protocol: http - label: outgoing - interpreter: - kind: default - transformers: - - kind: io.l5d.k8s.daemonset - namespace: default - port: incoming - service: l5d -``` - -Router 定义 Linkerd 如何实际地处理流量。Router 监听请求并在这些请求上应用路有规则,代理这些请求到正确的目的地。Router 是与协议相关的。对于每个 Router 都需要定义一个 incoming router 和一个 outcoming router。预计该应用程序将流量发送到 outcoming router,该 outcoming router 将其代理到目标服务节点上运行的 Linkerd 的 incoming router。Incoming router 后将请求代理给目标应用程序本身。我们还定义了 HTTP 和 HTTP/2 incoming router,它们充当 Ingress controller 并基于 Ingress 资源进行路由。 - -### 如何对路由规则做细粒度的控制呢? - -路由规则配置是在 namerd 中进行的,例如: - -```ini -$ namerctl dtab get internal -# version MjgzNjk5NzI= -/srv => /#/io.l5d.k8s/default/http ; -/host => /srv ; -/tmp => /srv ; -/svc => /host ; -/host/world => /srv/world-v1 ; -``` - -Namerd 中存储了很多 dtab 配置,通过这些配置来管理路有规则,实现微服务的流量管理。 - -![基于 dtab 的路由规则配置阶段发布](https://buoyant.io/wp-content/uploads/2017/07/buoyant-4_override.png) - -如果将 Linkerd 作为*边缘节点*还可以充当 Ingress controller,如下图所示。 - -![Linkerd ingress controller](https://buoyant.io/wp-content/uploads/2017/07/buoyant-k8s-hello-world-ingress-controller-1.png) - -Linkerd 自己最令人称道的是它在每台主机上只安装一个 Pod,如果使用 Sidecar 模式会为每个应用程序示例旁都运行一个容器,这样会导致过多的资源消耗。[Squeezing blood from a stone: small-memory JVM techniques for microservice sidecars](https://buoyant.io/2016/06/17/small-memory-jvm-techniques-for-microservice-sidecars/) 这篇文章中详细说明了 Linkerd 的资源消耗与性能。 - -## 参考 - -- [A Service Mesh for Kubernetes, Part II: Pods are great until they’re not](https://buoyant.io/2016/10/14/a-service-mesh-for-kubernetes-part-ii-pods-are-great-until-theyre-not/) -- [Squeezing blood from a stone: small-memory JVM techniques for microservice sidecars](https://buoyant.io/2016/06/17/small-memory-jvm-techniques-for-microservice-sidecars/) -- [Buoyant发布服务网格Linkerd的1.0版本](http://www.infoq.com/cn/news/2017/05/buoyant-release-ver-1-of-linkerd) -- [Linkerd documentation](https://linkerd.io/documentation/)