Не удается получить доступ к кластеру kubernetes с помощью шлюза Istio

#kubernetes #istio

#kubernetes #istio

Вопрос:

У меня есть кластер k8s с входом Istio. Я развернул развертывание, службу, шлюз и виртуальную службу, но я все еще не могу получить доступ к своей службе извне кластера. Я могу получить доступ к своей службе, обратившись к рабочим на указанном узловом порту, но я ожидаю, что шлюз Istio по-прежнему будет прослушивать порт 80 на моем главном сервере, но это не похоже на это. Что я здесь делаю не так?

service.yaml:

 apiVersion: v1
kind: Service
metadata:
  name: microservices-service
spec:
  type: NodePort
  selector:
    app: microservices-deployment
  ports:
    - port: 5001
      targetPort: 5001
      nodePort: 30007
  

deployment.yaml:

 apiVersion: apps/v1
kind: Deployment
metadata:
  name: microservices-deployment
  labels:
    app: microservices-deployment
spec:
  replicas: 3
  template:
    metadata:
      name: microservices-deployment
      labels:
        app: microservices-deployment
    spec:
      containers:
        - name: microservices-deployment
          image: *** private docker registry ***
          imagePullPolicy: Always
          ports:
            - containerPort: 5001
      restartPolicy: Always
      imagePullSecrets:
        - name: regcred
  selector:
    matchLabels:
      app: microservices-deployment
  

ingress.yaml:

 apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: microservices-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: microservices
spec:
  hosts:
  - "*"
  gateways:
  - microservices-gateway
  http:
    - match:
      route:
      - destination:
          host: *** master hostname ***
          port:
            number: 5001
  

Большое спасибо!

Ответ №1:

Я проверил вашу конфигурацию, и все выглядит правильно. Нужно исправить только одну маленькую ошибку — ваш виртуальный сервис.

Измените его с

 http:
    - match:
      route:
      - destination:
          host: *** master hostname ***
          port:
            number: 5001
  

Для

   http:
  - route:
    - destination:
        host: microservices-service
        port:
          number: 5001
  

И вы должны иметь возможность получить к нему доступ с помощью вашего внешнего шлюза istio-ip LoadBalancer / NodePort.
Подробнее об этом здесь .

 kubectl get svc -n istio-system | grep istio-ingress
  

Краткий пример с nginx, обратите внимание, что я использую LoadBalancer вместо NodePort.

 apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx1
spec:
  selector:
    matchLabels:
      run: nginx1
  replicas: 1
  template:
    metadata:
      labels:
        run: nginx1
        app: frontend
    spec:
      containers:
      - name: nginx1
        image: nginx
        ports:
        - containerPort: 80
        lifecycle:
          postStart:
            exec:
              command: ["/bin/sh", "-c", "echo Hello nginx1 > /usr/share/nginx/html/index.html"]

---

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: frontend
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    app: frontend

---

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

---

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: nginx-virtual
spec:
  gateways:
  - nginx-gateway
  hosts:
  - "*"
  http:
  - route:
    - destination:
        host: nginx.default.svc.cluster.local
        port:
          number: 80
  

 kubectl get svc -n istio-system | grep ingress
istio-ingressgateway   LoadBalancer   xx.x.xx.xxx   xx.xx.xx.xx  15021:30880/TCP,80:31983/TCP,443:31510/TCP,15443:32267/TCP   2d2h
  

Тест с помощью curl

 curl -v xx.xx.xx.xx/
GET / HTTP/1.1
HTTP/1.1 200 OK
Hello nginx1
  

Комментарии:

1. Я проверю это сегодня. Большое спасибо!

2. @Яаков Шами Рад помочь. Если этот или любой другой ответ решил вашу проблему, пожалуйста, отметьте его как принятый или проголосуйте за него.

3. У меня нет балансировщика нагрузки, поэтому я использую порт узла, но я даже не могу получить доступ к своему шлюзу. Я получаю IP-адрес и порт, но они недоступны как внутри сервера, так и за его пределами. Что может быть не так?

4. Какова ваша инфраструктура? Изменили ли вы тип входного шлюза istio с LoadBalancer на NodePort, как упоминалось здесь ?

5. По какой-то причине я не могу изменить тип.. У меня даже нет istioctl