nginx настройка входа на Azure (без использования руля) устранение неполадок - PullRequest
0 голосов
/ 06 марта 2020

Мне нужна помощь в достижении этих двух вещей:

  1. Настройка моего nginx входного контроллера на AKS без использования helm (я не хочу )
  2. Заставить мой вход использовать уже зарезервированный IP-адрес с именем ресурса 'kubernetes-ip'

На первом шаге я следую без везения эта документация: https://kubernetes.github.io/ingress-nginx/deploy/#azure

И я не забыл обязательно. yaml!

мое пошаговое руководство :

У меня есть кластер basi c kubernetes с двумя модулями, как показано ниже:

NAME                              READY   STATUS    RESTARTS   AGE
activemq-demo-7b769bcc4-jtsj5     1/1     Running   0          55m
ubuntu-dcb9c6ccb-wkz2w            1/1     Running   0          2d

На этом этапе я хочу добавить свой вход, чтобы я мог добраться до демо activemq используя мой publi c ip адрес ab c .d

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/cloud-generic.yaml

После этого я запускаю kubectl get services -n ingress- nginx

NAME            TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                      AGE
ingress-nginx   LoadBalancer   10.0.186.143   zz.zz.zzz.zzz   80:32703/TCP,443:30584/TCP   17s

Что хорошо! кажется, работает правильно? на этом этапе я должен иметь возможность подключиться к внешнему IP-адресу к любому из этих портов, но я не могу: (

$ telnet zz.zz.zzz.zzz 80
Trying zz.zz.zzz.zzz...
(a long time later...)
telnet: Unable to connect to remote host: Resource temporarily unavailable

$ telnet zz.zz.zzz.zzz 443
Trying zz.zz.zzz.zzz...
(a long time later...)
telnet: Unable to connect to remote host: Resource temporarily unavailable

Я знаю, что обязательный. yaml не делает ' Я ничего не знаю о своем зарезервированном IP-адресе, но я игнорирую его, потому что у меня есть большая проблема, я не могу подключиться.

Я также на минуту игнорирую, что не могу подключиться только для проверки, если Мне нужен фактический ingress.yaml . Поэтому я использую kubectl apply -f ingress. html. (Ingress.yaml содержит следующий код)

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress1
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/enable-cors: "true"
    nginx.ingress.kubernetes.io/cors-allow-origin: "*"
    nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
    nginx.ingress.kubernetes.io/cors-allow-methods: "*"
spec:
  tls:
  - hosts:
    - amq-test.mydomain.com
    secretName: my-certificate
  rules:
  - host: amq-test.mydomain.com
    http:
      paths:
      - path: /*
        backend:
          serviceName: activemq-demo-service
          servicePort: 8161

После этого, если я запускаю kubectl, получая , я получаю:

NAME       HOSTS                    ADDRESS         PORTS     AGE
ingress1   amq-test.mydomain.com   zz.zz.zzz.zzz   80, 443   66s

Но то же самое, я не могу подключиться:

FROM WSL

$ telnet zz.zz.zzz.zzz 80
Trying zz.zz.zzz.zzz...
(a long time later...)
telnet: Unable to connect to remote host: Resource temporarily unavailable

$ telnet zz.zz.zzz.zzz 443
Trying zz.zz.zzz.zzz...
(a long time later...)
telnet: Unable to connect to remote host: Resource temporarily unavailable

Честно говоря, я не уверен, что мне не хватает, это должно быть очень просто с официальной документацией, я не знаю, должен ли я включить что-то еще в Azure ...

Спасибо за чтение, любая помощь будет оценена.

РЕДАКТИРОВАТЬ 3/7/2020: activemq-demo Deployment & Service @J ean-Philippe Bond

apiVersion: apps/v1
kind: Deployment
metadata:
  name: activemq-demo
  labels:
    app: activemq-demo
    tier: backend
spec:
  revisionHistoryLimit: 1
  replicas: 1
  selector:
    matchLabels:
      app: activemq-demo
  template:
    metadata:
      labels:
        app: activemq-demo
        tier: backend
    spec:
      containers:
      - name: activemq-demo
        image: myproject.azurecr.io/activemq-slim:5.15.9-3
        imagePullPolicy: "Always"
        command: ["/start.sh"]
        args: ["somename"]
        env:
        - name: LANG
          value: "C.UTF-8"
        ports:
        - containerPort: 8161
        - containerPort: 61616
        livenessProbe:
          exec:
            command:
            - /isAlive.sh
            - somename
          initialDelaySeconds: 15
          periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  name: activemq-demo-service
  labels:
    tier: controller
spec:
  type: NodePort
  ports:
    - name: http
      protocol: TCP
      port: 8161
      targetPort: 8161
    - name: acceptor
      protocol: TCP
      port: 61616
      targetPort: 61616
  selector:
    app: activemq-demo
    tier: backend

Обратите внимание, что единственная вещь, к которой я хочу получить доступ извне, - это веб-служба HTTP, которую ActiveMQ предоставляет на порт 8161 по умолчанию

РЕДАКТИРОВАТЬ 3/9/2020: запрос @HelloWorld

te lnet из WSL

$ telnet zz.zz.zzz.zzz 80
Trying zz.zz.zzz.zzz...
(a long time later...)
telnet: Unable to connect to remote host: Resource temporarily unavailable

$ telnet zz.zz.zzz.zzz 443
Trying zz.zz.zzz.zzz...
(a long time later...)
telnet: Unable to connect to remote host: Resource temporarily unavailable

te lnet из macos

$ telnet zz.zz.zzz.zzz 80
Trying zz.zz.zzz.zzz...
telnet: connect to address zz.zz.zzz.zzz: Operation timed out
telnet: Unable to connect to remote host

$ telnet zz.zz.zzz.zzz 443
Trying zz.zz.zzz.zzz...
telnet: connect to address zz.zz.zzz.zzz: Operation timed out
telnet: Unable to connect to remote host

скручивание от макроса - HTTP

$ curl -v -X GET http://amq-test.mydomain.com
Note: Unnecessary use of -X or --request, GET is already inferred.
*   Trying zz.zz.zzz.zzz:80...
* TCP_NODELAY set
* Connection failed
* connect to zz.zz.zzz.zzz port 80 failed: Operation timed out
* Failed to connect to amq-test.mydomain.com port 80: Operation timed out
* Closing connection 0
curl: (7) Failed to connect to amq-test.mydomain.com port 80: Operation timed out

скручивание от макроса - HTTPS

$ curl -v -X GET https://amq-test.mydomain.com
Note: Unnecessary use of -X or --request, GET is already inferred.
*   Trying zz.zz.zzz.zzz:443...
* TCP_NODELAY set
* Connection failed
* connect to zz.zz.zzz.zzz port 443 failed: Operation timed out
* Failed to connect to amq-test.mydomain.com port 443: Operation timed out
* Closing connection 0
curl: (7) Failed to connect to amq-test.mydomain.com port 443: Operation timed out

РЕДАКТИРОВАНИЕ 3/10/2020: Начиная с нуля (несколько раз)

Я удалил все, чтобы начать "fre sh" без особой удачи, но я заметил некоторые вещи, которые, мы надеемся, могут вызвать некоторые мысли ...

Основы:

  • У меня уже есть группа ресурсов, которую я использую: MyResourceGroup
  • У меня уже есть виртуальная сеть с Су bnet MyVirtua lNet
  • Я уже зарезервировал IP-адрес Publi c, который хочу использовать с мой вход, это св ati c IP, который я хочу запретить изменять (или удалять) до конца времени: AB C .D
  • У меня уже есть свой собственный домен, который у меня есть Направлено на AB C .D: amq-test.mydomain.com

Моя процедура:

  1. Я создаю новый Kubernetes Служба, использующая веб-интерфейс Azure, я выбираю свою группу ресурсов, а также виртуальную сеть и Su bnet
  2. . Как только я создал базовую службу Kubernetes, я заметил, что она создает LoadBalancer с другим IP-адресом Publi c, которым я не могу управлять, я предполагаю, что это потому, что этот IP-адрес будет использоваться в качестве основной точки входа для таких вещей, как kubectl и удаленного управления.
  3. С живым кластером я создаю основной c ActiveMQ-образ, которым я поделился ранее
  4. Теперь я начинаю с ingress- nginx и развертываю обязательный.yaml
  5. А затем я добавляю Azure Сервис yaml сюда , но на этот раз с двумя модификациями, чтобы он использовал мой IP-адрес Publi c. эта модификация была извлечена из документации Microsoft
kind: Service
apiVersion: v1
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  annotations:
    service.beta.kubernetes.io/azure-load-balancer-resource-group: MyResourceGroup
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  loadBalancerIP: A.B.C.D
  externalTrafficPolicy: Local
  type: LoadBalancer
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: http
    - name: https
      port: 443
      protocol: TCP
      targetPort: https
При этом работает без ошибок, все как и ожидалось:
$ kubectl get svc -n ingress-nginx -o wide
NAME            TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                      AGE   SELECTOR
ingress-nginx   LoadBalancer   10.0.30.100   A.B.C.D         80:30682/TCP,443:31002/TCP   35m   app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/part-of=ingress-nginx
Я развернул последнюю часть, верно? мой ingress.yaml:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress1
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/enable-cors: "true"
    nginx.ingress.kubernetes.io/cors-allow-origin: "*"
    nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
    nginx.ingress.kubernetes.io/cors-allow-methods: "*"
spec:
  rules:
  - http:
      paths:
      - path: /*
        backend:
          serviceName: activemq-demo-service
          servicePort: 8161

Это работает без проблем, и когда он работает, я проверил:

$ kubectl describe ingress
Name:             ingress1
Namespace:        default
Address:          A.B.C.D
Default backend:  default-http-backend:80 (<none>)
Rules:
  Host  Path  Backends
  ----  ----  --------
  *
        /*   queue-callbacks-service:8161 (10.94.20.14:8161)
Annotations:
  kubernetes.io/ingress.class:                         nginx
  nginx.ingress.kubernetes.io/cors-allow-credentials:  true
  nginx.ingress.kubernetes.io/cors-allow-methods:      *
  nginx.ingress.kubernetes.io/cors-allow-origin:       *
  nginx.ingress.kubernetes.io/enable-cors:             true
  kubectl.kubernetes.io/last-applied-configuration:    {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{"kubernetes.io/ingress.class":"nginx","nginx.ingress.kubernetes.io/cors-allow-credentials":"true","nginx.ingress.kubernetes.io/cors-allow-methods":"*","nginx.ingress.kubernetes.io/cors-allow-origin":"*","nginx.ingress.kubernetes.io/enable-cors":"true"},"name":"ingress1","namespace":"default"},"spec":{"rules":[{"http":{"paths":[{"backend":{"serviceName":"queue-callbacks-service","servicePort":8161},"path":"/callbacks/*"}]}}]}}

Events:
  Type    Reason  Age   From                      Message
  ----    ------  ----  ----                      -------
  Normal  CREATE  35m   nginx-ingress-controller  Ingress default/ingress1
  Normal  UPDATE  34m   nginx-ingress-controller  Ingress default/ingress1

Все кажется идеальным, но я просто не могу подключиться к IP-адресу или хосту, использующему любой (80, 443) порт

Надеюсь, это поможет

Просто к вашему сведению Я только что попробовал с Хелмом, следуя этой документации и я получил тот же результат

РЕДАКТИРОВАНИЕ 15/15/2020: еще не сделано

Я работал над другим проектом, так что этот был приостановлен на мгновение, я Я возвращаюсь к этому сейчас, к сожалению, все еще не работает, я открыл билет в Microsoft и жду его.

Однако мы заметили, что порт 80 фильтруется каким-то брандмауэром или чем-то, мы не уверен, что является причиной этого, поскольку у нас есть входящие правила на нашем SG с портами 80 и 443, открытыми с * по любому протоколу

$ nmap -Pn zz.zz.zz.zzz -p 80,443
Starting Nmap 7.80 ( https://nmap.org ) at 2020-04-15 11:01 Pacific SA Standard Time

Nmap scan report for zz.zz.zz.zzz
Host is up.

PORT    STATE    SERVICE
80/tcp  filtered http
443/tcp filtered https

Nmap done: 1 IP address (1 host up) scanned in 4.62 seconds

Ответы [ 2 ]

0 голосов
/ 09 марта 2020

Я написал историю, которая может быть вам когда-нибудь полезна: go: https://medium.com/cooking-with-azure/tcp-load-balancing-with-ingress-in-aks-702ac93f2246

0 голосов
/ 07 марта 2020

ActiveMQ доступен через TCP, а не HTTP, а Kubernetes Ingress не были созданы для поддержки TCP сервисов. При этом Nginx поддерживает TCP балансировку нагрузки, если вы действительно хотите его использовать, но вы не сможете использовать правило Ingress, основанное на хосте, как вы, поскольку оно зарезервировано для HTTP/HTTPS. Лучше всего будет использовать балансировщик нагрузки Azure L4 напрямую, а не через входной контроллер.

Если вы хотите использовать Nginx, вам нужно изменить yaml в mandatory.yaml, чтобы открыть порт ActiveMQ в развертывании Nginx.

kind: ConfigMap
apiVersion: v1
metadata:
  name: tcp-services
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
data:
  9000: "default/activemq-demo-service:8161"

Вам также необходимо добавить порт tcp-services в ресурс службы. Пример:

apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  type: LoadBalancer
  ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP
    - name: https
      port: 443
      targetPort: 443
      protocol: TCP
    - name: proxied-tcp-9000
      port: 9000
      targetPort: 9000
      protocol: TCP
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

Вот документация для поддержки TCP / UDP в Nginx Ingress.

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