Kubernetes Istio网关虚拟服务路由
我正在尝试根据Book Info示例,使用Istio 1.3.0-rc.0设置一个简单的路由示例。我在EKS中尝试使用Kubernetes 1.13版。这是我的配置Kubernetes Istio网关虚拟服务路由,kubernetes,istio,Kubernetes,Istio,我正在尝试根据Book Info示例,使用Istio 1.3.0-rc.0设置一个简单的路由示例。我在EKS中尝试使用Kubernetes 1.13版。这是我的配置 apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: myapp-gateway spec: selector: istio: ingressgateway # use istio default controller ser
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: myapp-gateway
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: v1
kind: Service
metadata:
name: myapp-service
labels:
app: myapp
spec:
ports:
- port: 3001
name: http
selector:
app: myapp
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-v1
spec:
replicas: 1
selector:
matchLabels:
app: myapp
version: v1
template:
metadata:
labels:
app: myapp
version: v1
spec:
containers:
- name: myapp
image: fake-myapp:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3001
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-v2
spec:
replicas: 1
selector:
matchLabels:
app: myapp
version: v2
template:
metadata:
labels:
app: myapp
version: v2
spec:
containers:
- name: myapp
image: fake-myapp:v2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3001
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: myapp-destinationrule
spec:
host: myapp-service
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: app-virtualservice
spec:
hosts:
- "*"
gateways:
- myapp-gateway
http:
- match:
- uri:
exact: /api
route:
- destination:
host: myapp-service
subset: v2
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: myapp-virtualservice
spec:
hosts:
- myapp-service
http:
- route:
- destination:
host: myapp-service
subset: v2
---
我可以从外部负载平衡器访问我的服务,但是,我正在尝试将流量路由到VirtualServices中定义的仅子集v2
但是,我只能在部署的两个版本之间实现循环平衡
我尝试了建议将子集添加到连接了网关的VirtualService,但仍然没有成功
我还尝试过在没有运气的情况下显式设置主机名
我遗漏了什么?以下是我对2
虚拟服务的观察
在第一个VirtualService(app VirtualService
)上,match.uri
是精确的
,值为/api
。这意味着具有路径/api
的请求将正常工作,即POST GATEWAY\u URL/api、GET GATEWAY\u URL/api。如果您有更多的扩展,例如PostGateway\uURL/api/somethingelse,那么它就不属于这个路由。请检查一下这个区域。如果这是一个问题,可以使用前缀
而不是精确
在第二个VirtualService(myapp VirtualService
)上,没有指示将指定其应用的网关的spec.gateways
。此外,在这个特定的实例中,VirtualService
控制您的网关的路由。目的规则适用于服务
(或特使侧车代理)
请检查这些是否有帮助。这种行为是可以解释的。一旦您创建了指向两个不同的v1
和v2
的K8s,K8s运行时将确定哪些端口正在侦听,因此每次您通过Istio mesh流量对象路径(网关->虚拟服务->目标规则->K8s服务)到达应用程序服务时根据用户空间代理,请求随机点击myapp-v1
,myapp-v2
嵌套的POD,默认情况下使用循环算法启用
您可能需要为v1
和v2
部署组合两个单独的k8s服务,分别以适当的端点为目标,以避免应用程序方之间的零星流量路由,如果您希望在应用程序之间路由流量,而不是在服务之间拆分流量
apiVersion: v1
kind: Service
metadata:
name: myapp-v1-service
labels:
version: v1
spec:
ports:
- port: 3001
name: http
selector:
version: v1
apiVersion: v1
kind: Service
metadata:
name: myapp-v2-service
labels:
version: v2
spec:
ports:
- port: 3001
name: http
selector:
version: v2