In result none of the virtualservices are applied even though they are created and shown in config_dump.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: checkoutservice
spec:
hosts:
- paymentservice.default.svc.cluster.local
http:
- route:
- destination:
host: paymentservice.default.svc.cluster.local
subset: version1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: checkoutservice
spec:
hosts:
- paymentservice.default.svc.cluster.local
http:
- route:
- destination:
host: paymentservice.default.svc.cluster.local
subset: version2
istioctl version --remote
client version: version.BuildInfo{Version:"1.1.1", GitRevision:"2b1331886076df103179e3da5dc9077fed59c989", User:"root", Host:"7077232d-4c6c-11e9-813c-0a580a2c0506", GolangVersion:"go1.10.4", DockerHub:"docker.io/istio", BuildStatus:"Clean", GitTag:"1.1.0-17-g2b13318"}
pilot version: version.BuildInfo{Version:"1.1.1", GitRevision:"2b1331886076df103179e3da5dc9077fed59c989-dirty", User:"root", Host:"7077232d-4c6c-11e9-813c-0a580a2c0506", GolangVersion:"go1.10.4", DockerHub:"docker.io/istio", BuildStatus:"Modified", GitTag:"1.1.0-17-g2b13318"}
kubectl version
Client Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.2", GitCommit:"cff46ab41ff0bb44d8584413b598ad8360ec1def", GitTreeState:"clean", BuildDate:"2019-01-13T23:15:13Z", GoVersion:"go1.11.4", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"11+", GitVersion:"v1.11.7-gke.12", GitCommit:"06f08e60069231bd21bdf673cf0595aac80b99f6", GitTreeState:"clean", BuildDate:"2019-02-25T20:37:10Z", GoVersion:"go1.10.8b4", Compiler:"gc", Platform:"linux/amd64"}
kubectl create namespace istio-system
helm template install/kubernetes/helm/istio-init --name istio-init --namespace istio-system | kubectl apply -f -
helm template install/kubernetes/helm/istio --name istio --namespace istio-system \
--values install/kubernetes/helm/istio/values-istio-minimal.yaml | kubectl apply -f -
NOTE: using grpc protocol
Describe the bug
When we create multiple virtual services on same domain envoy doesn't allow and throw error in istio-pilot logs saying
<code:13 message:"Only unique values for domains are permitted. Duplicate entry of domain paymentservice.paymentservice.svc.cluster.local" >But istio-pilot considers it as warning and allows creating multiple virtual services, also config-dump shows multiple virtualhost inside routeconfig with duplicated domains.
In result none of the virtualservices are applied even though they are created and shown in config_dump.
Expected behavior
Steps to reproduce the bug
deployment.yaml
``` apiVersion: apps/v1 kind: Deployment metadata: name: emailservice spec: selector: matchLabels: app: emailservice template: metadata: labels: app: emailservice spec: terminationGracePeriodSeconds: 5 containers: - name: server image: gcr.io/google-samples/microservices-demo/emailservice:v0.1.0 ports: - containerPort: 8080 readinessProbe: periodSeconds: 5 exec: command: ["/bin/grpc_health_probe", "-addr=:8080"] livenessProbe: periodSeconds: 5 exec: command: ["/bin/grpc_health_probe", "-addr=:8080"] resources: requests: cpu: 100m memory: 64Mi limits: cpu: 200m memory: 128Mi --- apiVersion: v1 kind: Service metadata: name: emailservice spec: type: ClusterIP selector: app: emailservice ports: - name: grpc port: 5000 targetPort: 8080 --- apiVersion: apps/v1 kind: Deployment metadata: name: checkoutservice spec: selector: matchLabels: app: checkoutservice template: metadata: labels: app: checkoutservice spec: containers: - name: server image: gcr.io/google-samples/microservices-demo/checkoutservice:v0.1.0 ports: - containerPort: 5050 readinessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:5050"] livenessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:5050"] env: - name: PRODUCT_CATALOG_SERVICE_ADDR value: "productcatalogservice:3550" - name: SHIPPING_SERVICE_ADDR value: "shippingservice:50051" - name: PAYMENT_SERVICE_ADDR value: "paymentservice:50051" - name: EMAIL_SERVICE_ADDR value: "emailservice:5000" - name: CURRENCY_SERVICE_ADDR value: "currencyservice:7000" - name: CART_SERVICE_ADDR value: "cartservice:7070" # - name: JAEGER_SERVICE_ADDR # value: "jaeger-collector:14268" resources: requests: cpu: 100m memory: 64Mi limits: cpu: 200m memory: 128Mi --- apiVersion: v1 kind: Service metadata: name: checkoutservice spec: type: ClusterIP selector: app: checkoutservice ports: - name: grpc port: 5050 targetPort: 5050 --- apiVersion: apps/v1 kind: Deployment metadata: name: recommendationservice spec: selector: matchLabels: app: recommendationservice template: metadata: labels: app: recommendationservice spec: terminationGracePeriodSeconds: 5 containers: - name: server image: gcr.io/google-samples/microservices-demo/recommendationservice:v0.1.0 ports: - containerPort: 8080 readinessProbe: periodSeconds: 5 exec: command: ["/bin/grpc_health_probe", "-addr=:8080"] livenessProbe: periodSeconds: 5 exec: command: ["/bin/grpc_health_probe", "-addr=:8080"] env: - name: PRODUCT_CATALOG_SERVICE_ADDR value: "productcatalogservice:3550" resources: requests: cpu: 100m memory: 220Mi limits: cpu: 200m memory: 450Mi --- apiVersion: v1 kind: Service metadata: name: recommendationservice spec: type: ClusterIP selector: app: recommendationservice ports: - name: grpc port: 8080 targetPort: 8080 --- apiVersion: apps/v1 kind: Deployment metadata: name: frontend spec: selector: matchLabels: app: frontend template: metadata: labels: app: frontend spec: containers: - name: server image: gcr.io/google-samples/microservices-demo/frontend:v0.1.0 ports: - containerPort: 8080 readinessProbe: initialDelaySeconds: 10 httpGet: path: "/_healthz" port: 8080 httpHeaders: - name: "Cookie" value: "shop_session-id=x-readiness-probe" livenessProbe: initialDelaySeconds: 10 httpGet: path: "/_healthz" port: 8080 httpHeaders: - name: "Cookie" value: "shop_session-id=x-liveness-probe" env: - name: PRODUCT_CATALOG_SERVICE_ADDR value: "productcatalogservice:3550" - name: CURRENCY_SERVICE_ADDR value: "currencyservice:7000" - name: CART_SERVICE_ADDR value: "cartservice:7070" - name: RECOMMENDATION_SERVICE_ADDR value: "recommendationservice:8080" - name: SHIPPING_SERVICE_ADDR value: "shippingservice:50051" - name: CHECKOUT_SERVICE_ADDR value: "checkoutservice:5050" - name: AD_SERVICE_ADDR value: "adservice:9555" # - name: JAEGER_SERVICE_ADDR # value: "jaeger-collector:14268" resources: requests: cpu: 100m memory: 64Mi limits: cpu: 200m memory: 128Mi --- apiVersion: v1 kind: Service metadata: name: frontend spec: type: ClusterIP selector: app: frontend ports: - name: http port: 80 targetPort: 8080 --- apiVersion: v1 kind: Service metadata: name: frontend-external spec: type: LoadBalancer selector: app: frontend ports: - name: http port: 80 targetPort: 8080 --- apiVersion: apps/v1 kind: Deployment metadata: name: paymentservice spec: selector: matchLabels: app: paymentservice version: v1 template: metadata: labels: app: paymentservice version: v1 spec: terminationGracePeriodSeconds: 5 containers: - name: server image: gcr.io/google-samples/microservices-demo/paymentservice:v0.1.0 ports: - containerPort: 50051 readinessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:50051"] livenessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:50051"] resources: requests: cpu: 100m memory: 64Mi limits: cpu: 200m memory: 128Mi --- apiVersion: apps/v1 kind: Deployment metadata: name: paymentservice-v2 spec: selector: matchLabels: app: paymentservice version: v2 template: metadata: labels: app: paymentservice version: v2 spec: terminationGracePeriodSeconds: 5 containers: - name: server image: gcr.io/google-samples/microservices-demo/paymentservice:v0.1.0 ports: - containerPort: 50051 readinessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:50051"] livenessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:50051"] resources: requests: cpu: 100m memory: 64Mi limits: cpu: 200m memory: 128Mi --- apiVersion: v1 kind: Service metadata: name: paymentservice spec: type: ClusterIP selector: app: paymentservice ports: - name: grpc port: 50051 targetPort: 50051 --- apiVersion: apps/v1 kind: Deployment metadata: name: productcatalogservice spec: selector: matchLabels: app: productcatalogservice template: metadata: labels: app: productcatalogservice spec: terminationGracePeriodSeconds: 5 containers: - name: server image: gcr.io/google-samples/microservices-demo/productcatalogservice:v0.1.0 ports: - containerPort: 3550 readinessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:3550"] livenessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:3550"] resources: requests: cpu: 100m memory: 64Mi limits: cpu: 200m memory: 128Mi --- apiVersion: v1 kind: Service metadata: name: productcatalogservice spec: type: ClusterIP selector: app: productcatalogservice ports: - name: grpc port: 3550 targetPort: 3550 --- apiVersion: apps/v1 kind: Deployment metadata: name: cartservice spec: selector: matchLabels: app: cartservice template: metadata: labels: app: cartservice spec: terminationGracePeriodSeconds: 5 containers: - name: server image: gcr.io/google-samples/microservices-demo/cartservice:v0.1.0 ports: - containerPort: 7070 env: - name: REDIS_ADDR value: "redis-cart:6379" - name: PORT value: "7070" - name: LISTEN_ADDR value: "0.0.0.0" resources: requests: cpu: 200m memory: 64Mi limits: cpu: 300m memory: 128Mi readinessProbe: initialDelaySeconds: 15 exec: command: ["/bin/grpc_health_probe", "-addr=:7070"] livenessProbe: initialDelaySeconds: 15 periodSeconds: 10 exec: command: ["/bin/grpc_health_probe", "-addr=:7070"] --- apiVersion: v1 kind: Service metadata: name: cartservice spec: type: ClusterIP selector: app: cartservice ports: - name: grpc port: 7070 targetPort: 7070 --- apiVersion: apps/v1 kind: Deployment metadata: name: loadgenerator spec: selector: matchLabels: app: loadgenerator replicas: 1 template: metadata: labels: app: loadgenerator spec: terminationGracePeriodSeconds: 5 restartPolicy: Always initContainers: - name: wait-frontend image: alpine:3.6 command: ['sh', '-c', 'set -x; apk add --no-cache curl && until timeout -t 2 curl -f "http://${FRONTEND_ADDR}"; do echo "waiting for http://${FRONTEND_ADDR}"; sleep 2; done;'] env: - name: FRONTEND_ADDR value: "frontend:80" containers: - name: main image: gcr.io/google-samples/microservices-demo/loadgenerator:v0.1.0 env: - name: FRONTEND_ADDR value: "frontend:80" - name: USERS value: "10" resources: requests: cpu: 300m memory: 256Mi limits: cpu: 500m memory: 512Mi --- apiVersion: apps/v1 kind: Deployment metadata: name: currencyservice spec: selector: matchLabels: app: currencyservice template: metadata: labels: app: currencyservice spec: terminationGracePeriodSeconds: 5 containers: - name: server image: gcr.io/google-samples/microservices-demo/currencyservice:v0.1.0 ports: - name: grpc containerPort: 7000 readinessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:7000"] livenessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:7000"] resources: requests: cpu: 100m memory: 64Mi limits: cpu: 200m memory: 128Mi --- apiVersion: v1 kind: Service metadata: name: currencyservice spec: type: ClusterIP selector: app: currencyservice ports: - name: grpc port: 7000 targetPort: 7000 --- apiVersion: apps/v1 kind: Deployment metadata: name: shippingservice spec: selector: matchLabels: app: shippingservice template: metadata: labels: app: shippingservice spec: containers: - name: server image: gcr.io/google-samples/microservices-demo/shippingservice:v0.1.0 ports: - containerPort: 50051 readinessProbe: periodSeconds: 5 exec: command: ["/bin/grpc_health_probe", "-addr=:50051"] livenessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:50051"] resources: requests: cpu: 100m memory: 64Mi limits: cpu: 200m memory: 128Mi --- apiVersion: v1 kind: Service metadata: name: shippingservice spec: type: ClusterIP selector: app: shippingservice ports: - name: grpc port: 50051 targetPort: 50051 --- apiVersion: apps/v1 kind: Deployment metadata: name: redis-cart spec: selector: matchLabels: app: redis-cart template: metadata: labels: app: redis-cart spec: containers: - name: redis image: redis:alpine ports: - containerPort: 6379 readinessProbe: periodSeconds: 5 tcpSocket: port: 6379 livenessProbe: periodSeconds: 5 tcpSocket: port: 6379 volumeMounts: - mountPath: /data name: redis-data resources: limits: memory: 256Mi cpu: 125m requests: cpu: 70m memory: 200Mi volumes: - name: redis-data emptyDir: {} --- apiVersion: v1 kind: Service metadata: name: redis-cart spec: type: ClusterIP selector: app: redis-cart ports: - name: redis port: 6379 targetPort: 6379 --- apiVersion: apps/v1 kind: Deployment metadata: name: adservice spec: selector: matchLabels: app: adservice template: metadata: labels: app: adservice spec: terminationGracePeriodSeconds: 5 containers: - name: server image: gcr.io/google-samples/microservices-demo/adservice:v0.1.0 ports: - containerPort: 9555 env: - name: PORT value: "9555" #- name: JAEGER_SERVICE_ADDR # value: "jaeger-collector:14268" resources: requests: cpu: 200m memory: 180Mi limits: cpu: 300m memory: 300Mi readinessProbe: initialDelaySeconds: 20 periodSeconds: 15 exec: command: ["/bin/grpc_health_probe", "-addr=:9555"] livenessProbe: initialDelaySeconds: 20 periodSeconds: 15 exec: command: ["/bin/grpc_health_probe", "-addr=:9555"] --- apiVersion: v1 kind: Service metadata: name: adservice spec: type: ClusterIP selector: app: adservice ports: - name: grpc port: 9555 targetPort: 9555 --- ```istioctl kube-inject -f deployment.yaml | kubectl apply-f -and create 2 virtual services applying below yamlkubectl exec -it {checkoutservice_pod_name} -c istio-proxy curl http://localhost:15000/config_dump > configdumpVersion
Installation
Environment
GKE