Как выставить Ingress для внешнего доступа в Kubernetes?

У меня есть кластер 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 create -f file.yaml

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

При попытке выполнить команду на главном сервере или вне его появляется сообщение "Соединение отказано":$ curl http://172.16.0.18/ -H 'Host: 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

3 ответа

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

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

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

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

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

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

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

И да, селектор в "Сервисе" должен быть:

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

https://github.com/alexellis/inlets Это самый простой способ сделать то, что вы хотите.
Примечание: для шифрования требуется wss://, который требует сертификатов TLS. Если вы хотите полностью автоматическое шифрование + возможность использовать Inlets в качестве LB уровня 4, вы должны использовать Inlets Pro, это очень дешево по сравнению с другими облачными альтернативами.

Я также смог настроить версию Inlets oss /non-kubernetes-operator с шифрованием / wss (безопасные веб-сокеты), используя версию Inlets с открытым исходным кодом в качестве LB уровня 7. (это просто потребовало некоторой ручной настройки / не было полностью автоматизировано, как в профессиональной версии)

https://blog.alexellis.io/https-inlets-local-endpoints/ Мне удалось подключить общедоступный интернет-контроллер HTTPS + nginx к minikube + протестировал 2 сайта, маршрутизируемых с использованием входящих объектов. Примерно через 3-4 часа без хорошего руководства / новичок в Caddy/Websockets, но эксперт по Kubernetes Ingress.
В основном:
Шаг 1.) Создайте VPS за 0,007 долл. США в час или 5 долл. США в месяц на Digital Ocean с общедоступным IP-адресом.
Шаг 2.) Направьте mysite1.com, *.mysite1.com, mysite2.com, *.mysite2.com на общедоступный IP VPS.
Шаг 3.) SSH в машину и установка Inlets + Caddy v1.0.3 + Caddyfile вот мой:

mysite1.com, *.mysite1.com, mysite2.com, *.mysite2.com

proxy / 127.0.0.1:8080 {
  transparent
}

proxy /tunnel 127.0.0.1:8080 {
  transparent
  websocket
}

tls {
    max_certs 10
}


Шаг 4.) Разверните развертывание 1 входов в кластере kubernetes, используйте wss на своем VPS и укажите развертывание входов на службу контроллера входящего трафика типа IP-адрес кластера.


Основы того, что происходит:
1.) Caddy использует Lets Encrypt Free для автоматического получения сертификатов HTTPS для каждого веб-сайта, который вы указываете на сервере Caddy.
2.) Развертывание ваших входов запускает двунаправленный VPN-туннель с использованием веб-сокетов с VPS, имеющим общедоступный IP-адрес. (Предупреждение: VPN-туннель будет зашифрован только в том случае, если вы укажете wss, а для этого потребуется, чтобы у сервера был сертификат TLS, который он получает от "LEF")
3.) Caddy теперь является общедоступным LB/ обратным прокси -сервером L7, который завершает HTTPS, и пересылает на ваш входной контроллер через зашифрованный VPN-туннель websockets. Тогда это нормальный вход.
4.) Поток трафика: DNS -(разрешает IP)-> (HTTPS)VPS/L7 ReverseProxy - зашифрованный VPNtunnel-> Модуль входов из развертывания входов -L7 открытый текст в перенаправлении сети кластера на -> Служба контроллера входа -> Модуль контроллера входа -L7 перенаправляет на-> IP-сервисы / сайты кластера, определенные входящими объектами.

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

Другие вопросы по тегам