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

Kubernetes 如何在前端和后端服务之间使用Istio虚拟服务,kubernetes,proxy,istio,Kubernetes,Proxy,Istio,我对Istio完全陌生,球场看起来非常令人兴奋。然而,我不能让它工作,这可能意味着我没有正确地使用它。 我的目标是实现两个服务之间的会话关联,这就是我最初使用Istio的原因。但是,我做了一个非常基本的测试,它似乎不起作用: 我有一个kubernetes演示应用程序,它作为前台服务、有状态服务和无状态服务。通过浏览器,我访问前台服务,该服务使用K8s服务名称作为url:或,在有状态或无状态服务上发送请求 我想声明一个虚拟服务来拦截从前端服务发送到有状态服务的请求。我不将其声明为网关,因为我知道网

我对Istio完全陌生,球场看起来非常令人兴奋。然而,我不能让它工作,这可能意味着我没有正确地使用它。 我的目标是实现两个服务之间的会话关联,这就是我最初使用Istio的原因。但是,我做了一个非常基本的测试,它似乎不起作用: 我有一个kubernetes演示应用程序,它作为前台服务、有状态服务和无状态服务。通过浏览器,我访问前台服务,该服务使用K8s服务名称作为url:或,在有状态或无状态服务上发送请求

我想声明一个虚拟服务来拦截从前端服务发送到有状态服务的请求。我不将其声明为网关,因为我知道网关位于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

如注释中所述,这可以通过粘性会话配置的
DestinationRule
修复

可在istio中找到该示例:

负载平衡器设置 应用于特定目标的负载平衡策略。有关更多详细信息,请参阅特使的负载平衡

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

apiVersion:networking.istio.io/v1alpha3 种类:命运法则 元数据: 名称:bookinfo评级 规格: 主机:ratings.prod.svc.cluster.local 交通政策: 负载平衡器: 简单:循环赛 以下示例使用用户cookie作为哈希键,为同一个分级服务的分级服务基于哈希的负载平衡器设置粘性会话

apiVersion:networking.istio.io/v1alpha3 种类:命运法则 元数据: 名称:bookinfo评级 规格: 主机:ratings.prod.svc.cluster.local 交通政策: 负载平衡器: 一致哈希: httpCookie: 姓名:用户 ttl:0s
使用此虚拟服务,您将请求发送到有状态服务,它将路由到无状态。除此之外,什么是with不起作用?目前无状态和有状态服务返回一个计数器值,没有什么特别的。每次pod收到请求时,它都会在有状态或无状态文件夹中生成一个日志(我从示例中删除了volumemounts以保持简短)。尽管有我的虚拟服务,但当我向有状态服务发送请求时,接收请求的是有状态服务,而不是无状态服务:因此,虚拟服务似乎没有正确地进行路由或被旁路。我只是在测试虚拟服务的路由。你是说我需要以api有状态代理为目标?这与文档不一致,加上虚拟服务的“主机”部分应该指定请求的目标主机。你是对的。这是错误的。您是否尝试使用粘性会话配置添加
designationrule
?在istio文档中可以在第页找到。谢谢,我同意,我终于喜欢上了。我对VirtualService很好奇,我从来没有想过它是如何工作的,这就是为什么我让帖子打开而无人回复的原因。无论如何,你是完全正确的,它的工作,谢谢!