12.3.6 部署示例应用

为了演示跨集群访问,在第一个Kubernetes集群cluster1中部署sleep应用服务和版本v1的helloworld服务,在第二个集群cluster2中部署版本v2的helloworld服务,然后验证sleep应用是否可以调用本地或者远程集群的helloworld服务。

1)部署sleep和版本v1的helloworld服务到第一个集群cluster1中,执行如下命令:


kubectl create namespace app1
kubectl label namespace app1 istio-injection=enabled
kubectl apply -n app1 -f multicluster/sleep/sleep.yaml
kubectl apply -n app1 -f multicluster/helloworld/service.yaml
kubectl apply -n app1 -f multicluster/helloworld/helloworld.yaml -l version=v1
export SLEEP_POD=$(kubectl get -n app1 pod -l app=sleep -o jsonpath={.items..metadata.name})

2)部署版本v2的helloworld服务到第二个集群cluster2中,执行如下命令:


kubectl create namespace app1
kubectl label namespace app1 istio-injection=enabled
kubectl apply -n app1 -f multicluster/helloworld/service.yaml
kubectl apply -n app1 -f multicluster/helloworld/helloworld.yaml -l version=v2

3)验证在集群cluster1中的sleep服务是否可以正常调用本地或者远程集群的helloworld服务,在集群cluster1下执行如下命令:


kubectl exec $SLEEP_POD -n app1 -c sleep -- curl helloworld.app1:5000/hello

如果设置正确,则在返回的调用结果中可以看到两个版本的helloworld服务,同时可以通过查看sleep容器组中的istio-proxy容器日志来验证访问的端点IP地址,返回结果如下所示:

4)验证Istio路由规则是否生效。

创建针对上述两个版本的helloworld服务的路由规则,以便验证Istio配置是否可以正常工作。

创建Istio虚拟服务VirtualService,执行如下命令:


kubectl apply -n app1 -f multicluster/helloworld/virtualservice.yaml

接着,创建Istio目标规则DestinationRule:

·如果启用了双向TLS通信,则需要如下配置参数:


kubectl apply -n app1 -f multicluster/helloworld/destinationrule.yaml

·如果不需要启用双向TLS通信,配置参数则需要做出修改,在YAML定义中添加traff icPolicy.tls.mode:ISTIO_MUTUAL,定义如下所示:


apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: helloworld
spec:
  host: helloworld
  **trafficPolicy:
  tls:
    mode: ISTIO_MUTUAL**
  subsets:
  - name: v1
  labels:
    version: v1
  - name: v2
  labels:
    version: v2

通过执行命令kubectl apply创建启用双向TLS的Istio目标规则,如下所示:


kubectl apply -n app1 -f multicluster/helloworld/destinationrule-auth.yaml

多次调用helloworld服务,只会返回版本v2的响应结果,如下所示: