apache / apache/dubbo-spi-extensions

【XDS】Dubbo xds 分享-2

Open
#274 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Java
Stars
206
Forks
121
PR merge metrics
No merged PRs in 30d

Description

# 本地连接`Istio`控制面开发环境搭建

为了更加方便地在本地进行`dubbo-xds`相关功能的开发调试,我们需要一个提供`资源注册分发`功能的控制面。本文旨在搭建一个`Istio`控制面,本地直接连接`Istio`控制面,方便开发调试。

关于远程调试可以参考这篇文章 https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/mesh/mesh/

## 搭建kubenets集群

本步骤目的在于搭建`kubenets`集群,如果已有`kubebets`集群可跳过此步骤。

建议采用`Docker Desktop`来搭建`kubenets`集群,`Docker Desktop`内置简单的`kubebets`集群并提供可视化界面,使用非常方便。

下面演示`Windows`如何安装,`Mac`及其他系统可参照官网 https://docs.docker.com/desktop/install/mac-install/ 安装。

`Windows`需要借助`wsl`服务来运行`Docker Desktop`。首先需要在控制面板启动`wsl`功能。
![image-20240104162046388](https://github.com/apache/dubbo-spi-extensions/assets/53164956/d1d4f0b7-877c-46eb-83e1-9addc1989950)

启动后建议终端执行命令`wsl --update`升级`wsl`服务。

安装好后打开`Docker Desktop`,建议第一次打开时注册账号登录,否则容易卡在初始化界面。

在设置中开启`kubenets`集群,应用并重启。
![image-20240104162230947](https://github.com/apache/dubbo-spi-extensions/assets/53164956/9400bf2a-73e2-4b48-b183-1773995eb12f)

## 搭建istio环境

### 安装Istio

`Istio`安装文档(https://istio.io/latest/docs/setup/getting-started/)

> 注:安装`Istio`的时候需要开启`first-party-jwt`支持(使用`istioctl`工具安装的时候加上`–set values.global.jwtPolicy=first-party-jwt`参数),否则将导致客户端认证失败的问题。

附安装命令参考:

```shell
# 下载安装包,也可以从https://github.com/istio/istio/releases/tag/1.20.1手动下载
curl -L https://istio.io/downloadIstio | sh -

# 进入到bin目录
cd istio-1.xx.x/bin

# 安装istio
istioctl install --set profile=demo --set values.global.jwtPolicy=first-party-jwt -y
```

### 开放istio端口
`istiod`是`Istio`控制面所在的`pod`,可以通过端口转发实现本地访问集群中的控制面`istiod`。

首先通过命令`kubectl get pods -n istio-system`查看`istiod`所在的`pod`名称。
![image-20240104163217543](https://github.com/apache/dubbo-spi-extensions/assets/53164956/6654ccd2-7337-43d6-a10d-945621b54040)

然后使用命令`kubectl port-forward pod名称 15010:15010 -n istio-system`转发端口`15010`。`pod`名称为`istiod`所在的`pod`名称,这样就可以通过本地`15010`端口访问`istio`的控制面。

## 本地调试
### 下载dubbo-spi-extensions代码
https://github.com/apache/dubbo-spi-extensions
### 修改源码
与`istiod`建立连接时需要从`pod`读取认证文件,所以我们需要修改源码`IstioConstant`类的`KUBERNETES_SA_PATH`变量,将其改成本地存在的路径,例如`E:/k8s/token`。并在该路径下新建`token`文件,不带任何后缀,里面内容可以为空。
![image-20240104164359821](https://github.com/apache/dubbo-spi-extensions/assets/53164956/2793afb9-283e-4a49-abe2-e686cc4be28f)

### 测试连接

接下来可以在控制台通过`kubectl apply -f xxx.yml`命令部署资源,下面是一个资源示例:

```yml
apiVersion: v1
kind: Service
metadata:
name: details
labels:
app: details
service: details
spec:
ports:
- port: 9080
name: http
selector:
app: details
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: details-v1
labels:
app: details
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: details
version: v1
template:
metadata:
labels:
app: details
version: v1
spec:
serviceAccountName: bookinfo-details
containers:
- name: details
image: docker.io/istio/examples-bookinfo-details-v1:1.18.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
```
在集群中部署资源后,可以在源码`XdsRouteTest`类下新建测试用例访问`控制面`获取资源。

该单测通过访问本机`15010`端口连接控制面,注意`URL`的后缀`secure=plaintext`,表示不加密。
```java
@Test
public void testXdsRouterInitial() {

BitList> invokers = new BitList<>(Arrays.asList(createInvoker(""), createInvoker("app1")));

URL url = URL.valueOf("test://localhost:15010/?secure=plaintext");
PilotExchanger.initialize(url);

XdsRouter xdsRouter = new XdsRouter<>(url, rdsRouteRuleManager, edsEndpointManager, true);
xdsRouter.notify(invokers);
}
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.