如何在前后服务之间使用Istio虚拟服务

时间:2020-06-05 14:34:55

标签: kubernetes proxy istio

我对Istio完全陌生,球场看起来非常令人兴奋。但是,我无法使其正常工作,这可能意味着我没有正确使用它。 我的目标是实现2个服务之间的会话亲缘关系,这就是为什么我最初使用Istio的原因。但是,我做了一个非常基本的测试,它似乎不起作用: 我有一个kubernetes演示应用程序,它是一项前台服务,一种有状态服务和一种无状态服务。通过浏览器,我访问前端服务,该前端服务使用K8s服务名称作为URL:http://api-statefulhttp://api-stateless在有状态或无状态服务上调度请求。

我想声明一个虚拟服务来拦截从前台服务发送到有状态服务的请求。我没有将其声明为网关,因为我知道网关位于K8s集群的外部边界。 我在具有Istio 1.6的Windows上使用Docker。

我在下面复制我的yaml文件。我想做的基本测试:将api状态状态的流量重新路由到api状态状态,以验证是否考虑了虚拟服务。而且它不起作用。你看错了吗?虚拟服务使用不正确吗?我的Kiali控制台在安装过程中未检测到任何问题。

####################################################################
######################### STATEFUL BACKEND #########################
# Deployment for pocbackend containers, listening on port 3000
apiVersion: apps/v1
kind: Deployment
metadata:
  name: stateful-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: stateful-backend
      tier: backend
  template:
    metadata:
      labels:
        app: stateful-backend
        tier: backend
    spec:
       containers:
       - name: pocbackend
         image: pocbackend:2.0
         ports:
           - name: http
             containerPort: 3000
---
# Service for Stateful containers, listening on port 3000
apiVersion: v1
kind: Service
metadata:
  name: api-stateful
spec:
  selector:
    app: stateful-backend
    tier: backend
  ports:
  - protocol: TCP
    port: 3002
    targetPort: http
---
#####################################################################
######################### STATELESS BACKEND #########################
# Deployment for pocbackend containers, listening on port 3000
apiVersion: apps/v1
kind: Deployment
metadata:
  name: stateless-backend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: stateless-backend
      tier: backend
  template:
    metadata:
      labels:
        app: stateless-backend
        tier: backend
    spec:
      containers:
      - name: pocbackend
        image: pocbackend:2.0        
        ports:
           - name: http
             containerPort: 3000
 ---
# Service for Stateless containers, listening on port 3000
apiVersion: v1
kind: Service
 metadata:
  name: api-stateless
spec:
  selector:
    app: stateless-backend
    tier: backend
  ports:
  - protocol: TCP
    port: 3001
    targetPort: http
---
#############################################################
######################### FRONT END #########################
# deployment of the container pocfrontend listening to port 3500
apiVersion: apps/v1
kind: Deployment
metadata:
  name: front-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: frontend
      tier: frontend
  template:
    metadata:
      labels:
        app: frontend
        tier: frontend
    spec:
      containers:
      - name: pocfrontend
        image: pocfrontend:2.0               
        ports:
           - name: http
             containerPort: 3500      
---
# Service exposing frontend on node port 85
apiVersion: v1
kind: Service
metadata:
  name: frontend-service
spec:
  type: NodePort
  selector:
    app: frontend
    tier: frontend
  ports:
  - protocol: TCP
    port: 3500
    targetPort: http
    nodePort: 30000
---
##############################################################
############ ISTIO PROXY FOR API-STATEFUL SERVIC E############
##############################################################
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: api-stateful-proxy
spec:
  hosts:
  - api-stateful
  http: 
  - route:
      - destination:
          host: api-stateless

1 个答案:

答案 0 :(得分:2)

如评论中所述,可以使用具有粘性会话配置的DestinationRule进行修复。

示例可以在istio documentation中找到:

LoadBalancerSettings

适用于特定目标的负载平衡策略。有关更多详细信息,请参见Envoy的负载平衡documentation

例如,以下规则对进入分级服务的所有流量使用循环负载均衡策略。

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: bookinfo-ratings
spec:
  host: ratings.prod.svc.cluster.local
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN

以下示例使用User cookie作为哈希键为同一评级服务的基于评级服务基于哈希的负载均衡器设置粘性会话。

 apiVersion: networking.istio.io/v1alpha3
 kind: DestinationRule
 metadata:
   name: bookinfo-ratings
 spec:
   host: ratings.prod.svc.cluster.local
   trafficPolicy:
     loadBalancer:
       consistentHash:
         httpCookie:
           name: user
           ttl: 0s
相关问题