| <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Apache Dubbo – 传统 Dubbo 微服务集群如何平滑迁移到 Istio 服务网格体系</title><link>https://dubbo.apache.org/zh-cn/overview/tasks/mesh/migration/</link><description>Recent content in 传统 Dubbo 微服务集群如何平滑迁移到 Istio 服务网格体系 on Apache Dubbo</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><atom:link href="https://dubbo.apache.org/zh-cn/overview/tasks/mesh/migration/index.xml" rel="self" type="application/rss+xml"/><item><title>Overview: 地址同步</title><link>https://dubbo.apache.org/zh-cn/overview/tasks/mesh/migration/dubbo-mesh/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/tasks/mesh/migration/dubbo-mesh/</guid><description> |
| <p>遵循以下步骤,可以轻松掌握如何开发符合 Service Mesh 架构的 Dubbo 服务,并将其部署到 Kubernetes 并接入 Istio 的流量治理体系。在此查看 <a href="https://github.com/apache/dubbo-samples/tree/master/3-extensions/registry/dubbo-samples-mesh-k8s">完整示例源码</a></p> |
| <h2 id="1-总体目标">1 总体目标</h2> |
| <ul> |
| <li>部署 Dubbo 应用到 Kubernetes</li> |
| <li>Istio 自动注入 Envoy 并实现流量拦截</li> |
| <li>基于 Istio 规则进行流量治理</li> |
| </ul> |
| <h2 id="2-基本流程与工作原理">2 基本流程与工作原理</h2> |
| <p>这个示例演示了如何将 Dubbo 开发的应用部署在 Istio 体系下,以实现 Envoy 对 Dubbo 服务的自动代理,示例总体架构如下图所示。</p> |
| <p><img src="https://dubbo.apache.org/imgs/v3/mesh/thinsdk-envoy.png" alt="thinsdk"></p> |
| <p>完成示例将需要的步骤如下:</p> |
| <ol> |
| <li>创建一个 Dubbo 应用( <a href="https://github.com/apache/dubbo-samples/tree/master/3-extensions/registry/dubbo-samples-mesh-k8s">dubbo-samples-mesh-k8s</a> )</li> |
| <li>构建容器镜像并推送到镜像仓库( <a href="https://hub.docker.com/r/apache/dubbo-demo">本示例官方镜像</a> )</li> |
| <li>分别部署 Dubbo Provider 与 Dubbo Consumer 到 Kubernetes 并验证 Envoy 代理注入成功</li> |
| <li>验证 Envoy 发现服务地址、正常拦截 RPC 流量并实现负载均衡</li> |
| <li>基于 Istio VirtualService 实现按比例流量转发</li> |
| </ol> |
| <h2 id="3-详细步骤">3 详细步骤</h2> |
| <h3 id="31-环境要求">3.1 环境要求</h3> |
| <p>请确保本地安装如下环境,以提供容器运行时、Kubernetes集群及访问工具</p> |
| <ul> |
| <li><a href="https://www.docker.com/get-started/">Docker</a></li> |
| <li><a href="https://minikube.sigs.k8s.io/docs/start/">Minikube</a></li> |
| <li><a href="https://kubernetes.io/docs/tasks/tools/">Kubectl</a></li> |
| <li><a href="https://istio.io/latest/docs/setup/getting-started/">Istio</a></li> |
| <li><a href="https://github.com/ahmetb/kubectx">Kubens(optional)</a></li> |
| </ul> |
| <p>通过以下命令启动本地 Kubernetes 集群</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>minikube start |
| </span></span></code></pre></div><p>通过 kubectl 检查集群正常运行,且 kubectl 绑定到默认本地集群</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>kubectl cluster-info |
| </span></span></code></pre></div><h3 id="32-创建独立命名空间并开启自动注入">3.2 创建独立命名空间并开启自动注入</h3> |
| <p>通过以下命令为示例项目创建独立的 Namespace <code>dubbo-demo</code>,同时开启 sidecar 自动注入。</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#586e75"># 初始化命名空间</span> |
| </span></span><span style="display:flex;"><span>kubectl apply -f https://raw.githubusercontent.com/apache/dubbo-samples/master/3-extensions/registry/dubbo-samples-mesh-k8s/deploy/Namespace.yml |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># 切换命名空间</span> |
| </span></span><span style="display:flex;"><span>kubens dubbo-demo |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># dubbo-demo 开启自动注入</span> |
| </span></span><span style="display:flex;"><span>kubectl label namespace dubbo-demo istio-injection<span style="color:#719e07">=</span>enabled |
| </span></span></code></pre></div><h3 id="33-部署到-kubernetes">3.3 部署到 Kubernetes</h3> |
| <h4 id="331-部署-provider">3.3.1 部署 Provider</h4> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#586e75"># 部署 Service</span> |
| </span></span><span style="display:flex;"><span>kubectl apply -f https://raw.githubusercontent.com/apache/dubbo-samples/master/3-extensions/registry/dubbo-samples-mesh-k8s/deploy/provider/Service.yml |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># 部署 Deployment</span> |
| </span></span><span style="display:flex;"><span>kubectl apply -f https://raw.githubusercontent.com/apache/dubbo-samples/master/3-extensions/registry/dubbo-samples-mesh-k8s/deploy/provider/Deployment.yml |
| </span></span></code></pre></div><p>以上命令创建了一个名为 <code>dubbo-samples-mesh-provider</code> 的 Service,注意这里的 service name 与项目中的 dubbo 应用名是一样的。</p> |
| <p>接着 Deployment 部署了一个 2 副本的 pod 实例,至此 Provider 启动完成。</p> |
| <p>可以通过如下命令检查启动日志。</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#586e75"># 查看 pod 列表</span> |
| </span></span><span style="display:flex;"><span>kubectl get pods -l <span style="color:#268bd2">app</span><span style="color:#719e07">=</span>dubbo-samples-mesh-provider |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># 查看 pod 部署日志</span> |
| </span></span><span style="display:flex;"><span>kubectl logs your-pod-id |
| </span></span></code></pre></div><p>这时 pod 中应该有一个 dubbo provider 容器实例,同时还有一个 Envoy Sidecar 容器实例。</p> |
| <h4 id="332-部署-consumer">3.3.2 部署 Consumer</h4> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#586e75"># 部署 Service</span> |
| </span></span><span style="display:flex;"><span>kubectl apply -f https://raw.githubusercontent.com/apache/dubbo-samples/master/3-extensions/registry/dubbo-samples-mesh-k8s/deploy/consumer/Service.yml |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># 部署 Deployment</span> |
| </span></span><span style="display:flex;"><span>kubectl apply -f https://raw.githubusercontent.com/apache/dubbo-samples/master/3-extensions/registry/dubbo-samples-mesh-k8s/deploy/consumer/Deployment.yml |
| </span></span></code></pre></div><p>部署 consumer 与 provider 是一样的,这里也保持了 K8S Service 与 Dubbo consumer application name(在 <a href="https://github.com/apache/dubbo-samples/blob/master/3-extensions/registry//dubbo-samples-mesh-k8s/dubbo-samples-mesh-consumer/src/main/resources/spring/dubbo-consumer.properties">dubbo.properties</a> 中定义) 一致: <code>dubbo.application.name=dubbo-samples-mesh-consumer</code>。</p> |
| <blockquote> |
| <p>Dubbo Consumer 服务声明中还指定了消费的 Provider 服务(应用)名 <code>@DubboReference(version = &quot;1.0.0&quot;, providedBy = &quot;dubbo-samples-mesh-provider&quot;, lazy = true)</code></p> |
| </blockquote> |
| <h3 id="34-检查-provider-和-consumer-正常通信">3.4 检查 Provider 和 Consumer 正常通信</h3> |
| <p>继执行 3.3 步骤后, 检查启动日志,查看 consumer 完成对 provider 服务的消费。</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#586e75"># 查看 pod 列表</span> |
| </span></span><span style="display:flex;"><span>kubectl get pods -l <span style="color:#268bd2">app</span><span style="color:#719e07">=</span>dubbo-samples-mesh-consumer |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># 查看 pod 部署日志</span> |
| </span></span><span style="display:flex;"><span>kubectl logs your-pod-id |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># 查看 pod isitio-proxy 日志</span> |
| </span></span><span style="display:flex;"><span>kubectl logs your-pod-id -c istio-proxy |
| </span></span></code></pre></div><p>可以看到 consumer pod 日志输出如下( Triple 协议被 Envoy 代理负载均衡):</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#719e07">====================</span> dubbo invoke <span style="color:#2aa198">0</span> <span style="color:#268bd2">end</span> <span style="color:#719e07">====================</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">[</span>10/08/22 07:07:36:036 UTC<span style="color:#719e07">]</span> main INFO action.GreetingServiceConsumer: consumer Unary reply &lt;-message: <span style="color:#2aa198">&#34;hello,service mesh, response from provider-v1: 172.18.96.22:50052, client: 172.18.96.22, local: dubbo-samples-mesh-provider, remote: null, isProviderSide: true&#34;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">====================</span> dubbo invoke <span style="color:#2aa198">1</span> <span style="color:#268bd2">end</span> <span style="color:#719e07">====================</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">[</span>10/08/22 07:07:42:042 UTC<span style="color:#719e07">]</span> main INFO action.GreetingServiceConsumer: consumer Unary reply &lt;-message: <span style="color:#2aa198">&#34;hello,service mesh, response from provider-v1: 172.18.96.18:50052, client: 172.18.96.18, local: dubbo-samples-mesh-provider, remote: null, isProviderSide: true&#34;</span> |
| </span></span></code></pre></div><p>consumer istio-proxy 日志输出如下:</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#719e07">[</span>2022-07-15T05:35:14.418Z<span style="color:#719e07">]</span> <span style="color:#2aa198">&#34;POST /org.apache.dubbo.samples.Greeter/greet HTTP/2&#34;</span> <span style="color:#2aa198">200</span> |
| </span></span><span style="display:flex;"><span>- via_upstream - <span style="color:#2aa198">&#34;-&#34;</span> <span style="color:#2aa198">19</span> <span style="color:#2aa198">160</span> <span style="color:#2aa198">2</span> <span style="color:#2aa198">1</span> <span style="color:#2aa198">&#34;-&#34;</span> <span style="color:#2aa198">&#34;-&#34;</span> <span style="color:#2aa198">&#34;6b8a5a03-5783-98bf-9bee-f93ea6e3d68e&#34;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#2aa198">&#34;dubbo-samples-mesh-provider:50052&#34;</span> <span style="color:#2aa198">&#34;172.17.0.4:50052&#34;</span> |
| </span></span><span style="display:flex;"><span>outbound|50052<span style="color:#719e07">||</span>dubbo-samples-mesh-provider.dubbo-demo.svc.cluster.local 172.17.0.7:52768 10.101.172.129:50052 172.17.0.7:38488 - default |
| </span></span></code></pre></div><p>可以看到 provider pod 日志输出如下:</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#719e07">[</span>10/08/22 07:08:47:047 UTC<span style="color:#719e07">]</span> tri-protocol-50052-thread-8 INFO impl.GreeterImpl: Server <span style="color:#b58900">test</span> dubbo tri mesh received greet request name: <span style="color:#2aa198">&#34;service mesh&#34;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">[</span>10/08/22 07:08:57:057 UTC<span style="color:#719e07">]</span> tri-protocol-50052-thread-9 INFO impl.GreeterImpl: Server <span style="color:#b58900">test</span> dubbo tri mesh received greet request name: <span style="color:#2aa198">&#34;service mesh&#34;</span> |
| </span></span></code></pre></div><p>provider istio-proxy 日志输出如下:</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#719e07">[</span>2022-07-15T05:25:34.061Z<span style="color:#719e07">]</span> <span style="color:#2aa198">&#34;POST /org.apache.dubbo.samples.Greeter/greet HTTP/2&#34;</span> <span style="color:#2aa198">200</span> |
| </span></span><span style="display:flex;"><span>- via_upstream - <span style="color:#2aa198">&#34;-&#34;</span> <span style="color:#2aa198">19</span> <span style="color:#2aa198">162</span> <span style="color:#2aa198">1</span> <span style="color:#2aa198">1</span> <span style="color:#2aa198">&#34;-&#34;</span> <span style="color:#2aa198">&#34;-&#34;</span> <span style="color:#2aa198">&#34;201e6976-da10-96e1-8da7-ad032e58db47&#34;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#2aa198">&#34;dubbo-samples-mesh-provider:50052&#34;</span> <span style="color:#2aa198">&#34;172.17.0.10:50052&#34;</span> |
| </span></span><span style="display:flex;"><span> inbound|50052<span style="color:#719e07">||</span> 127.0.0.6:47013 172.17.0.10:50052 172.17.0.7:60244 |
| </span></span><span style="display:flex;"><span> outbound_.50052_._.dubbo-samples-mesh-provider.dubbo-demo.svc.cluster.local default |
| </span></span></code></pre></div><h3 id="35-流量治理---virtualservice-实现按比例流量转发">3.5 流量治理 - VirtualService 实现按比例流量转发</h3> |
| <p>部署 v2 版本的 demo provider</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>kubectl apply -f https://raw.githubusercontent.com/apache/dubbo-samples/master/3-extensions/registry/dubbo-samples-mesh-k8s/deploy/provider/Deployment-v2.yml |
| </span></span></code></pre></div><p>设置 VirtualService 与 DestinationRule,观察流量按照 4:1 的比例分别被引导到 provider v1 与 provider v2 版本。</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>kubectl apply -f https://raw.githubusercontent.com/apache/dubbo-samples/master/3-extensions/registry/dubbo-samples-mesh-k8s/deploy/traffic/virtual-service.yml |
| </span></span></code></pre></div><p>从消费端日志输出中,观察流量分布效果如下图:</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#719e07">====================</span> dubbo invoke 100 end <span style="color:#719e07">====================</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">[</span>10<span style="color:#719e07">/</span>08<span style="color:#719e07">/</span>22 07:15:58:058 UTC<span style="color:#719e07">]</span> main INFO action.GreetingServiceConsumer: consumer Unary reply <span style="color:#719e07">&lt;-</span>message: <span style="color:#2aa198">&#34;hello,service mesh, response from provider-v1: 172.18.96.18:50052, client: 172.18.96.18, local: dubbo-samples-mesh-provider, remote: null, isProviderSide: true&#34;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">====================</span> dubbo invoke 101 end <span style="color:#719e07">====================</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">[</span>10<span style="color:#719e07">/</span>08<span style="color:#719e07">/</span>22 07:16:03:003 UTC<span style="color:#719e07">]</span> main INFO action.GreetingServiceConsumer: consumer Unary reply <span style="color:#719e07">&lt;-</span>message: <span style="color:#2aa198">&#34;hello,service mesh, response from provider-v1: 172.18.96.22:50052, client: 172.18.96.22, local: dubbo-samples-mesh-provider, remote: null, isProviderSide: true&#34;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">====================</span> dubbo invoke 102 end <span style="color:#719e07">====================</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">[</span>10<span style="color:#719e07">/</span>08<span style="color:#719e07">/</span>22 07:16:08:008 UTC<span style="color:#719e07">]</span> main INFO action.GreetingServiceConsumer: consumer Unary reply <span style="color:#719e07">&lt;-</span>message: <span style="color:#2aa198">&#34;hello,service mesh, response from provider-v1: 172.18.96.18:50052, client: 172.18.96.18, local: dubbo-samples-mesh-provider, remote: null, isProviderSide: true&#34;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">====================</span> dubbo invoke 103 end <span style="color:#719e07">====================</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">[</span>10<span style="color:#719e07">/</span>08<span style="color:#719e07">/</span>22 07:16:13:013 UTC<span style="color:#719e07">]</span> main INFO action.GreetingServiceConsumer: consumer Unary reply <span style="color:#719e07">&lt;-</span>message: <span style="color:#2aa198">&#34;hello,service mesh, response from provider-v2: 172.18.96.6:50052, client: 172.18.96.6, local: dubbo-samples-mesh-provider, remote: null, isProviderSide: true&#34;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">====================</span> dubbo invoke 104 end <span style="color:#719e07">====================</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">[</span>10<span style="color:#719e07">/</span>08<span style="color:#719e07">/</span>22 07:16:18:018 UTC<span style="color:#719e07">]</span> main INFO action.GreetingServiceConsumer: consumer Unary reply <span style="color:#719e07">&lt;-</span>message: <span style="color:#2aa198">&#34;hello,service mesh, response from provider-v1: 172.18.96.22:50052, client: 172.18.96.22, local: dubbo-samples-mesh-provider, remote: null, isProviderSide: true&#34;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">====================</span> dubbo invoke 105 end <span style="color:#719e07">====================</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">[</span>10<span style="color:#719e07">/</span>08<span style="color:#719e07">/</span>22 07:16:24:024 UTC<span style="color:#719e07">]</span> main INFO action.GreetingServiceConsumer: consumer Unary reply <span style="color:#719e07">&lt;-</span>message: <span style="color:#2aa198">&#34;hello,service mesh, response from provider-v1: 172.18.96.18:50052, client: 172.18.96.18, local: dubbo-samples-mesh-provider, remote: null, isProviderSide: true&#34;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">====================</span> dubbo invoke 106 end <span style="color:#719e07">====================</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">[</span>10<span style="color:#719e07">/</span>08<span style="color:#719e07">/</span>22 07:16:29:029 UTC<span style="color:#719e07">]</span> main INFO action.GreetingServiceConsumer: consumer Unary reply <span style="color:#719e07">&lt;-</span>message: <span style="color:#2aa198">&#34;hello,service mesh, response from provider-v1: 172.18.96.22:50052, client: 172.18.96.22, local: dubbo-samples-mesh-provider, remote: null, isProviderSide: true&#34;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">====================</span> dubbo invoke 107 end <span style="color:#719e07">====================</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">[</span>10<span style="color:#719e07">/</span>08<span style="color:#719e07">/</span>22 07:16:34:034 UTC<span style="color:#719e07">]</span> main INFO action.GreetingServiceConsumer: consumer Unary reply <span style="color:#719e07">&lt;-</span>message: <span style="color:#2aa198">&#34;hello,service mesh, response from provider-v1: 172.18.96.18:50052, client: 172.18.96.18, local: dubbo-samples-mesh-provider, remote: null, isProviderSide: true&#34;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">====================</span> dubbo invoke 108 end <span style="color:#719e07">====================</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">[</span>10<span style="color:#719e07">/</span>08<span style="color:#719e07">/</span>22 07:16:39:039 UTC<span style="color:#719e07">]</span> main INFO action.GreetingServiceConsumer: consumer Unary reply <span style="color:#719e07">&lt;-</span>message: <span style="color:#2aa198">&#34;hello,service mesh, response from provider-v1: 172.18.96.22:50052, client: 172.18.96.22, local: dubbo-samples-mesh-provider, remote: null, isProviderSide: true&#34;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">====================</span> dubbo invoke 109 end <span style="color:#719e07">====================</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">[</span>10<span style="color:#719e07">/</span>08<span style="color:#719e07">/</span>22 07:16:44:044 UTC<span style="color:#719e07">]</span> main INFO action.GreetingServiceConsumer: consumer Unary reply <span style="color:#719e07">&lt;-</span>message: <span style="color:#2aa198">&#34;hello,service mesh, response from provider-v1: 172.18.96.18:50052, client: 172.18.96.18, local: dubbo-samples-mesh-provider, remote: null, isProviderSide: true&#34;</span> |
| </span></span></code></pre></div><h3 id="36-查看-dashboard">3.6 查看 dashboard</h3> |
| <p>Istio 官网查看 <a href="https://istio.io/latest/docs/setup/getting-started/#dashboard">如何启动 dashboard</a>。</p> |
| <h2 id="4-修改示例">4 修改示例</h2> |
| <blockquote> |
| <ol> |
| <li>修改示例并非必须步骤,本小节是为想要调整代码并查看部署效果的读者准备的。</li> |
| <li>注意项目源码存储路径一定是英文,否则 protobuf 编译失败。</li> |
| </ol> |
| </blockquote> |
| <p>修改 Dubbo Provider 配置 <code>dubbo-provider.properties</code></p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-properties" data-lang="properties"><span style="display:flex;"><span><span style="color:#586e75"># provider</span> |
| </span></span><span style="display:flex;"><span>dubbo.application.name<span style="color:#719e07">=</span><span style="color:#2aa198">dubbo-samples-mesh-provider</span> |
| </span></span><span style="display:flex;"><span>dubbo.application.metadataServicePort<span style="color:#719e07">=</span><span style="color:#2aa198">20885</span> |
| </span></span><span style="display:flex;"><span>dubbo.registry.address<span style="color:#719e07">=</span><span style="color:#2aa198">N/A</span> |
| </span></span><span style="display:flex;"><span>dubbo.protocol.name<span style="color:#719e07">=</span><span style="color:#2aa198">tri</span> |
| </span></span><span style="display:flex;"><span>dubbo.protocol.port<span style="color:#719e07">=</span><span style="color:#2aa198">50052</span> |
| </span></span><span style="display:flex;"><span>dubbo.application.qosEnable<span style="color:#719e07">=</span><span style="color:#2aa198">true</span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># 为了使 Kubernetes 集群能够正常访问到探针,需要开启 QOS 允许远程访问,此操作有可能带来安全风险,请仔细评估后再打开</span> |
| </span></span><span style="display:flex;"><span>dubbo.application.qosAcceptForeignIp<span style="color:#719e07">=</span><span style="color:#2aa198">true</span> |
| </span></span></code></pre></div><p>修改 Dubbo Consumer 配置 <code>dubbo-consumer.properties</code></p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-properties" data-lang="properties"><span style="display:flex;"><span><span style="color:#586e75"># consumer</span> |
| </span></span><span style="display:flex;"><span>dubbo.application.name<span style="color:#719e07">=</span><span style="color:#2aa198">dubbo-samples-mesh-consumer</span> |
| </span></span><span style="display:flex;"><span>dubbo.application.metadataServicePort<span style="color:#719e07">=</span><span style="color:#2aa198">20885</span> |
| </span></span><span style="display:flex;"><span>dubbo.registry.address<span style="color:#719e07">=</span><span style="color:#2aa198">N/A</span> |
| </span></span><span style="display:flex;"><span>dubbo.protocol.name<span style="color:#719e07">=</span><span style="color:#2aa198">tri</span> |
| </span></span><span style="display:flex;"><span>dubbo.protocol.port<span style="color:#719e07">=</span><span style="color:#2aa198">20880</span> |
| </span></span><span style="display:flex;"><span>dubbo.consumer.timeout<span style="color:#719e07">=</span><span style="color:#2aa198">30000</span> |
| </span></span><span style="display:flex;"><span>dubbo.application.qosEnable<span style="color:#719e07">=</span><span style="color:#2aa198">true</span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># 为了使 Kubernetes 集群能够正常访问到探针,需要开启 QOS 允许远程访问,此操作有可能带来安全风险,请仔细评估后再打开</span> |
| </span></span><span style="display:flex;"><span>dubbo.application.qosAcceptForeignIp<span style="color:#719e07">=</span><span style="color:#2aa198">true</span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># 标记开启 mesh sidecar 代理模式</span> |
| </span></span><span style="display:flex;"><span>dubbo.consumer.meshEnable<span style="color:#719e07">=</span><span style="color:#2aa198">true</span> |
| </span></span></code></pre></div><p>完成代码修改后,通过项目提供的 Dockerfile 打包镜像</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#586e75"># 打包并推送镜像</span> |
| </span></span><span style="display:flex;"><span>mvn compile jib:build |
| </span></span></code></pre></div><blockquote> |
| <p>Jib 插件会自动打包并发布镜像。注意,本地开发需将 jib 插件配置中的 docker registry 组织 apache/dubbo-demo 改为自己有权限的组织(包括其他 kubernetes manifests 中的 dubboteam 也要修改,以确保 kubernetes 部署的是自己定制后的镜像),如遇到 jib 插件认证问题,请参考<a href="https://github.com/GoogleContainerTools/jib/blob/master/docs/faq.md#what-should-i-do-when-the-registry-responds-with-unauthorized">相应链接</a>配置 docker registry 认证信息。 |
| 可以通过直接在命令行指定 <code>mvn compile jib:build -Djib.to.auth.username=x -Djib.to.auth.password=x -Djib.from.auth.username=x -Djib.from.auth.username=x</code>,或者使用 docker-credential-helper.</p> |
| </blockquote> |
| <h2 id="5-常用命令">5 常用命令</h2> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#586e75"># dump current Envoy configs</span> |
| </span></span><span style="display:flex;"><span>kubectl <span style="color:#b58900">exec</span> -it <span style="color:#2aa198">${</span><span style="color:#268bd2">your</span> pod id<span style="color:#2aa198">}</span> -c istio-proxy curl http://127.0.0.1:15000/config_dump &gt; config_dump |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># 进入 istio-proxy 容器</span> |
| </span></span><span style="display:flex;"><span>kubectl <span style="color:#b58900">exec</span> -it <span style="color:#2aa198">${</span><span style="color:#268bd2">your</span> pod id<span style="color:#2aa198">}</span> -c istio-proxy -- /bin/bash |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># 查看容器日志</span> |
| </span></span><span style="display:flex;"><span>kubectl logs <span style="color:#2aa198">${</span><span style="color:#268bd2">your</span> pod id<span style="color:#2aa198">}</span> -n <span style="color:#2aa198">${</span><span style="color:#268bd2">your</span> namespace<span style="color:#2aa198">}</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span>kubectl logs <span style="color:#2aa198">${</span><span style="color:#268bd2">your</span> pod id<span style="color:#2aa198">}</span> -n <span style="color:#2aa198">${</span><span style="color:#268bd2">your</span> namespace<span style="color:#2aa198">}</span> -c istio-proxy |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># 开启自动注入sidecar</span> |
| </span></span><span style="display:flex;"><span>kubectl label namespace <span style="color:#2aa198">${</span><span style="color:#268bd2">your</span> namespace<span style="color:#2aa198">}</span> istio-injection<span style="color:#719e07">=</span>enabled --overwrite |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># 关闭自动注入sidecar</span> |
| </span></span><span style="display:flex;"><span>kubectl label namespace <span style="color:#2aa198">${</span><span style="color:#268bd2">your</span> namespace<span style="color:#2aa198">}</span> istio-injection<span style="color:#719e07">=</span>disabled --overwrite |
| </span></span></code></pre></div><h2 id="6-注意事项">6 注意事项</h2> |
| <ol> |
| <li>示例中,生产者消费者都属于同一个namespace;如果需要调用不同的namespace的提供者,需要按如下配置(<strong>dubbo版本&gt;=3.1.2</strong>):</li> |
| </ol> |
| <p>注解方式:</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span> <span style="color:#268bd2">@DubboReference</span>(providedBy <span style="color:#719e07">=</span> <span style="color:#2aa198">&#34;istio-demo-dubbo-producer&#34;</span>,providerPort <span style="color:#719e07">=</span> 20885, providerNamespace <span style="color:#719e07">=</span> <span style="color:#2aa198">&#34;istio-demo&#34;</span>) |
| </span></span></code></pre></div><p>xml方式</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span><span style="color:#268bd2">&lt;dubbo:reference</span> id=<span style="color:#2aa198">&#34;demoService&#34;</span> check=<span style="color:#2aa198">&#34;true&#34;</span> |
| </span></span><span style="display:flex;"><span> interface=<span style="color:#2aa198">&#34;org.apache.dubbo.samples.basic.api.DemoService&#34;</span> |
| </span></span><span style="display:flex;"><span> provider-port=<span style="color:#2aa198">&#34;20885&#34;</span> |
| </span></span><span style="display:flex;"><span> provided-by=<span style="color:#2aa198">&#34;istio-dubbo-producer&#34;</span> |
| </span></span><span style="display:flex;"><span> provider-namespace=<span style="color:#2aa198">&#34;istio-demo&#34;</span><span style="color:#268bd2">/&gt;</span> |
| </span></span></code></pre></div></description></item><item><title>Overview: 协议识别</title><link>https://dubbo.apache.org/zh-cn/overview/tasks/mesh/migration/deploy-on-k8s/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/tasks/mesh/migration/deploy-on-k8s/</guid><description> |
| <p>可以按照下文步骤,将 Dubbo 服务轻松部署到 Kubernetes 集群,此查看文章用到的 <a href="https://github.com/apache/dubbo-samples/tree/master/3-extensions/registry/dubbo-samples-kubernetes">完整代码示例地址</a></p> |
| <h2 id="1-总体目标">1 总体目标</h2> |
| <ul> |
| <li>部署 Dubbo 应用到 Kubernetes</li> |
| <li>基于 Kubernetes 内置 Service 实现服务发现</li> |
| <li>将 Dubbo 应用对接到 Kubernetes 生命周期</li> |
| </ul> |
| <h2 id="2-基本流程">2 基本流程</h2> |
| <ol> |
| <li>创建一个 Dubbo |
| 应用( <a href="https://github.com/apache/dubbo-samples/tree/master/3-extensions/registry/dubbo-samples-kubernetes">dubbo-samples-kubernetes</a> )</li> |
| <li>构建容器镜像并推送到镜像仓库( <a href="https://hub.docker.com/r/apache/dubbo-demo">dubbo-demo 示例例镜像</a> )</li> |
| <li>分别部署 Dubbo Provider 与 Dubbo Consumer 到 Kubernetes</li> |
| <li>验证服务发现与调用正常</li> |
| </ol> |
| <h2 id="3-详细步骤">3 详细步骤</h2> |
| <h3 id="31-环境要求">3.1 环境要求</h3> |
| <p>请确保本地安装如下环境,以提供容器运行时、Kubernetes集群及访问工具</p> |
| <ul> |
| <li><a href="https://www.docker.com/get-started/">Docker</a></li> |
| <li><a href="https://minikube.sigs.k8s.io/docs/start/">Minikube</a></li> |
| <li><a href="https://kubernetes.io/docs/tasks/tools/">Kubectl</a></li> |
| <li><a href="https://github.com/ahmetb/kubectx">Kubens(optional)</a></li> |
| </ul> |
| <p>通过以下命令启动本地 Kubernetes 集群</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>minikube start |
| </span></span></code></pre></div><p>通过 kubectl 检查集群正常运行,且 kubectl 绑定到默认本地集群</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>kubectl cluster-info |
| </span></span></code></pre></div><h3 id="32-前置条件">3.2 前置条件</h3> |
| <p>由于示例 Dubbo 项目均部署在 Pod 中且与 API-SERVER 有交互,因此有相应的权限要求,我们这里创建独立 ServiceAccount 并绑定必须的 Roles,后面所有的 Dubbo Kubernetes |
| 资源都将使用这里新建的 ServiceAccount。</p> |
| <p>通过以下命令我们创建了独立的 Namespace <code>dubbo-demo</code> 与 ServiceAccount <code>dubbo-sa</code>。</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#586e75"># 初始化命名空间和账号</span> |
| </span></span><span style="display:flex;"><span>kubectl apply -f https://raw.githubusercontent.com/apache/dubbo-samples/master/dubbo-samples-kubernetes/dubbo-samples-apiserver-provider/src/main/resources/k8s/ServiceAccount.yml |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># 切换命名空间</span> |
| </span></span><span style="display:flex;"><span>kubens dubbo-demo |
| </span></span></code></pre></div><h3 id="33-部署到-kubernetes">3.3 部署到 Kubernetes</h3> |
| <h4 id="331-部署-provider">3.3.1 部署 Provider</h4> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#586e75"># 部署 Service</span> |
| </span></span><span style="display:flex;"><span>kubectl apply -f https://raw.githubusercontent.com/apache/dubbo-samples/master/dubbo-samples-kubernetes/dubbo-samples-apiserver-provider/src/main/resources/k8s/Service.yml |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># 部署 Deployment</span> |
| </span></span><span style="display:flex;"><span>kubectl apply -f https://raw.githubusercontent.com/apache/dubbo-samples/master/dubbo-samples-kubernetes/dubbo-samples-apiserver-provider/src/main/resources/k8s/Deployment.yml |
| </span></span></code></pre></div><p>以上命令创建了一个名为 <code>dubbo-samples-apiserver-provider</code> 的 Service,注意这里的 service name 与项目中的 dubbo 应用名是一样的。</p> |
| <p>接着 Deployment 部署了一个 3 副本的 pod 实例,至此 Provider 启动完成。 |
| 可以通过如下命令检查启动日志。</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#586e75"># 查看 pod 列表</span> |
| </span></span><span style="display:flex;"><span>kubectl get pods -l <span style="color:#268bd2">app</span><span style="color:#719e07">=</span>dubbo-samples-apiserver-provider |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># 查看 pod 部署日志</span> |
| </span></span><span style="display:flex;"><span>kubectl logs your-pod-id |
| </span></span></code></pre></div><h4 id="332-部署-consumer">3.3.2 部署 Consumer</h4> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#586e75"># 部署 Service</span> |
| </span></span><span style="display:flex;"><span>kubectl apply -f https://raw.githubusercontent.com/apache/dubbo-samples/master/dubbo-samples-kubernetes/dubbo-samples-apiserver-consumer/src/main/resources/k8s/Service.yml |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># 部署 Deployment</span> |
| </span></span><span style="display:flex;"><span>kubectl apply -f https://raw.githubusercontent.com/apache/dubbo-samples/master/dubbo-samples-kubernetes/dubbo-samples-apiserver-consumer/src/main/resources/k8s/Deployment.yml |
| </span></span></code></pre></div><p>部署 consumer 与 provider 是一样的,这里也保持了 K8S Service 与 Dubbo consumer 名字一致: dubbo-samples-apiserver-consumer。</p> |
| <p>检查启动日志,consumer 完成对 provider 服务的消费。</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#586e75"># 查看 pod 列表</span> |
| </span></span><span style="display:flex;"><span>kubectl get pods -l <span style="color:#268bd2">app</span><span style="color:#719e07">=</span>dubbo-samples-apiserver-consumer |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># 查看 pod 部署日志</span> |
| </span></span><span style="display:flex;"><span>kubectl logs your-pod-id |
| </span></span></code></pre></div><p>可以看到日志输出如下:</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#719e07">[</span>22<span style="color:#719e07">/</span>04<span style="color:#719e07">/</span>22 01:10:24:024UTC<span style="color:#719e07">]</span>main INFO deploy.DefaultApplicationDeployer:<span style="color:#719e07">[</span>DUBBO<span style="color:#719e07">]</span>Dubbo Application<span style="color:#719e07">[</span>1.1<span style="color:#719e07">]</span>(dubbo<span style="color:#719e07">-</span>samples<span style="color:#719e07">-</span>apiserver<span style="color:#719e07">-</span>consumer)is ready.,dubbo version:3.0.7,current host:172.17.0.6 |
| </span></span><span style="display:flex;"><span> result:hello,Kubernetes Api Server |
| </span></span></code></pre></div><h3 id="34-修改项目并打包可跳过">3.4 修改项目并打包(可跳过)</h3> |
| <p>示例项目及相关镜像均已就绪,此小节仅面向需要修改示例并查看部署效果的用户。在此查看<a href="https://github.com/apache/dubbo-samples/tree/master/3-extensions/registry/dubbo-samples-kubernetes">完整代码示例地址</a></p> |
| <p>设置 Dubbo 项目使用 Kubernetes 作为注册中心,这里通过 DEFAULT_MASTER_HOST指定使用默认 API-SERVER 集群地址 kubernetes.default.srv,同时还指定了 |
| namespace、trustCerts 两个参数</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-properties" data-lang="properties"><span style="display:flex;"><span>dubbo.application.name<span style="color:#719e07">=</span><span style="color:#2aa198">dubbo-samples-apiserver-provider</span> |
| </span></span><span style="display:flex;"><span>dubbo.application.metadataServicePort<span style="color:#719e07">=</span><span style="color:#2aa198">20885</span> |
| </span></span><span style="display:flex;"><span>dubbo.registry.address<span style="color:#719e07">=</span><span style="color:#2aa198">kubernetes://DEFAULT_MASTER_HOST?registry-type=service&amp;duplicate=false&amp;namespace=dubbo-demo&amp;trustCerts=true</span> |
| </span></span><span style="display:flex;"><span>dubbo.protocol.name<span style="color:#719e07">=</span><span style="color:#2aa198">dubbo</span> |
| </span></span><span style="display:flex;"><span>dubbo.protocol.port<span style="color:#719e07">=</span><span style="color:#2aa198">20880</span> |
| </span></span><span style="display:flex;"><span>dubbo.application.qosEnable<span style="color:#719e07">=</span><span style="color:#2aa198">true</span> |
| </span></span><span style="display:flex;"><span>dubbo.application.qosAcceptForeignIp<span style="color:#719e07">=</span><span style="color:#2aa198">true</span> |
| </span></span><span style="display:flex;"><span>dubbo.provider.token<span style="color:#719e07">=</span><span style="color:#2aa198">true</span> |
| </span></span></code></pre></div><p>如果要在本地打包镜像,可通过 jib-maven-plugin 插件打包镜像</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#586e75"># 打包并推送镜像</span> |
| </span></span><span style="display:flex;"><span>mvn compile jib:build |
| </span></span></code></pre></div><blockquote> |
| <p>Jib 插件会自动打包并发布镜像。注意,本地开发需将 jib 插件配置中的 docker registry 组织 apache/dubbo-demo 改为自己有权限的组织(包括其他 kubernetes manifests 中的 dubboteam 也要修改,以确保 kubernetes 部署的是自己定制后的镜像),如遇到 jib 插件认证问题,请参考<a href="https://github.com/GoogleContainerTools/jib/blob/master/docs/faq.md#what-should-i-do-when-the-registry-responds-with-unauthorized">相应链接</a>配置 docker registry 认证信息。 |
| 可以通过直接在命令行指定 <code>mvn compile jib:build -Djib.to.auth.username=x -Djib.to.auth.password=x -Djib.from.auth.username=x -Djib.from.auth.username=x</code>,或者使用 docker-credential-helper.</p> |
| </blockquote> |
| <h2 id="4-最佳实践">4 最佳实践</h2> |
| <p>TBD</p> |
| <ul> |
| <li>rediness probe</li> |
| <li>liveness probe</li> |
| <li>ci/cd 接入 Skalfold</li> |
| </ul> |
| <h2 id="5-附录-k8s-manifests">5 附录 k8s manifests</h2> |
| <p>ServiceAccount.yml</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#268bd2">apiVersion</span>: v1 |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">kind</span>: Namespace |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">metadata</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">name</span>: dubbo-demo |
| </span></span><span style="display:flex;"><span>--- |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">apiVersion</span>: rbac.authorization.k8s.io/v1 |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">kind</span>: Role |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">metadata</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">namespace</span>: dubbo-demo |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">name</span>: dubbo-role |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">rules</span>: |
| </span></span><span style="display:flex;"><span> - <span style="color:#268bd2">apiGroups</span>: [<span style="color:#2aa198">&#34;&#34;</span>] |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">resources</span>: [<span style="color:#2aa198">&#34;pods&#34;</span>] |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">verbs</span>: [<span style="color:#2aa198">&#34;get&#34;</span>, <span style="color:#2aa198">&#34;watch&#34;</span>, <span style="color:#2aa198">&#34;list&#34;</span>, <span style="color:#2aa198">&#34;update&#34;</span>, <span style="color:#2aa198">&#34;patch&#34;</span>] |
| </span></span><span style="display:flex;"><span> - <span style="color:#268bd2">apiGroups</span>: [<span style="color:#2aa198">&#34;&#34;</span>, <span style="color:#2aa198">&#34;service.dubbo.apache.org&#34;</span>] |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">resources</span>: [<span style="color:#2aa198">&#34;services&#34;</span>, <span style="color:#2aa198">&#34;endpoints&#34;</span>, <span style="color:#2aa198">&#34;virtualservices&#34;</span>, <span style="color:#2aa198">&#34;destinationrules&#34;</span>] |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">verbs</span>: [<span style="color:#2aa198">&#34;get&#34;</span>, <span style="color:#2aa198">&#34;watch&#34;</span>, <span style="color:#2aa198">&#34;list&#34;</span>] |
| </span></span><span style="display:flex;"><span>--- |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">apiVersion</span>: v1 |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">kind</span>: ServiceAccount |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">metadata</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">name</span>: dubbo-sa |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">namespace</span>: dubbo-demo |
| </span></span><span style="display:flex;"><span>--- |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">apiVersion</span>: rbac.authorization.k8s.io/v1 |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">kind</span>: RoleBinding |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">metadata</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">name</span>: dubbo-sa-bind |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">namespace</span>: dubbo-demo |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">roleRef</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">apiGroup</span>: rbac.authorization.k8s.io |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">kind</span>: Role |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">name</span>: dubbo-role |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">subjects</span>: |
| </span></span><span style="display:flex;"><span> - <span style="color:#268bd2">kind</span>: ServiceAccount |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">name</span>: dubbo-sa |
| </span></span></code></pre></div><p>Service.yml</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#268bd2">apiVersion</span>: v1 |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">kind</span>: Service |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">metadata</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">name</span>: dubbo-samples-apiserver-provider |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">namespace</span>: dubbo-demo |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">spec</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">clusterIP</span>: None |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">selector</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">app</span>: dubbo-samples-apiserver-provider |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">ports</span>: |
| </span></span><span style="display:flex;"><span> - <span style="color:#268bd2">protocol</span>: TCP |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">port</span>: <span style="color:#2aa198">20880</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">targetPort</span>: <span style="color:#2aa198">20880</span> |
| </span></span></code></pre></div><p>Deployment.yml</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#268bd2">apiVersion</span>: apps/v1 |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">kind</span>: Deployment |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">metadata</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">name</span>: dubbo-samples-apiserver-provider |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">namespace</span>: dubbo-demo |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">spec</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">replicas</span>: <span style="color:#2aa198">3</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">selector</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">matchLabels</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">app</span>: dubbo-samples-apiserver-provider |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">template</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">metadata</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">labels</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">app</span>: dubbo-samples-apiserver-provider |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">spec</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">serviceAccountName</span>: dubbo-sa |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">containers</span>: |
| </span></span><span style="display:flex;"><span> - <span style="color:#268bd2">name</span>: server |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">image</span>: apache/dubbo-deemo:dubbo-samples-apiserver-provider_0.0.1 |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">ports</span>: |
| </span></span><span style="display:flex;"><span> - <span style="color:#268bd2">containerPort</span>: <span style="color:#2aa198">20880</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">livenessProbe</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">httpGet</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">path</span>: /live |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">port</span>: <span style="color:#2aa198">22222</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">initialDelaySeconds</span>: <span style="color:#2aa198">5</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">periodSeconds</span>: <span style="color:#2aa198">5</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">readinessProbe</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">httpGet</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">path</span>: /ready |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">port</span>: <span style="color:#2aa198">22222</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">initialDelaySeconds</span>: <span style="color:#2aa198">5</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">periodSeconds</span>: <span style="color:#2aa198">5</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">startupProbe</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">httpGet</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">path</span>: /startup |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">port</span>: <span style="color:#2aa198">22222</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">failureThreshold</span>: <span style="color:#2aa198">30</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">periodSeconds</span>: <span style="color:#2aa198">10</span> |
| </span></span></code></pre></div><p>Service.yml</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#268bd2">apiVersion</span>: v1 |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">kind</span>: Service |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">metadata</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">name</span>: dubbo-samples-apiserver-consumer |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">namespace</span>: dubbo-demo |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">spec</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">clusterIP</span>: None |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">selector</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">app</span>: dubbo-samples-apiserver-consumer |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">ports</span>: |
| </span></span><span style="display:flex;"><span> - <span style="color:#268bd2">protocol</span>: TCP |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">port</span>: <span style="color:#2aa198">20880</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">targetPort</span>: <span style="color:#2aa198">20880</span> |
| </span></span></code></pre></div><p>Deployment.yml</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#268bd2">apiVersion</span>: apps/v1 |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">kind</span>: Deployment |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">metadata</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">name</span>: dubbo-samples-apiserver-consumer |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">namespace</span>: dubbo-demo |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">spec</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">replicas</span>: <span style="color:#2aa198">1</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">selector</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">matchLabels</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">app</span>: dubbo-samples-apiserver-consumer |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">template</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">metadata</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">labels</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">app</span>: dubbo-samples-apiserver-consumer |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">spec</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">serviceAccountName</span>: dubbo-sa |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">containers</span>: |
| </span></span><span style="display:flex;"><span> - <span style="color:#268bd2">name</span>: server |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">image</span>: apache/dubbo-demo:dubbo-samples-apiserver-consumer_0.0.1 |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">ports</span>: |
| </span></span><span style="display:flex;"><span> - <span style="color:#268bd2">containerPort</span>: <span style="color:#2aa198">20880</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">livenessProbe</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">httpGet</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">path</span>: /live |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">port</span>: <span style="color:#2aa198">22222</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">initialDelaySeconds</span>: <span style="color:#2aa198">5</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">periodSeconds</span>: <span style="color:#2aa198">5</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">readinessProbe</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">httpGet</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">path</span>: /ready |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">port</span>: <span style="color:#2aa198">22222</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">initialDelaySeconds</span>: <span style="color:#2aa198">5</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">periodSeconds</span>: <span style="color:#2aa198">5</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">startupProbe</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">httpGet</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">path</span>: /startup |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">port</span>: <span style="color:#2aa198">22222</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">failureThreshold</span>: <span style="color:#2aa198">30</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">periodSeconds</span>: <span style="color:#2aa198">10</span> |
| </span></span></code></pre></div></description></item><item><title>Overview: 其他问题?</title><link>https://dubbo.apache.org/zh-cn/overview/tasks/mesh/migration/proxyless/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/tasks/mesh/migration/proxyless/</guid><description> |
| <p>Proxyless 模式是指 Dubbo 直接与 Istiod 通信,通过 xDS 协议实现服务发现和服务治理等能力。 |
| 本示例中将通过一个简单的示例来演示如何使用 Proxyless 模式。</p> |
| <p><a href="https://github.com/apache/dubbo-samples/tree/master/3-extensions/registry/dubbo-samples-xds">示例地址</a></p> |
| <h2 id="代码架构">代码架构</h2> |
| <p>本小节中主要介绍本文所使用的示例的代码架构,通过模仿本示例中的相关配置改造已有的项目代码可以使已有的项目快速跑在 Proxyless Mesh 模式下。</p> |
| <h3 id="1-接口定义">1. 接口定义</h3> |
| <p>为了示例足够简单,这里使用了一个简单的接口定义,仅对参数做拼接进行返回。</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">interface</span> <span style="color:#268bd2">GreetingService</span> { |
| </span></span><span style="display:flex;"><span> String <span style="color:#268bd2">sayHello</span>(String name); |
| </span></span><span style="display:flex;"><span>} |
| </span></span></code></pre></div><h3 id="2-接口实现">2. 接口实现</h3> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#268bd2">@DubboService</span>(version <span style="color:#719e07">=</span> <span style="color:#2aa198">&#34;1.0.0&#34;</span>) |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">class</span> <span style="color:#268bd2">AnnotatedGreetingService</span> <span style="color:#268bd2">implements</span> GreetingService { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">@Override</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">public</span> String <span style="color:#268bd2">sayHello</span>(String name) { |
| </span></span><span style="display:flex;"><span> System.out.println(<span style="color:#2aa198">&#34;greeting service received: &#34;</span> <span style="color:#719e07">+</span> name); |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">return</span> <span style="color:#2aa198">&#34;hello, &#34;</span> <span style="color:#719e07">+</span> name <span style="color:#719e07">+</span> <span style="color:#2aa198">&#34;! from host: &#34;</span> <span style="color:#719e07">+</span> NetUtils.getLocalHost(); |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span>} |
| </span></span></code></pre></div><h3 id="3-客户端订阅方式">3. 客户端订阅方式</h3> |
| <p><strong>由于原生 xDS 协议无法支持获取从接口到应用名的映射,因此需要配置 <code>providedBy</code> 参数来标记此服务来自哪个应用。</strong></p> |
| <p>未来我们将基于 Dubbo Mesh 的控制面实现自动的<a href="https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/concepts-and-architecture/service-discovery/">服务映射</a>关系获取,届时将不需要独立配置参数即可将 Dubbo 运行在 Mesh 体系下,敬请期待。</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#268bd2">@Component</span>(<span style="color:#2aa198">&#34;annotatedConsumer&#34;</span>) |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">class</span> <span style="color:#268bd2">GreetingServiceConsumer</span> { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">@DubboReference</span>(version <span style="color:#719e07">=</span> <span style="color:#2aa198">&#34;1.0.0&#34;</span>, providedBy <span style="color:#719e07">=</span> <span style="color:#2aa198">&#34;dubbo-samples-xds-provider&#34;</span>) |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> GreetingService greetingService; |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">public</span> String <span style="color:#268bd2">doSayHello</span>(String name) { |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">return</span> greetingService.sayHello(name); |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span>} |
| </span></span></code></pre></div><h3 id="4-服务端配置">4. 服务端配置</h3> |
| <p>服务端配置注册中心为 istio 的地址,协议为 xds。</p> |
| <p>我们建议将 <code>protocol</code> 配置为 tri 协议(全面兼容 grpc 协议),以获得在 istio 体系下更好的体验。</p> |
| <p>为了使 Kubernetes 感知到应用的状态,需要配置 <code>qosAcceptForeignIp</code> 参数,以便 Kubernetes 可以获得正确的应用状态,<a href="https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/others/dubbo-kubernetes-probe/">对齐生命周期</a>。</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-properties" data-lang="properties"><span style="display:flex;"><span>dubbo.application.name<span style="color:#719e07">=</span><span style="color:#2aa198">dubbo-samples-xds-provider</span> |
| </span></span><span style="display:flex;"><span>dubbo.application.metadataServicePort<span style="color:#719e07">=</span><span style="color:#2aa198">20885</span> |
| </span></span><span style="display:flex;"><span>dubbo.registry.address<span style="color:#719e07">=</span><span style="color:#2aa198">xds://istiod.istio-system.svc:15012</span> |
| </span></span><span style="display:flex;"><span>dubbo.protocol.name<span style="color:#719e07">=</span><span style="color:#2aa198">tri</span> |
| </span></span><span style="display:flex;"><span>dubbo.protocol.port<span style="color:#719e07">=</span><span style="color:#2aa198">50052</span> |
| </span></span><span style="display:flex;"><span>dubbo.application.qosAcceptForeignIp<span style="color:#719e07">=</span><span style="color:#2aa198">true</span> |
| </span></span></code></pre></div><h3 id="5-客户端配置">5. 客户端配置</h3> |
| <p>客户端配置注册中心为 istio 的地址,协议为 xds。</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-properties" data-lang="properties"><span style="display:flex;"><span>dubbo.application.name<span style="color:#719e07">=</span><span style="color:#2aa198">dubbo-samples-xds-consumer</span> |
| </span></span><span style="display:flex;"><span>dubbo.application.metadataServicePort<span style="color:#719e07">=</span><span style="color:#2aa198">20885</span> |
| </span></span><span style="display:flex;"><span>dubbo.registry.address<span style="color:#719e07">=</span><span style="color:#2aa198">xds://istiod.istio-system.svc:15012</span> |
| </span></span><span style="display:flex;"><span>dubbo.application.qosAcceptForeignIp<span style="color:#719e07">=</span><span style="color:#2aa198">true</span> |
| </span></span></code></pre></div><h2 id="快速开始">快速开始</h2> |
| <h3 id="step-1-搭建-kubernetes-环境">Step 1: 搭建 Kubernetes 环境</h3> |
| <p>目前 Dubbo 仅支持在 Kubernetes 环境下的 Mesh 部署,所以在运行启动本示例前需要先搭建 Kubernetes 环境。</p> |
| <p>搭建参考文档:</p> |
| <blockquote> |
| <p><a href="https://kubernetes.io/zh-cn/docs/tutorials/hello-minikube/">minikube(https://kubernetes.io/zh-cn/docs/tutorials/hello-minikube/)</a></p> |
| <p><a href="https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/">kubeadm(https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/)</a></p> |
| <p><a href="https://k3s.io/">k3s(https://k3s.io/)</a></p> |
| </blockquote> |
| <h3 id="step-2-搭建-istio-环境">Step 2: 搭建 Istio 环境</h3> |
| <p>搭建 Istio 环境参考文档:</p> |
| <p><a href="https://istio.io/latest/docs/setup/getting-started/">Istio 安装文档(https://istio.io/latest/docs/setup/getting-started/)</a></p> |
| <p>注:安装 Istio 的时候<strong>需要开启 <a href="https://istio.io/latest/docs/ops/best-practices/security/#configure-third-party-service-account-tokens">first-party-jwt 支持</a>(使用 <code>istioctl</code> 工具安装的时候加上 <code>--set values.global.jwtPolicy=first-party-jwt</code> 参数)</strong>,否则将导致客户端认证失败的问题。</p> |
| <p>附安装命令参考:</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>curl -L https://istio.io/downloadIstio | sh - |
| </span></span><span style="display:flex;"><span><span style="color:#b58900">cd</span> istio-1.xx.x |
| </span></span><span style="display:flex;"><span><span style="color:#b58900">export</span> <span style="color:#268bd2">PATH</span><span style="color:#719e07">=</span><span style="color:#268bd2">$PWD</span>/bin:<span style="color:#268bd2">$PATH</span> |
| </span></span><span style="display:flex;"><span>istioctl install --set <span style="color:#268bd2">profile</span><span style="color:#719e07">=</span>demo --set values.global.jwtPolicy<span style="color:#719e07">=</span>first-party-jwt -y |
| </span></span></code></pre></div><h3 id="step-3-拉取代码并构建">Step 3: 拉取代码并构建</h3> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>git clone https://github.com/apache/dubbo-samples.git |
| </span></span><span style="display:flex;"><span><span style="color:#b58900">cd</span> dubbo-samples/dubbo-samples-xds |
| </span></span><span style="display:flex;"><span>mvn clean package -DskipTests |
| </span></span></code></pre></div><h3 id="step-4-构建镜像">Step 4: 构建镜像</h3> |
| <p>由于 Kubernetes 采用容器化部署,需要将代码打包在镜像中再进行部署。</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#b58900">cd</span> ./dubbo-samples-xds-provider/ |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># dubbo-samples-xds/dubbo-samples-xds-provider/Dockerfile</span> |
| </span></span><span style="display:flex;"><span>docker build -t apache/dubbo-demo:dubbo-samples-xds-provider_0.0.1 . |
| </span></span><span style="display:flex;"><span><span style="color:#b58900">cd</span> ../dubbo-samples-xds-consumer/ |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># dubbo-samples-xds/dubbo-samples-xds-consumer/Dockerfile</span> |
| </span></span><span style="display:flex;"><span>docker build -t apache/dubbo-demo:dubbo-samples-xds-consumer_0.0.1 . |
| </span></span><span style="display:flex;"><span><span style="color:#b58900">cd</span> ../ |
| </span></span></code></pre></div><h3 id="step-5-创建namespace">Step 5: 创建namespace</h3> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#586e75"># 初始化命名空间</span> |
| </span></span><span style="display:flex;"><span>kubectl apply -f https://raw.githubusercontent.com/apache/dubbo-samples/master/dubbo-samples-xds/deploy/Namespace.yml |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># 切换命名空间</span> |
| </span></span><span style="display:flex;"><span>kubens dubbo-demo |
| </span></span></code></pre></div><h3 id="step-6-部署容器">Step 6: 部署容器</h3> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#b58900">cd</span> ./dubbo-samples-xds-provider/src/main/resources/k8s |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># dubbo-samples-xds/dubbo-samples-xds-provider/src/main/resources/k8s/Deployment.yml</span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># dubbo-samples-xds/dubbo-samples-xds-provider/src/main/resources/k8s/Service.yml</span> |
| </span></span><span style="display:flex;"><span>kubectl apply -f Deployment.yml |
| </span></span><span style="display:flex;"><span>kubectl apply -f Service.yml |
| </span></span><span style="display:flex;"><span><span style="color:#b58900">cd</span> ../../../../../dubbo-samples-xds-consumer/src/main/resources/k8s |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># dubbo-samples-xds/dubbo-samples-xds-consumer/src/main/resources/k8s/Deployment.yml</span> |
| </span></span><span style="display:flex;"><span>kubectl apply -f Deployment.yml |
| </span></span><span style="display:flex;"><span><span style="color:#b58900">cd</span> ../../../../../ |
| </span></span></code></pre></div><p>查看 consumer 的日志可以观察到如下的日志:</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>result: hello, xDS Consumer! from host: 172.17.0.5 |
| </span></span><span style="display:flex;"><span>result: hello, xDS Consumer! from host: 172.17.0.5 |
| </span></span><span style="display:flex;"><span>result: hello, xDS Consumer! from host: 172.17.0.6 |
| </span></span><span style="display:flex;"><span>result: hello, xDS Consumer! from host: 172.17.0.6 |
| </span></span></code></pre></div><h2 id="常见问题">常见问题</h2> |
| <ol> |
| <li>配置独立的 Istio 集群 <code>clusterId</code></li> |
| </ol> |
| <p>通常在 Kubernetes 体系下 Istio 的 <code>clusterId</code> 是 <code>Kubernetes</code>,如果你使用的是自建的 istio 生产集群或者云厂商提供的集群则可能需要配置 <code>clusterId</code>。</p> |
| <p>配置方式:指定 <code>ISTIO_META_CLUSTER_ID</code> 环境变量为所需的 <code>clusterId</code>。</p> |
| <p>参考配置:</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#268bd2">apiVersion</span>: apps/v1 |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">kind</span>: Deployment |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">metadata</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">name</span>: dubbo-samples-xds-consumer |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">spec</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">selector</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">matchLabels</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">demo</span>: consumer |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">replicas</span>: <span style="color:#2aa198">2</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">template</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">metadata</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">labels</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">demo</span>: consumer |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">spec</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">containers</span>: |
| </span></span><span style="display:flex;"><span> - <span style="color:#268bd2">env</span>: |
| </span></span><span style="display:flex;"><span> - <span style="color:#268bd2">name</span>: ISTIO_META_CLUSTER_ID |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">value</span>: Kubernetes |
| </span></span><span style="display:flex;"><span> - <span style="color:#268bd2">name</span>: dubbo-samples-xds-provider |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">image</span>: xxx |
| </span></span></code></pre></div><p><code>clusterId</code> 获取方式:</p> |
| <blockquote> |
| <p>kubectl describe pod -n istio-system istiod-58b4f65df9-fq2ks |
| 读取环境变量中 <code>CLUSTER_ID</code> 的值</p> |
| </blockquote> |
| <ol start="2"> |
| <li>Istio 认证失败</li> |
| </ol> |
| <p>由于当前 Dubbo 版本还不支持 istio 的 <code>third-party-jwt</code> 认证,所以需要配置 <code>jwtPolicy</code> 为 <code>first-party-jwt</code>。</p> |
| <ol start="3"> |
| <li>providedBy</li> |
| </ol> |
| <p>由于当前 Dubbo 版本受限于 istio 的通信模型无法获取接口所对应的应用名,因此需要配置 <code>providedBy</code> 参数来标记此服务来自哪个应用。 |
| 未来我们将基于 Dubbo Mesh 的控制面实现自动的<a href="https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/concepts-and-architecture/service-discovery/">服务映射</a>关系获取,届时将不需要独立配置参数即可将 Dubbo 运行在 Mesh 体系下,敬请期待。</p> |
| <ol start="4"> |
| <li>protocol name</li> |
| </ol> |
| <p>Proxyless 模式下应用级服务发现通过 <code>Kubernetes Native Service</code> 来进行应用服务发现,而由于 istio 的限制,目前只支持 <code>http</code> 协议和 <code>grpc</code> 协议的流量拦截转发,所以 <code>Kubernetes Service</code> 在配置的时候需要指定 <code>spec.ports.name</code> 属性为 <code>http</code> 或者 <code>grpc</code> 开头。 |
| 因此我们建议使用 triple 协议(完全兼容 grpc 协议)。此处即使 <code>name</code> 配置为 <code>grpc</code> 开头,但是实际上是 <code>dubbo</code> 协议也可以正常服务发现,但是影响流量路由的功能。</p> |
| <p>参考配置:</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#268bd2">apiVersion</span>: v1 |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">kind</span>: Service |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">metadata</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">name</span>: dubbo-samples-xds-provider |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">spec</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">clusterIP</span>: None |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">selector</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">demo</span>: provider |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">ports</span>: |
| </span></span><span style="display:flex;"><span> - <span style="color:#268bd2">name</span>: grpc-tri |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">protocol</span>: TCP |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">port</span>: <span style="color:#2aa198">50052</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">targetPort</span>: <span style="color:#2aa198">50052</span> |
| </span></span></code></pre></div><ol start="5"> |
| <li>metadataServicePort</li> |
| </ol> |
| <p>由于 Dubbo 3 应用级服务发现的元数据无法从 istio 中获取,需要走服务自省模式。这要求了 <code>Dubbo MetadataService</code> 的端口在全集群的是统一的。</p> |
| <p>参考配置:</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-properties" data-lang="properties"><span style="display:flex;"><span>dubbo.application.metadataServicePort<span style="color:#719e07">=</span><span style="color:#2aa198">20885</span> |
| </span></span></code></pre></div><p>未来我们将基于 Dubbo Mesh 的控制面实现自动的<a href="https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/concepts-and-architecture/service-discovery/">服务元数据</a>获取,届时将不需要独立配置参数即可将 Dubbo 运行在 Mesh 体系下,敬请期待。</p> |
| <ol start="6"> |
| <li>qosAcceptForeignIp</li> |
| </ol> |
| <p>由于 Kubernetes probe 探活机制的工作原理限制,探活请求的发起方不是 <code>localhost</code>,所以需要配置 <code>qosAcceptForeignIp</code> 参数开启允许全局访问。</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-properties" data-lang="properties"><span style="display:flex;"><span>dubbo.application.qosAcceptForeignIp<span style="color:#719e07">=</span><span style="color:#2aa198">true</span> |
| </span></span></code></pre></div><p>注:qos 端口存在危险命令,请先评估网络的安全性。即使 qos 不开放也仅影响 Kubernetes 无法获取 Dubbo 的生命周期状态。</p> |
| <ol start="7"> |
| <li>不需要开启注入</li> |
| </ol> |
| <p>Proxyless 模式下 pod 不需要再开启 envoy 注入,请确认 namespace 中没有 <code>istio-injection=enabled</code> 的标签。</p> |
| <ol start="8"> |
| <li>明文连接istiod</li> |
| </ol> |
| <p>Proxyless 模式下默认通过ssl方式连接istiod,同时也支持通过明文的方式连接istiod。</p> |
| <p>明文连接参考配置:</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-properties" data-lang="properties"><span style="display:flex;"><span>dubbo.registry.secure<span style="color:#719e07">=</span><span style="color:#2aa198">plaintext</span> |
| </span></span></code></pre></div></description></item></channel></rss> |