В настоящее время я работаю над небольшим хобби-проектом, который я сделаю с открытым исходным кодом, когда он будет готов. Эта служба работает на Google Container Engine. Я выбрал GCE, чтобы избежать проблем с настройкой, доступных затрат и изучения нового.
Мои модули работают нормально, и я создал службу с типом LoadBalancer
чтобы открыть службу на портах 80 и 443. Это отлично работает.
Однако я обнаружил, что для каждого LoadBalancer
service создается новый балансировщик нагрузки Google Compute Engine. Этот балансировщик нагрузки довольно дорогостоящий и действительно перевыполнен для хобби-проекта на одном экземпляре.
Чтобы сократить расходы, я ищу способ открыть порты без балансировщика нагрузки.
Что я пробовал до сих пор:
Развернуть NodePort
служба. К сожалению, нельзя выставлять порт ниже 30000.
Разверните Ingress, но это также создаст балансировщик нагрузки.
Пытался отключить HttpLoadBalancing
(https://cloud.google.com/container-engine/reference/rest/v1/projects.zones.clusters#HttpLoadBalancing), но по-прежнему создает балансировщик нагрузки.
Есть ли способ открыть порт 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.