несколько шлюзов на разных портах одного развертывания istio-proxy не работают должным образом - PullRequest
0 голосов
/ 11 февраля 2019

1.Установите Istio (1.0.2)

kubectl apply -f https://raw.githubusercontent.com/knative/serving/master/third_party/istio-1.0.2/istio-crds.yaml
kubectl apply -f https://raw.githubusercontent.com/knative/serving/master/third_party/istio-1.0.2/istio.yaml

2.Создайте два Deployment с и соответствующие им Service с

# Create Deployments
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-a
spec:
  selector:
    matchLabels:
      app: a
  replicas: 3
  template:
    metadata:
      labels:
        app: a
    spec:
      containers:
        - name: print
          image: gcr.io/invertible-lens-220304/print
          env:
          - name: TEXT_TO_PRINT
            value: "AAAAAAAAAAAAAAAAAAAA"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-b
spec:
  selector:
    matchLabels:
      app: b
  replicas: 3
  template:
    metadata:
      labels:
        app: b
    spec:
      containers:
        - name: print
          image: gcr.io/invertible-lens-220304/print
          env:
          - name: TEXT_TO_PRINT
            value: "BBBBBBBBBBBBBBBBBBBB"
EOF

# Create Services
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
  name: service-a
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    app: a
---
apiVersion: v1
kind: Service
metadata:
  name: service-b
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    app: b
EOF

3.Создайте два Gateway s и соответствующие им NodePorts

# Create gateways
cat <<EOF | kubectl apply -f -
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: gateway-a
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 3001
        name: http
        protocol: HTTP
      hosts:
        - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: gateway-b
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 3002
        name: http
        protocol: HTTP
      hosts:
        - "*"
EOF

# Add ports to the istio-ingressgateway service
kubectl patch service istio-ingressgateway -n istio-system --type json --patch "$(cat <<EOF
  [{
    "op" : "add" ,
    "path" : "/spec/ports/-" ,
    "value" : {
      "name" : "node-port-1",
      "nodePort" : 30001,
      "port": 3001,
      "protocol": "TCP",
      "targetPort": 3001
    }
  }, {
    "op" : "add" ,
    "path" : "/spec/ports/-" ,
    "value" : {
      "name" : "node-port-2",
      "nodePort" : 30002,
      "port": 3002,
      "protocol": "TCP",
      "targetPort": 3002
    }
  }]
EOF)"

4.Создайте VirtualService с для каждого Gateway

cat <<EOF | kubectl apply -f -
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: virtualservice-a
  namespace: istio-system
spec:
  gateways:
    - gateway-a
  hosts:
    - example.com
  http:
    - match:
        - authority:
            exact: example.com
      route:
        - destination:
            host: service-a.default.svc.cluster.local
            port:
              number: 80
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: virtualservice-b
  namespace: istio-system
spec:
  gateways:
    - gateway-b
  hosts:
    - example.com
  http:
    - match:
        - authority:
            exact: example.com
      route:
        - destination:
            host: service-b.default.svc.cluster.local
            port:
              number: 80
EOF

5.Тест

NODE_IP=$(kubectl get nodes -o jsonpath="{.items[0].status.addresses[1].address}")

curl $NODE_IP:30001 -H "Host: example.com"
# Result: AAAAAAAAAAAAAAAAAAAA
curl $NODE_IP:30002 -H "Host: example.com"
# Result: AAAAAAAAAAAAAAAAAAAA

kubectl delete virtualservice virtualservice-a -n istio-system

curl $NODE_IP:30001 -H "Host: example.com"
# Result: BBBBBBBBBBBBBBBBBBBB
curl $NODE_IP:30002 -H "Host: example.com"
# Result: BBBBBBBBBBBBBBBBBBBB

Поскольку 30001 связан с gateway-a, где virtualservice-a указывает на service-a, а 30002 связан с gateway-b, который имеет virtualservice-bдо service-b, я бы ожидал, что результат будет:

curl $NODE_IP:30001 -H "Host: example.com"
# Result: AAAAAAAAAAAAAAAAAAAA
curl $NODE_IP:30002 -H "Host: example.com"
# Result: BBBBBBBBBBBBBBBBBBBB

Что случилось и как я могу заставить его работать?

PS

  1. Iзнаю, что это возможно с двумя istio-ingressgateway развертываниями, но могу ли я достичь тех же результатов только с одним?
  2. Другая возможность состоит в том, чтобы использовать только одну VirtualService и одну Gateway и установить port в HTTPMatchRequest, но это все же не то, что я хочу.
  3. Да, яхотите, чтобы имена хостов были одинаковыми.Разве шлюзы не изолированы друг от друга?

Мне нужно иметь два шлюза на разных портах с одинаковым istio-proxy (docker.io/istio/proxyv2:1.0.2) развертывание, со своими собственными соответствующими наборами виртуальных сервисов, не влияя друг на друга.Это возможно?

...