#kubernetes #kubernetes-ingress
#kubernetes #kubernetes-вход
Вопрос:
Я начал работать с kubernetes несколько месяцев назад, я создаю службы и набор реплик для разных серверных приложений.
Теперь я хочу использовать службу входа для доступа к моим различным приложениям извне с моим доменным именем. Поскольку он еще не запущен в производство, и я использую только на узле, я не хочу использовать loadbalancer.
Можно установить службу с помощью NodePort и подключить ее к входу без использования loadbalancer?
Это моя конфигурация:
kind: Service
metadata:
name: nginx-replicaset-service
labels:
app: nginx-demo
spec:
externalIPs:
- XXX.XXX.XXX.XXX
selector:
app: nginx-replica
type: NodePort
ports:
- name: http
port: 80
kind: Ingress
metadata:
name: my-ingress
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: www.mydomain.com
http:
paths:
- path: /
backend:
serviceName: nginx-replicaset-service
servicePort: 80
- host: test.mydomain.com
http:
paths:
- path: /test
backend:
serviceName: other-service
servicePort: 80
Когда я проверяю информацию о входе в моем кластере, я получаю следующее:
NAME HOSTS ADDRESS PORTS AGE
my-ingress www.mydomain.com,test.mydomain.com 80 4d22h
Адрес всегда пуст
Ответ №1:
Если ваш кластер работает на GCP или GKE, вы можете
1) создайте глобальный IP-адрес
gcloud compute addresses create ingress-static-ip --global
2) установите kubernetes.io/ingress.global-static-ip-name аннотация к конфигурации входа
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
annotations:
kubernetes.io/ingress.global-static-ip-name: ingress-static-ip
labels:
app: nginx-replica
3) И сервис
apiVersion: v1
kind: Service
metadata:
name: nginx-replicaset-service
labels:
app: nginx-demo
spec:
selector:
app: nginx-replica
type: NodePort
ports:
- name: http
port: 80
https://cloud.google.com/kubernetes-engine/docs/tutorials/configuring-domain-name-static-ip
Комментарии:
1. GKE все еще создает балансировщик нагрузки, даже используя эту конфигурацию
Ответ №2:
Не напрямую, или, по крайней мере, это было бы неудобно. Службы NodePort ограничены рядом портов высокого уровня по соображениям безопасности, поэтому для этого потребуется http://externalip:43210
или любой другой выбранный им порт. Более распространенный способ не использовать балансировщик нагрузки — развернуть контроллер входа, используя набор демонов и режим hostNetwork, чтобы он мог прослушивать 80 и 443. Однако это все еще оставляет проблему получения IP-адресов пользователю. В целях разработки вы можете просто выбрать любой из IP-адресов для своих узлов и использовать его. Для prod это сложнее, поэтому обычно не рекомендуется.
Ответ №3:
Да, вы можете, но вы не должны указывать NodePort с помощью externalIPs. С помощью externalIPs вы можете указать порт напрямую следующим образом :
kind: Service
metadata:
name: nginx-replicaset-service
labels:
app: nginx-demo
spec:
externalIPs:
- XXX.XXX.XXX.XXX
selector:
app: nginx-replica
ports:
- name: http
port: 80
Это будет означать, что вы сможете получить доступ к службе с помощью XXX.XXX.XXX.XXX:80
Это нормально, что вы не видите никакого адреса при описании вашего входа, вход будет содержать только то, что вы указали во входе.yaml: вы использовали только имена хостов при входе.
Если вы выполните «kubectl get svc», вы увидите свой сервис с внешним IP-адресом.
Также для работы вашего входа это означает www.domain.com и test.domain.com нужно указать на XXX.XXX.XXX.XXX.