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

23

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

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

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

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

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

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

Рубен Эрнст
источник

Ответы:

10

Да, через внешние IP на сервисе. Пример сервиса, который я использовал:

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
источник
Благодарность! Но я думаю, что что-то упустил. Служба развернута, но недоступна из Интернета. Я установил правильные правила брандмауэра. Сервис отображается правильноexternalIp
Рубен Эрнст
Извините за поздний ответ, забыл, что потратил время на точно такой же вопрос. Указанные IP-адреса должны быть внутренними , а не внешними (по крайней мере, на GCE).
ConnorJC
Спасибо, это было решение! К сожалению, мне пока не разрешено голосовать ... Я оставил этот комментарий, чтобы вы знали, что этот ответ в сочетании с комментарием выше (который был ключевым) решил мою проблему!
Рубен Эрнст
1
Не могли бы вы (или @RubenErnst) немного расширить ответ? В частности, «IP-адреса, перечисленные на GCE, должны быть внутренними IP-адресами». Какой IP вы имеете в виду? Вы можете заставить это работать со статическим IP, назначенным вашему кластеру с одним узлом?
Бретт
@ Бретт: Извините за мой поздний ответ. На ваш вопрос уже дан ответ?
Рубен Эрнст
4

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

«InternalIp» относится к внутреннему ip (например, на Google Cloud Platform -> Google Compute Engine -> экземпляры виртуальных машин) экземпляра вычислительного экземпляра (или узла).

Этот комментарий дает подсказку о том, почему следует настроить внутренний, а не внешний 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

derMikey
источник
С помощью внутреннего IP узла сделали свое дело. 👍 Такая путаница с именами!
Джеймс
1

Если у вас есть только один модуль, вы можете использовать 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-преобразователь хоста, а не Kubernetes. Это означает, что вы больше не можете разрешать службы кластеров по имени DNS. Например, в приведенном выше примере вы не можете получить доступ к staticслужбе по адресу http: // static . Вы по-прежнему можете обращаться к сервисам по их IP-адресу кластера, которые вводятся переменными среды .

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

willwill
источник
1

Чтобы обобщить ответы @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

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

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

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

micimize
источник
0

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

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

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

Майкл Коул
источник