istio - использование vs service и gw вместо loadbalancer не работает - PullRequest
4 голосов
/ 26 мая 2019

У меня есть следующее приложение, которое я могу успешно запустить в K8S, которое использует сервис с балансировщиком нагрузки типа, очень простое приложение с двумя маршрутами

  1. / - вы должны увидеть «привет приложение»
  2. /api/books должен предоставить список книг в формате json

Это service

apiVersion: v1
kind: Service
metadata:
  name: go-ms
  labels:
    app: go-ms
    tier: service
spec:
  type: LoadBalancer
  ports:
    - port: 8080
  selector:
    app: go-ms

Это развертывание


apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: go-ms
  labels:
    app: go-ms

spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: go-ms
        tier: service

    spec:
      containers:
        - name: go-ms
          image: rayndockder/http:0.0.2
          ports:
            - containerPort: 8080
          env:
            - name: PORT
              value: "8080"
          resources:
            requests:
              memory: "64Mi"
              cpu: "125m"
            limits:
              memory: "128Mi"
              cpu: "250m"

после применения обоих yamls и при вызове URL:

http://b0751-1302075110.eu-central-1.elb.amazonaws.com/api/books

Я смог увидеть данные в браузере, как и ожидалось, а также для корневого приложения, используя только внешний ip

Теперь я хочу использовать istio, поэтому я следую руководству и успешно установлю его через helm используя https://istio.io/docs/setup/kubernetes/install/helm/ и убедитесь, что все 53 crd есть, а также istio-system компоненты (такие как istio-ingressgateway istio-pilot и т. Д. Все 8 развертываний запущены и работают)

Я изменил услугу выше с LoadBalancer на NodePort

и создайте следующую конфигурацию istio в соответствии с istio docs

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: http-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 8080
        name: http
        protocol: HTTP
      hosts:
        - "*"
---

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: virtualservice
spec:
  hosts:
    - "*"
  gateways:
    - http-gateway
  http:
  - match:
      - uri:
          prefix: "/"
      - uri:
          exact: "/api/books"
    route:
      - destination:
          port:
            number: 8080
          host: go-ms

кроме того, я добавил следующее

kubectl label namespace books istio-injection=enabled, где развернуто приложение,

Теперь, чтобы получить внешний Ip, я использовал команду

kubectl get svc -n istio-system -l istio=ingressgateway

и получите это в external-ip

b0751-1302075110.eu-central-1.elb.amazonaws.com при попытке доступа к URL

http://b0751-1302075110.eu-central-1.elb.amazonaws.com/api/books

Я получил ошибку:

Этот сайт недоступен

ERR_CONNECTION_TIMED_OUT

если я запускаю докер rayndockder/http:0.0.2 через docker run -it -p 8080:8080 httpv2

I путь работает правильно!

Любая идея / подсказка В чем может быть проблема?

Есть ли способ trace istio конфигов, чтобы увидеть, если что-то отсутствует или у нас может быть какой-то сговор с портом или сетевой политикой, может быть?

Кстати, развертывание и обслуживание могут выполняться на каждом кластере, чтобы кто-то мог помочь в тестировании ...

если я изменить все на порт на 80 (во всех файлах yaml и в приложении и в докере), я смог получить данные для корневого пути, но не для "api / books" "

1 Ответ

3 голосов
/ 29 мая 2019

Мне надоел твой конфиг с модификацией порта шлюза до 80 с 8080 в моей локальной настройке миникуба kubernetes и istio.Вот команда, которую я использовал:

kubectl apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:
  name: go-ms
  labels:
    app: go-ms
    tier: service
spec:
  ports:
    - port: 8080
  selector:
    app: go-ms
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: go-ms
  labels:
    app: go-ms

spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: go-ms
        tier: service

    spec:
      containers:
        - name: go-ms
          image: rayndockder/http:0.0.2
          ports:
            - containerPort: 8080
          env:
            - name: PORT
              value: "8080"
          resources:
            requests:
              memory: "64Mi"
              cpu: "125m"
            limits:
              memory: "128Mi"
              cpu: "250m"
---
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: http-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: go-ms-virtualservice
spec:
  hosts:
     - "*"
  gateways:
    - http-gateway
  http:
  - match:
      - uri:
          prefix: /
      - uri:
          exact: /api/books
    route:
      - destination:
          port:
            number: 8080
          host: go-ms
EOF

Причина, по которой я изменил порт шлюза на 80, заключается в том, что входной шлюз istio по умолчанию открывает несколько портов, таких как 80, 443 и несколько других.В моем случае, поскольку у minikube нет внешнего балансировщика нагрузки, я использовал порты узлов, в моем случае это 31380.

Мне удалось получить доступ к приложению с URL-адресом http://$(minikube ip): 31380.

Нет смысла изменять порт служб, развертывания, поскольку они зависят от приложения.

Может быть Этот вопрос указывает порты, открытые входным шлюзом istio.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...