Как выставить 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, это только для внутреннего использования.