我是一个完全陌生的Istio,这个推销看起来非常令人兴奋。然而,我不能让它工作,这可能意味着我没有正确使用它.我的目标是实现2个服务之间的会话亲和力,这就是为什么最初我最终使用Istio。然而,我做了一个非常基本的测试,它似乎并没有工作:我有一个kubernetes演示应用,它作为一个前台服务,一个有状态服务,和一个无状态服务。我从浏览器访问前台服务,前台服务在有状态服务或无状态服务上发送请求,使用K8s服务名作为url。http:/api-stateful 或 http:/api-stateless.
我想声明一个虚拟服务来拦截从前台服务向有状态服务发送的请求.我没有把它声明为网关,因为我理解的网关是在K8s集群的外部边界.我在Windows上用Istio 1.6的Docker。
我把我的yaml文件复制到下面.我想做的基本测试:将api-stateful的流量重路由到api-stateless,以验证虚拟服务被考虑在内。但是没有成功。你知道哪里出了问题吗?是虚拟服务的用法不对吗?我的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中找到。文件:
LoadBalancerSettings
负载均衡策略适用于特定目的地。请参阅 Envoy 的负载均衡 文件 了解更多详情。
例如,下面的规则对所有流向评级服务的流量使用循环往复的负载均衡策略。
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: bookinfo-ratings spec: host: ratings.prod.svc.cluster.local trafficPolicy: loadBalancer: simple: ROUND_ROBIN
下面的示例为评级服务的基于散列的负载均衡器设置了粘性会话,使用用户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