Как выставить Ingress для внешнего доступа в Kubernetes? - PullRequest
0 голосов
/ 04 октября 2018

У меня есть кластер kubernetes в частной сети (частный сервер, а не aws или облако Google), и я создал службу, чтобы иметь к ней доступ, однако мне нужно иметь возможность доступа извне кластера, и для этого ясоздал Ingress и добавил ingress-nginx в кластере.

Это YAML, который я использую после нескольких попыток:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: demo-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - host: k8s.local
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx
          servicePort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: ClusterIP
  selector:
    name: nginx
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
  # selector:
    # app: nginx
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: echoserver
        image: nginx
        ports:
        - containerPort: 80

Я запустил yaml так: kubectlсоздать -f file.yaml

В файле / etc / hosts я добавил k8s.local в ip главного сервера.

При попыткеПри входе или выходе главного сервера появляется сообщение «Отказано в соединении»: $ curl http://172.16.0.18:80/ -H 'Хост: k8s.local'

Я не знаю, еслиэто важно, но я использую Flannel в кластере.

Моя идея состоит в том, чтобы просто создать «привет мир» и выставить его вне кластера!

Нужно ли что-то менятьв конфигурации, чтобы разрешить этот доступ?


Файл YAML отредактирован:

    apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: demo-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    # nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: k8s.local
    http:
      paths:
      - path: /teste
        backend:
          serviceName: nginx
          servicePort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: LoadBalancer # NodePort
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: echoserver
        image: nginx
        ports:
        - containerPort: 80

Ответы [ 4 ]

0 голосов
/ 11 апреля 2019

Если вы запускаете кластер baremetal, вы должны указать контроллеру nginx-ingress использовать hostNetwork: true, который будет добавлен в часть шаблона / спецификации обязательного .yml. Таким образом, модуль, управляющий контроллером входа, будет прослушивать порт 80.и 443 хост-узла.

0 голосов
/ 05 октября 2018

В этом случае NodePort будет работать.Он откроет большой номер порта в каждом узле (один и тот же порт в каждом узле), поэтому вы можете использовать любой из этих узлов.Поместите балансировщик нагрузки, если хотите, и укажите бэкэнд-пул на те экземпляры, которые вы используете.Не используйте ClusterIP, он предназначен только для внутреннего использования.

0 голосов
/ 05 октября 2018

Вы можете развернуть входной контроллер в качестве демона с портом хоста 80. Служба контроллера не будет иметь значения.Вы можете указать свой домен на каждый узел в вашем кластере

Вы можете использовать службу типа NodePort, но это заставит вас использовать какой-либо порт в окрестностях 30 КБ, вы не сможете использовать порт 80

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

0 голосов
/ 05 октября 2018

Вы можете заставить его работать с простым модулем nginx, но рекомендуемый метод - установить входной контроллер Kubernetes, в вашем случае вы используете nginx, поэтому вы можете установить входной контроллер nginx .

Здесь - некоторая информация о том, как его установить.

Если вы хотите разрешить внешний доступ, вы также можете предоставить входному контроллеру nginx сервис LoadBalancer .Вы также можете использовать NodePort , но вам придется вручную указать балансировщик нагрузки на порт на ваших узлах Kubernetes.

И да, селектор в 'Service' должен быть:

селектор: приложение: nginx

...