Esporre le porte 80 e 443 su Google Container Engine senza bilanciamento del carico


23

Attualmente sto lavorando a un piccolo progetto di hobby che renderò open source una volta pronto. Questo servizio è in esecuzione su Google Container Engine. Ho scelto GCE per evitare problemi di configurazione, i costi sono convenienti e per imparare nuove cose.

I miei pod funzionano bene e ho creato un servizio con tipo LoadBalancerper esporre il servizio sulla porta 80 e 443. Funziona perfettamente.

Tuttavia, ho scoperto che per ogni LoadBalancerservizio viene creato un nuovo bilanciamento del carico di Google Compute Engine. Questo sistema di bilanciamento del carico è piuttosto costoso e davvero finito per un progetto di hobby su una singola istanza.

Per ridurre i costi sto cercando un modo per esporre le porte senza il bilanciamento del carico.

Quello che ho provato finora:

C'è un modo per esporre le porte 80 e 443 per una singola istanza su Google Container Engine senza un bilanciamento del carico?

Risposte:


10

Sì, tramite IP esterni sul servizio. Esempio di servizio che ho usato:

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

Si noti che gli IP elencati nel file di configurazione devono essere IP interni su GCE.


Grazie! Ma penso di aver perso qualcosa. Il servizio è distribuito ma impossibile da Internet. Ho impostato le regole del firewall corrette. Il servizio mostra il correttoexternalIp
Ruben Ernst

Ci scusiamo per la risposta tardiva, ho dimenticato che ho trascorso del tempo sullo stesso identico problema. Gli IP elencati devono essere IP interni , non esterni (almeno su GCE).
ConnorJC,

Grazie, quella era la soluzione! Purtroppo non ho ancora il permesso di votare ... Ho lasciato cadere questo commento per farti sapere che questa risposta combinata con il commento sopra (che era la chiave) ha risolto il mio problema!
Ruben Ernst,

1
Ti dispiacerebbe (o @RubenErnst) espandersi un po 'sulla risposta? In particolare, "gli IP elencati su GCE devono essere gli IP interni." Quale IP intendi? Sei in grado di farlo funzionare con un IP statico assegnato al tuo cluster a nodo singolo?
Brett,

@Brett: mi dispiace per la mia risposta in ritardo. Nel frattempo hai già risposto alla tua domanda?
Ruben Ernst,

4

Oltre alla soluzione eccezionale e funzionante di ConnorJC: la stessa soluzione è descritta anche in questa domanda: Kubernetes - posso evitare di utilizzare GCE Load Balancer per ridurre i costi?

"InternalIp" si riferisce all'ip interno dell'istanza di calcolo (noto anche come nodo) (come visto su Google Cloud Platform -> Google Compute Engine -> Istanze VM)

Questo commento fornisce un suggerimento sul motivo per cui è necessario configurare l'IP interno e non esterno.

Inoltre, dopo aver configurato il servizio per le porte 80 e 443, ho dovuto creare una regola firewall che consentisse il traffico al mio nodo di istanza:

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

Dopo questa configurazione, potrei accedere al mio servizio tramite http (s): // externalIp


L'uso dell'IP interno del nodo ha funzionato. 👍 Tale confusione con la denominazione!
James,

1

Se hai esattamente un solo pod, puoi usarlo hostNetwork: trueper raggiungere questo obiettivo:

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

In questo modo il pod erediterà il resolver DNS dell'host e non quello di Kubernetes. Ciò significa che non è più possibile risolvere i servizi cluster in base al nome DNS. Ad esempio, nell'esempio sopra non è possibile accedere al staticservizio su http: // statico . È ancora possibile accedere ai servizi tramite l'IP del cluster, che vengono iniettati dalle variabili di ambiente .

Questa soluzione è migliore dell'utilizzo dell'IP esterno del servizio in quanto ignora il proxy kube e riceverai l'IP di origine corretto.


1

Per sintetizzare le risposte di @ConnorJC @ derMikey esattamente in ciò che ha funzionato per me:

Dato un pool di cluster in esecuzione sull'istanza di 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

Ho reso il servizio:

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

e quindi ha aperto il firewall per tutti (?) ips nel progetto:

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

e quindi my-appera accessibile tramite l' IP pubblico GCE Instance34.56.7.001 (non l'IP del cluster)


0

Preferisco non utilizzare i servizi di bilanciamento del carico cloud, fino a quando necessario, a causa dei costi e del blocco del fornitore.

Invece lo uso: https://kubernetes.github.io/ingress-nginx/deploy/

È un pod che esegue un bilanciamento del carico per te. Quella pagina contiene note di installazione specifiche di GKE.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.