Kubernetes 如何在前端和后端服务之间使用Istio虚拟服务
我对Istio完全陌生,球场看起来非常令人兴奋。然而,我不能让它工作,这可能意味着我没有正确地使用它。 我的目标是实现两个服务之间的会话关联,这就是我最初使用Istio的原因。但是,我做了一个非常基本的测试,它似乎不起作用: 我有一个kubernetes演示应用程序,它作为前台服务、有状态服务和无状态服务。通过浏览器,我访问前台服务,该服务使用K8s服务名称作为url:或,在有状态或无状态服务上发送请求 我想声明一个虚拟服务来拦截从前端服务发送到有状态服务的请求。我不将其声明为网关,因为我知道网关位于K8s集群的外部边界。 我在Istio 1.6的Windows上使用Docker 我在下面复制我的yaml文件。我想做的基本测试是:将api有状态的流量重新路由到api无状态,以验证是否考虑了虚拟服务。而且它不起作用。你知道怎么了吗?这是对虚拟服务的错误使用吗?我的Kiali控制台在设置中未检测到任何问题Kubernetes 如何在前端和后端服务之间使用Istio虚拟服务,kubernetes,proxy,istio,Kubernetes,Proxy,Istio,我对Istio完全陌生,球场看起来非常令人兴奋。然而,我不能让它工作,这可能意味着我没有正确地使用它。 我的目标是实现两个服务之间的会话关联,这就是我最初使用Istio的原因。但是,我做了一个非常基本的测试,它似乎不起作用: 我有一个kubernetes演示应用程序,它作为前台服务、有状态服务和无状态服务。通过浏览器,我访问前台服务,该服务使用K8s服务名称作为url:或,在有状态或无状态服务上发送请求 我想声明一个虚拟服务来拦截从前端服务发送到有状态服务的请求。我不将其声明为网关,因为我知道网
####################################################################
######################### 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很好奇,我从来没有想过它是如何工作的,这就是为什么我让帖子打开而无人回复的原因。无论如何,你是完全正确的,它的工作,谢谢!