Могу ли я использовать входные сервисы k8s с внешним IP без установленного балансировщика нагрузки

#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.