Розкрийте порти 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.


Спасибі! Але я думаю, що я щось пропустив. Служба розгорнута, але не має можливості з Інтернету. Я встановив правильні правила брандмауера. Служба відображає правильнуexternalIp
Рубен Ернст

Вибачте за несвоєчасну відповідь, забув, що витратив час на те саме питання. Перелічені IP-адреси повинні бути внутрішніми IP-адресами, а не зовнішніми (принаймні на GCE).
ConnorJC

Дякую, це було рішення! На жаль, мені ще не дозволено подати заявку ... Я кинув цей коментар, щоб повідомити, що ця відповідь у поєднанні з коментарем, який був вище (який був ключовим) вирішив мою проблему!
Рубен Ернст

1
Чи хотіли б ви (чи @RubenErnst) розгорнутись щодо відповіді? Зокрема, "IP-адреси, перелічені в GCE, повинні бути внутрішньою ІС". Який IP ви маєте на увазі? Чи можете ви працювати з цим статичним IP-адресою, присвоєною вашому кластеру єдиного вузла?
Бретт

@Brett: Вибачте за мою пізню відповідь. На ваше запитання вже відповіли?
Рубен Ернст

4

На додаток до чудового та робочого рішення ConnorJC: те саме рішення описано і в цьому запитанні: Kubernetes - чи можу я уникнути використання балансоутримувача навантаження GCE для зниження витрат?

"InternalIp" відноситься до внутрішнього ip обчислювального примірника (він же вузол) (як видно з хмарної платформи Google -> Google Compute Engine -> інстанції VM)

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


Використання внутрішнього 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, який вводиться змінними середовища .

Це рішення краще, ніж використання зовнішнього протоколу служби, оскільки він обходить kube-proxy, і ви отримаєте правильний IP-код джерела.


1

Щоб синтезувати відповіді @ConnorJC @ derMikey, саме те, що працювало для мене:

З огляду на пул кластерів, що працює на екземплярі обчислювального двигуна :

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 Instance Public (не кластер ip)


0

Я вважаю за краще не використовувати хмарні балансири навантаження, поки це не потрібно, через витрати та блокування постачальника.

Натомість я використовую це: https://kubernetes.github.io/ingress-nginx/deploy/

Це стручок, який запускає балансир навантаження для вас. На цій сторінці є специфічні примітки щодо встановлення GKE.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.