容器服务访问虚拟机服务
启动ASM-PROXY后,容器内的服务可以访问虚拟机上的服务,如下图所示。
验证流程如下:
- 部署虚拟机服务:在虚拟机中部署httptest应用。
- 部署容器服务:在CCE集群中部署容器服务tomcat。
- 添加虚拟机服务到网格:不同于容器服务有自动注册能力,当把一个虚拟机服务加入网格时,需要用户手动注册服务的基础信息。因此需要手动创建如下资源:Service、WorkloadEntry、ServiceEntry、DestinationRule和VirtualService。
- 访问虚拟机服务:容器服务通过服务名访问虚拟机服务。
部署虚拟机服务
此处以httptest测试程序作为示例。httptest为go http应用,监听在8080端口,访问正常返回“hello, http protocol server”消息。
- 上传httptest应用到虚拟机。
- 修改权限。
chmod +x httptest
- 启动httptest应用。
./httptest
部署容器服务
- 登录云容器引擎控制台,在“集群管理”页面单击集群名称,进入集群详情页。
- 在左侧导航栏选择“资源 > 工作负载”,单击右上角“镜像创建”。
- 设置工作负载参数。
- 负载类型:选择“无状态负载”。
- 命名空间:选择在3中填写的命名空间“vmns”。
- 镜像:选择“tomcat”。
- 服务配置:添加服务,服务端口和容器端口设置为8080。
其余参数按需填写。
如果是TCP协议服务,需要服务监听在127.0.0.1或0.0.0.0。
- 单击“创建工作负载”。
添加虚拟机服务到网格
- 创建Service。
- 登录云容器引擎控制台,在“集群管理”页面单击集群名称,进入集群详情页。
- 在左侧导航栏选择“资源 > 服务发现”,选择命名空间“vmns”,单击右上角“YAML创建”。
- 输入以下内容:
apiVersion: v1 kind: Service metadata: name: <vm-server1> namespace: "<NS>" labels: app: <vm-server1> spec: ports: - port: 8080 name: http-<vm-server1> targetPort: 8080 selector: app: <vm-server1>
其中,<vm-server1>为虚拟机服务名称,<NS>为3中填写的命名空间。
示例:
- 单击“确定”完成创建。
- 创建WorkloadEntry。
使用WorkloadEntry定义虚拟机服务的工作负载属性。
- 登录应用服务网格控制台,单击服务网格的名称,进入网格详情页面。
- 在左侧导航栏选择“网格配置”,单击“istio资源管理”页签。
- 选择“istio资源:workloadentries”,命名空间选择3中填写的命名空间“vmns”,单击“创建”。
这里的“vmns”命名空间中必须存在服务在网格中正常使用,否则选择不到该命名空间。你可以将部署容器服务中的tomcat服务加入网格,并确保配置诊断通过。
- 输入以下内容:
apiVersion: networking.istio.io/v1alpha3 kind: WorkloadEntry metadata: name: "<vm-server1>" namespace: "<NS>" spec: address: "<VM_IP>" labels: app: <vm-server1> version: v1 serviceAccount: "<SERVICE_ACCOUNT>"
其中,<vm-server1>为虚拟机服务名称,<NS>为3中填写的命名空间,<VM_IP>为虚拟机的私有IP,<SERVICE_ACCOUNT>为3中填写的服务账号名称。
示例:
- 单击“确定”完成创建。
- 创建ServiceEntry。
使用ServiceEntry将虚拟机服务添加到网格内部维护的服务注册表,以便网格中自动发现的服务可以访问或路由到这些手动指定的服务。
- 登录应用服务网格控制台,单击服务网格的名称,进入网格详情页面。
- 在左侧导航栏选择“网格配置”,单击“istio资源管理”页签。
- 选择“istio资源:serviceentries”,命名空间选择3中填写的命名空间“vmns”,单击“创建”。
- 输入以下内容:
apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: "<vm-server1>" namespace: "<NS>" spec: hosts: - <vm-server1>.<NS>.svc.cluster.local location: MESH_INTERNAL ports: - number: 8080 name: http protocol: HTTP resolution: STATIC workloadSelector: labels: app: <vm-server1>
其中,<vm-server1>为虚拟机服务名称,<NS>为3中填写的命名空间。
示例:
- 单击“确定”完成创建。
- 创建DestinationRule。
- 登录应用服务网格控制台,单击服务网格的名称,进入网格详情页面。
- 在左侧导航栏选择“网格配置”,单击“istio资源管理”页签。
- 选择“istio资源:destinationrules”,命名空间选择3中填写的命名空间“vmns”,单击“创建”。
- 输入以下内容:
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: <vm-server1> namespace: "<NS>" spec: host: <vm-server1> subsets: - labels: version: v1 name: v1
其中,<vm-server1>为虚拟机服务名称,<NS>为3中填写的命名空间。
示例:
- 单击“确定”完成创建。
- 创建VirtualService。
- 登录应用服务网格控制台,单击服务网格的名称,进入网格详情页面。
- 在左侧导航栏选择“网格配置”,单击“istio资源管理”页签。
- 选择“istio资源:virtualservices”,命名空间选择3中填写的命名空间“vmns”,单击“创建”。
- 输入以下内容:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: <vm-server1>-8080 namespace: "<NS>" spec: hosts: - <vm-server1> http: - match: - gateways: - mesh port: 8080 route: - destination: host: <vm-server1>.<NS>.svc.cluster.local port: number: 8080 subset: v1
其中,<vm-server1>为虚拟机服务名称,8080为服务端口,<NS>为3中填写的命名空间。
示例:
- 单击“确定”完成创建。
访问虚拟机服务
- 在kubectl节点执行以下命令,获取tomcat工作负载的Pod名称。
kubectl get pods -n <vmns>|grep tomcat
回显示例:
tomcat-75cbb4b948-nzrfs 2/2 Running 0 19h
- 执行以下命令,测试访问虚拟机服务。
kubectl exec -it <tomcat-xxx> -n <vmns> -- curl <vm-server1>.<vmns>.svc.cluster.local:8080
其中,<vm-server1>为虚拟机服务名称,<vmns>为3中填写的命名空间。
若回显“hello, http protocol server”,则容器服务访问虚拟机服务成功。