Почему вход на моем кластере Kubernates не отвечает на указанном хосте с использованием nginx-ingress-controller?

Я новичок в Kubernetes. Я успешно настроил Kube на моем Raspberry pi4b с помощью kubeadm. Я создал свое первое развертывание, используя демонстрационный образ, который предоставляет простую страницу с некоторой информацией, и если я регистрирую модуль, он говорит, что он правильно прослушивает порт 8080.

После установки nginx-ingress-controller (статус запущен) с helm следующим образом https://limpygnome.com/2019/09/21/raspberry-pi-kubernetes-cluster/, я создал службу, которая указывает на развертывание и вход, как объясняется в руководстве, но хост, который я указанный на входе, недоступен. Статус работает для каждого модуля, но я не понимаю, как это исправить.

Я не знаю, проблема в Ingress-контроллере, во входе или в чем-то еще.

Вот мой ямл:

---
apiVersion: v1
kind: Namespace
metadata:
  name: hello

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: hello-world
  name: hello-world-deploy
  namespace: hello
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hello-world
  strategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: hello-world
    spec:
      containers:
      # - image: docker:stable-dind
      - image: pmorjan/demo:latest
        name: hello-world
        securityContext:
          privileged: true
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: hello-world
  name: hello-world-service
  annotations:
    metallb.universe.tf/allow-shared-ip: home-network
  namespace: hello
spec:
  ports:
  - name: http
    port: 80
    targetPort: 8080
  selector:
    app: hello-world
  sessionAffinity: None
  type: LoadBalancer
  loadBalancerIP: 192.168.1.241

---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: hello-world-ingress
  namespace: hello
  annotations:
    ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: ciao.mirco.com
      http:
        paths:
        - path: /hello
          backend:
            serviceName: hello-world-service
            servicePort: 80

Спасибо за вашу помощь


person sP0re90    schedule 27.02.2020    source источник
comment
у вас есть настроенные записи DNS?   -  person Harsh Manvar    schedule 27.02.2020
comment
@HarshManvar Как я могу это проверить?   -  person sP0re90    schedule 27.02.2020
comment
Как вы получаете к нему доступ через завиток? Вы сделали запись в / etc / hosts   -  person Arghya Sadhu    schedule 27.02.2020
comment
@ArghyaSadhu Я просто вставляю этот ciao.mirco.com в браузер. Нет записи в etc / hosts   -  person sP0re90    schedule 27.02.2020
comment
это настоящий домен или просто образец? Вы создали службу типа nodeport / Loadbalancer для входящего контроллера nginx?   -  person Arghya Sadhu    schedule 27.02.2020
comment
@ArghyaSadhu это хост, который я настроил в yaml на вход   -  person sP0re90    schedule 27.02.2020
comment
это должен быть реальный адрес домена или хоста.   -  person Harsh Manvar    schedule 27.02.2020
comment
@HarshManvar, хорошо, как я могу это сделать? Было бы хорошо, если бы он был доступен только из моей домашней сети.   -  person sP0re90    schedule 27.02.2020
comment
вы можете подключить службу к IP-адресу кластера или порту узла и создать вход. и обновите etc / host.   -  person Harsh Manvar    schedule 27.02.2020
comment
@ sP0re90 сначала попробуйте открыть ip в браузере и проверьте, работает он или нет. 192.168.1.241   -  person Harsh Manvar    schedule 27.02.2020
comment
@HarshManvar не работает   -  person sP0re90    schedule 27.02.2020
comment
возможно, есть какая-то проблема в службе или подключении модуля, или приложение внутри модуля не работает должным образом.   -  person Harsh Manvar    schedule 27.02.2020
comment
@ sP0re90 Я думаю, что это сервер GOpher.   -  person Harsh Manvar    schedule 27.02.2020
comment
Можете ли вы также попробовать удалить LB из аннотации сервиса и Metallb. просто простой сервис clusterip и попробуйте использовать ingress.   -  person Harsh Manvar    schedule 27.02.2020
comment
Отсутствие печати капсул, которые слушают 8080, похоже, работает. 192.168.1.241 - это IP-адрес, который я настроил в службе, но это не IP-адрес узла. Это проблема?   -  person sP0re90    schedule 27.02.2020
comment
kubectl port-forward svc / hello-world-service 80:80. и откройте localhost: 80   -  person Harsh Manvar    schedule 27.02.2020
comment
@HarshManvar да, если я пересылаю службу, она работает! Теперь мы знаем, что проблема во входящем входе, я бы хотел использовать его вместо сервиса. Любые идеи?   -  person sP0re90    schedule 27.02.2020
comment
измените тип службы и удалите Metallb и LB.   -  person Harsh Manvar    schedule 27.02.2020
comment
apiVersion: v1 kind: Метаданные службы: label: app: hello-world name: hello-world-service namespace: hello spec: ports: - name: http port: 80 targetPort: 8080 selector: app: hello-world sessionAffinity: None type : ClusterIP   -  person Harsh Manvar    schedule 27.02.2020
comment
Готово, но я не могу использовать вход для вызова службы с именем хоста или IP-адресом узла   -  person sP0re90    schedule 27.02.2020
comment
при входе используйте любое имя хоста. в / etc / host добавьте запись, указывающую на host.   -  person Harsh Manvar    schedule 27.02.2020
comment
@ sP0re90 Рад это слышать.   -  person Harsh Manvar    schedule 04.03.2020


Ответы (1)


Если вы хотите получить доступ к своему модулю через вход, вам не нужно создавать для своего модуля службу типа LoadBalancer. Вместо этого вы создаете службу типа LoadBalancer для самого контроллера входящего трафика и службу типа cluserIP для модуля. Также для доступа к нему через ciao.mirco.com вам необходимо добавить запись в файл / etc / hosts системы, к которой вы обращаетесь, как показано ниже.

ipaddress ciao.micro.com

ipadress должен быть nodeip, если вы создали службу типа Nodeport для входного контроллера или LoadBalancer IP, если вы создали службу типа LoadBalancer.

Создайте службу NodePort для входящего контроллера nginx в пространстве имен, где развернут входной контроллер nginx.

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: NodePort
  ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP
    - name: https
      port: 443
      targetPort: 443
      protocol: TCP
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

После его создания вы можете проверить порт узла (в диапазоне от 30000-32767), назначенный этой службе.

Узнайте IP-адрес узла kubernetes, на котором развернуты модули контроллера входящего трафика nginx.

Затем вы можете получить к нему доступ через nodeport:nodeip/hello или ciao.micro.com/hello в своем браузере или через curl nodeip:nodeport/hello -H 'Host:ciao.mirco.com'

person Arghya Sadhu    schedule 27.02.2020
comment
Не могли бы вы привести пример, основанный на моем ямле? Спасибо - person sP0re90; 27.02.2020
comment
Будет ли работать, если вы просто укажете IP 192.168.1.241 в браузере? - person Arghya Sadhu; 27.02.2020
comment
Что выводит команда kubectl describe svc hello-world-service -n hello. Добавьте рассматриваемый результат - person Arghya Sadhu; 27.02.2020
comment
@ArghyaSadhu, я думаю, может быть, это проблема использования Metallb в аннотации сервиса и типе сервиса LB. - person Harsh Manvar; 27.02.2020
comment
Я думаю, что Metallb вообще не нужен..простой nodeport для контроллера входа и clusterip для pod'а должны работать ... но я не знаком с raspberry pi - person Arghya Sadhu; 27.02.2020
comment
да, вы правы, металлические LB и LB не нужны. У меня есть опыт работы с пи, проблем с удалением металла возникнуть не должно. - person Harsh Manvar; 27.02.2020
comment
Я удалил аннотации и балансировщик нагрузки, и я сделал переадресацию службы на localhost, и она работает! Я могу использовать приложение Go. Как мы можем исправить входящие сообщения, любые идеи? - person sP0re90; 27.02.2020
comment
создать службу nodeport для входящего контроллера nginx, как я уже упоминал в своем ответе - person Arghya Sadhu; 27.02.2020
comment
Служба Nodeport используется вместо ingress? Извините, вы можете привести мне пример? - person sP0re90; 27.02.2020
comment
Nodeport будет использоваться для доступа к входному контроллеру nginx. Тогда вы сможете получить доступ к своему модулю через вход nginx. Пример yaml nodeport для nginx добавлен в ответ - person Arghya Sadhu; 27.02.2020
comment
@ArghyaSadhu Я создал nodeport, заменив имя пространства имен моего контроллера входа nginx: apiVersion: v1 kind: Метаданные службы: name: пространство имен kube-ingress: метки kube-ingress: app.kubernetes.io/name: приложение kube-ingress .kubernetes.io / part-of: kube-ingress spec: тип: Порты NodePort: - имя: http порт: 80 targetPort: 80 протокол: TCP - имя: https порт: 443 targetPort: протокол 443: селектор TCP: app.kubernetes .io / имя: kube-ingress app.kubernetes.io/part-of: kube-ingress - person sP0re90; 27.02.2020
comment
Если я теперь использую kubectl в пространстве имен, я вижу следующее: kube-ingress NodePort 10.105.119.194 ‹none› 80: 30550 / TCP, 443: 31940 / TCP nginx-ingress-controller LoadBalancer 10.104.178.243 192.168.1.241 80: 30506 / TCP , 443: 31204 / TCP nginx-ingress-default-backend ClusterIP 10.106.203.89 ‹none› 80 / TCP Какой IP-адрес и порт мне следует использовать? Если я использую 192.168.1.100 (IP-адрес узла) или 192.168.1.241, он не работает - person sP0re90; 27.02.2020
comment
192.168.1.100:30550/hello - person Arghya Sadhu; 27.02.2020
comment
вывод kubectl описывает hello-world-service - person Arghya Sadhu; 27.02.2020
comment
Имя: hello-world-service Пространство имен: hello Метки: app = hello-world Аннотации: kubectl.kubernetes.io/last-applied-configuration: {apiVersion: v1, kind: Service, metadata: {annotations: {}, labels: {app: hello-world}, имя: hello-world-service, пространство имен: ... Селектор: app = hello-world Тип: ClusterIP IP: 10.106.28.251 Порт: http 80 / TCP TargetPort: 8080 / Конечные точки TCP: 10.32 .0.4: Сходство сеанса 8080: Нет События: ‹none› - person sP0re90; 27.02.2020
comment
Ошибок нет. Регистрирует только события, связанные с обновлением hello-world-ingress. Он регистрирует, когда я запускаю новую команду kubectl apply, которая обновляет вход приветствия. - person sP0re90; 27.02.2020
comment
Интересная вещь: я пробовал сделать такой завиток curl -D- 192.168.1.241 -H 'Host: ciao .mirco.com ', и я получаю ожидаемый ответ. Это работает, только если вы находитесь внутри узла. Итак, как вы сказали ранее, нам нужно только найти способ вызвать этот балансировщик нагрузки извне узла. Может быть, пример nodeport, который я опубликовал, был неправильным? Или нужен кубе-прокси? - person sP0re90; 27.02.2020
comment
С curl -D- 192.168.1.100:30506 -H 'Хост: ciao.mirco.com' с локального хоста I. получил 404 - person sP0re90; 27.02.2020
comment
попробуйте этот завиток -D- 192.168.1.100:30506/hello -H 'Host: ciao.mirco.com' - person Arghya Sadhu; 28.02.2020
comment
@ sP0re90 Есть прогресс? - person Wytrzymały Wiktor; 03.03.2020
comment
Я пробовал в этот момент, и 192.168.1.100:30506/hello -H 'Host: ciao.mirco.com' работает! - person sP0re90; 04.03.2020
comment
@ sp0re90 Буду признателен, если вы примете и проголосуете за мой ответ, если он ответит на ваш вопрос - person Arghya Sadhu; 04.03.2020
comment
@ArghyaSadhu готово, но, возможно, этого нельзя увидеть в посте, потому что у меня менее 15 репутации. Большое спасибо за терпение всем вам - person sP0re90; 04.03.2020
comment
@ sP0re90 вот вам более 15 респ. хе-хе :) - person Harsh Manvar; 04.03.2020
comment
@ArghyaSadhu, ахаха, спасибо. Только информация: теперь это работает, но я не использую созданный нами сервис nodeport. Мы используем порт службы балансировки нагрузки, на самом деле я удалил службу порта узла, и она все еще работает. Почему? - person sP0re90; 04.03.2020