Istio 目标规则子集不起作用
Istio destination rule subsets not working
我的 istio 目标规则不起作用,在 kiali 中出现以下错误
回显服务的虚拟服务和目标规则:
我从我的另一个虚拟服务调用 echo-svc:8080
和 echo-svc:8080/v1
,我无法在特定版本中进行路由。
当从另一个虚拟服务发出请求时:echo-svc:8080/v1
或 echo-svc:8080
,我得到了两个子集的响应。
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: echo-vsvc
spec:
hosts:
- "echo-svc.default.svc.cluster.local"
http:
- match:
- uri:
prefix: "/v1"
route:
- destination:
host: echo-svc.default.svc.cluster.local
subset: v1
- route:
- destination:
host: echo-svc.default.svc.cluster.local
subset: v2
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: echo-destination
spec:
host: echo-svc.default.svc.cluster.local
subsets:
- name: v1
labels:
version: v0.1
- name: v2
labels:
version: v0.2
如果我将我的 echo-service 附加到网关,然后通过 istio-ingress 向 v1
端点提供服务,我的所有请求都会路由到所需的 k8s 服务,但如果它是内部的(echo 服务不是附加到网关)特使没有将请求路由到所需的 k8s 服务..
更新:
$ > k get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
echo-deploy-v1-bdf758994-8f54b 2/2 Running 0 2m56s app=echo-app,pod-template-hash=bdf758994,version=v0.1
echo-deploy-v2-68bb64684d-9gg2r 2/2 Running 0 2m51s app=echo-app,pod-template-hash=68bb64684d,version=v0.2
frontend-v2-569c89dbd8-wfnc4 2/2 Running 2 12h app=frontend,pod-template-hash=569c89dbd8,version=v2
根据错误,您的服务实例未标记为 version: v0.1
或 version: v0.2
,这就是目标规则无法找到子集实例的原因。
通过执行验证它们是否被标记:
kubectl get pods --show-labels
为了快速测试,您可以标记它们:
kubectl label pod [pod_name] version=v0.1
发现我的错误,要使 istio 目标规则起作用,请注意这些:https://istio.io/docs/setup/kubernetes/spec-requirements/.
我的错误是服务的命名端口。将它从 "web" 更新为 "http-web" 对我有用。它应该是这样的形式:<protocol>[-<suffix>]
---
apiVersion: v1
kind: Service
metadata:
name: echo-svc
labels:
app: echo-app
spec:
ports:
- port: 80
targetPort: 8080
name: http-web
selector:
app: echo-app
---
我的 istio 目标规则不起作用,在 kiali 中出现以下错误
我从我的另一个虚拟服务调用 echo-svc:8080
和 echo-svc:8080/v1
,我无法在特定版本中进行路由。
当从另一个虚拟服务发出请求时:echo-svc:8080/v1
或 echo-svc:8080
,我得到了两个子集的响应。
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: echo-vsvc
spec:
hosts:
- "echo-svc.default.svc.cluster.local"
http:
- match:
- uri:
prefix: "/v1"
route:
- destination:
host: echo-svc.default.svc.cluster.local
subset: v1
- route:
- destination:
host: echo-svc.default.svc.cluster.local
subset: v2
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: echo-destination
spec:
host: echo-svc.default.svc.cluster.local
subsets:
- name: v1
labels:
version: v0.1
- name: v2
labels:
version: v0.2
如果我将我的 echo-service 附加到网关,然后通过 istio-ingress 向 v1
端点提供服务,我的所有请求都会路由到所需的 k8s 服务,但如果它是内部的(echo 服务不是附加到网关)特使没有将请求路由到所需的 k8s 服务..
更新:
$ > k get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
echo-deploy-v1-bdf758994-8f54b 2/2 Running 0 2m56s app=echo-app,pod-template-hash=bdf758994,version=v0.1
echo-deploy-v2-68bb64684d-9gg2r 2/2 Running 0 2m51s app=echo-app,pod-template-hash=68bb64684d,version=v0.2
frontend-v2-569c89dbd8-wfnc4 2/2 Running 2 12h app=frontend,pod-template-hash=569c89dbd8,version=v2
根据错误,您的服务实例未标记为 version: v0.1
或 version: v0.2
,这就是目标规则无法找到子集实例的原因。
通过执行验证它们是否被标记:
kubectl get pods --show-labels
为了快速测试,您可以标记它们:
kubectl label pod [pod_name] version=v0.1
发现我的错误,要使 istio 目标规则起作用,请注意这些:https://istio.io/docs/setup/kubernetes/spec-requirements/.
我的错误是服务的命名端口。将它从 "web" 更新为 "http-web" 对我有用。它应该是这样的形式:<protocol>[-<suffix>]
---
apiVersion: v1
kind: Service
metadata:
name: echo-svc
labels:
app: echo-app
spec:
ports:
- port: 80
targetPort: 8080
name: http-web
selector:
app: echo-app
---