Назад | Перейти на главную страницу

Предоставьте порт 80 и 443 в Google Container Engine без балансировщика нагрузки

В настоящее время я работаю над небольшим хобби-проектом, который я сделаю с открытым исходным кодом, когда он будет готов. Эта служба работает на Google Container Engine. Я выбрал GCE, чтобы избежать проблем с настройкой, доступных затрат и изучения нового.

Мои модули работают нормально, и я создал службу с типом LoadBalancer чтобы открыть службу на портах 80 и 443. Это отлично работает.

Однако я обнаружил, что для каждого LoadBalancer service создается новый балансировщик нагрузки Google Compute Engine. Этот балансировщик нагрузки довольно дорогостоящий и действительно перевыполнен для хобби-проекта на одном экземпляре.

Чтобы сократить расходы, я ищу способ открыть порты без балансировщика нагрузки.

Что я пробовал до сих пор:

Есть ли способ открыть порт 80 и 443 для одного экземпляра в Google Container Engine без балансировщика нагрузки?

Да, через externalIP на сервисе. Пример службы, которую я использовал:

apiVersion: v1
kind: Service
metadata:
  name: bind
  labels:
    app: bind
    version: 3.0.0
spec:
  ports:
    - port: 53
      protocol: UDP
  selector:
    app: bind
    version: 3.0.0
  externalIPs:
    - a.b.c.d
    - a.b.c.e

Имейте в виду, что IP-адреса, перечисленные в файле конфигурации, должны быть внутренними IP-адресами GCE.

В дополнение к отличному и рабочему решению ConnorJC: в этом вопросе также описано то же решение: Kubernetes - могу ли я избежать использования GCE Load Balancer для снижения затрат?

"InternalIp" относится к внутреннему IP-адресу вычислительного экземпляра (также известного как узел) (как показано на Google Cloud Platform -> Google Compute Engine -> VM Instances).

это комментарий дает подсказку, почему следует настраивать внутренний, а не внешний IP.

Кроме того, после настройки службы для портов 80 и 443 мне пришлось создать правило брандмауэра, разрешающее трафик к моему узлу экземпляра:

gcloud compute firewall-rules create your-name-for-this-fw-rule --allow tcp:80,tcp:443 --source-ranges=0.0.0.0/0

После этой настройки я мог получить доступ к своей службе через http (s): // externalIp

Если у вас только одна капсула, вы можете использовать hostNetwork: true для достижения этой цели:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: caddy
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: caddy
    spec:
      hostNetwork: true # <---------
      containers:
      - name: caddy
        image: your_image
        env:
        - name: STATIC_BACKEND # example env in my custom image
          value: $(STATIC_SERVICE_HOST):80

Обратите внимание, что, делая это ваш модуль унаследует DNS-преобразователь хоста а не Кубернетов. Это означает, что вы больше не можете разрешать службы кластера по имени DNS. Например, в приведенном выше примере вы не можете получить доступ к static обслуживание в http: // статический. Вы по-прежнему можете получить доступ к службам по их IP-адресу кластера, который вводится переменные среды.

Это решение лучше, чем использование внешнего IP-адреса службы, поскольку оно обходит kube-proxy, и вы получите правильный исходный IP-адрес.

Чтобы синтезировать ответы @ConnorJC @ derMikey в том, что сработало для меня:

Учитывая кластерный пул, работающий на Экземпляр Compute Engine:

gce vm name: gke-my-app-cluster-pool-blah`
internal ip: 10.123.0.1
external ip: 34.56.7.001 # will be publically exposed

Сделал сервис:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: my-app
  name: my-app-service
spec:
  clusterIP: 10.22.222.222
  externalIPs:
  - 10.123.0.1 # the instance internal ip
  ports:
  - port: 80
    protocol: TCP
  selector:
    app: my-app
  type: ClusterIP

а затем открыл брандмауэр для всех (?) IP-адресов в проекте:

gcloud compute firewall-rules create open-my-app --allow tcp:80,tcp:443 --source-ranges=0.0.0.0/0

а потом my-app был доступен через Общедоступный IP-адрес экземпляра GCE 34.56.7.001 (не IP-адрес кластера)

Я предпочитаю не использовать облачные балансировщики нагрузки до тех пор, пока это необходимо, из-за стоимости и привязки к поставщику.

Вместо этого я использую это: https://kubernetes.github.io/ingress-nginx/deploy/

Это модуль, который запускает для вас балансировщик нагрузки. На этой странице есть примечания по установке GKE.