У меня есть следующая служба:
apiVersion: v1
kind: Service
metadata:
name: downstream-service
spec:
type: ClusterIP
selector:
app: downstream
ports:
- protocol: TCP
port: 80
targetPort: 80
, которую я бы хотел сбалансировать на основе версии приложения, которую я определил следующим образом в развертываниях:
apiVersion: apps/v1
kind: Deployment
metadata:
name: downstream-deployment-v1
labels:
app: downstream
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: downstream
version: v1
template:
metadata:
labels:
app: downstream
version: v1
spec:
containers:
- name: downstream
image: downstream:0.1
ports:
- containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: downstream-deployment-v2
labels:
app: downstream
version: v2
spec:
replicas: 1
selector:
matchLabels:
app: downstream
version: v2
template:
metadata:
labels:
app: downstream
version: v2
spec:
containers:
- name: downstream
image: downstream:0.2
ports:
- containerPort: 80
Сейчас это направляет трафик c 50/50, как ожидалось в обоих этих развертываниях, но я хотел бы настроить веса в соответствии с https://istio.io/latest/docs/reference/config/networking/virtual-service/#HTTPRouteDestination, поэтому я определил DestinationRule
и VirtualService
:
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: downstream-destination
spec:
host: downstream-service.svc.cluster.local
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: downstream-virtualservice
spec:
hosts:
- downstream-service.svc.cluster.local
http:
- name: "downstream-service-v1-routes"
route:
- destination:
host: downstream-service.svc.cluster.local
subset: v1
weight: 5
- name: "downstream-service-v2-routes"
route:
- destination:
host: downstream-service.svc.cluster.local
subset: v2
weight: 95
, но с этим я все еще получаю разделение 50/50.
Я пробовал заменить downstream-service.svc.cluster.local
только downstream-service
, но результат был без weight
s определенный в yaml и с удаленными subset
s, я бы получил разделение 50/50, но когда я добавил подмножество (без весов), я получил бы весь трафик c на экземпляре v1
.
Что я здесь делаю не так?
EDIT
Это может быть причиной, но я не уверен, что делать это:
$ istioctl x describe service downstream-service
Service: downstream-service
Port: 80/auto-detect targets pod port 80
DestinationRule: downstream-service for "downstream-service"
Matching subsets: v1,v2
No Traffic Policy
VirtualService: downstream-route
2 HTTP route(s)
$ istioctl x describe pod downstream-deployment-v2-69bdfc8fbf-bm22f
Pod: downstream-deployment-v2-69bdfc8fbf-bm22f
Pod Ports: 80 (downstream), 15090 (istio-proxy)
--------------------
Service: downstream-service
Port: 80/auto-detect targets pod port 80
DestinationRule: downstream-service for "downstream-service"
Matching subsets: v2
(Non-matching subsets v1)
No Traffic Policy
VirtualService: downstream-route
1 additional destination(s) that will not reach this pod
Route to non-matching subset v1 for (everything)
$ istioctl x describe pod downstream-deployment-v1-65bd866c47-66p9k
Pod: downstream-deployment-v1-65bd866c47-66p9k
Pod Ports: 80 (downstream), 15090 (istio-proxy)
--------------------
Service: downstream-service
Port: 80/auto-detect targets pod port 80
DestinationRule: downstream-service for "downstream-service"
Matching subsets: v1
(Non-matching subsets v2)
No Traffic Policy
VirtualService: downstream-route
1 additional destination(s) that will not reach this pod
Route to non-matching subset v2 for (everything)
EDIT2
Итак, я запустил kiali, чтобы увидеть, что:
Вес принимается равным 100 потому что существует только один пункт назначения маршрута
https://kiali.io/documentation/v1.13/validations/#_the_weight_is_assumed_to_be_100_because_there_is_only_one_route_destination
Не знаю, как это исправить.