Yük dengeleyici olmadan 80 ve 443 numaralı bağlantı noktalarını Google Container Engine’te gösterin


23

Şu anda hazır olunca açık kaynak yapacağım küçük bir hobi projesi üzerinde çalışıyorum. Bu hizmet Google Container Engine’de çalışıyor. Yapılandırma zorluğundan kaçınmak için GCE'yi seçtim, maliyetler uygun ve yeni şeyler öğrenmek için.

Bölmelerim iyi çalışıyor ve LoadBalancer80 ve 443 numaralı bağlantı noktalarında hizmeti gösterecek türden bir hizmet oluşturdum . Bu mükemmel çalışıyor.

Ancak, her LoadBalancerhizmet için yeni bir Google Compute Engine yük dengeleyici oluşturulduğunu keşfettim . Bu yük dengeleyici oldukça pahalı ve tek seferde bir hobi projesi için gerçekten bitti.

Maliyetleri düşürmek için yük dengeleyicisiz limanları ortaya çıkarmanın bir yolunu arıyorum.

Şimdiye kadar ne denedim:

Yükü dengeleyicisiz olarak Google Konteyner Motorunda tek bir örnek için 80 ve 443 numaralı bağlantı noktalarını göstermenin bir yolu var mı?

Yanıtlar:


10

Evet, hizmetteki hariciIP'ler aracılığıyla. Kullandığım örnek servis:

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

Lütfen config dosyasında listelenen IP’lerin GCE’de dahili IP olması gerektiğini unutmayın.


Teşekkürler! Ama sanırım bir şeyleri özledim. Hizmet dağıtıldı, ancak internetten erişilemiyor. Doğru güvenlik duvarı kurallarını belirledim. Hizmet doğru görüntülüyorexternalIp
Ruben Ernst

Geç cevap için özür dilerim, tam olarak aynı konuda zaman harcadığımı unuttum. Listelenen IP’lerin harici IP değil dahili IP olması gerekir (en azından GCE’de).
ConnorJC

Teşekkürler, çözüm buydu! Maalesef henüz oylama yapamadım ... Bu cevabın yukarıdaki yorumla (ki anahtardı) birleşimi sorunumu çözdüğünü bildirmek için bu yorumu bıraktım!
Ruben Ernst

1
(Veya @RubenErnst) cevabını biraz genişletmeyi düşünür müsünüz? Özellikle, "GCE'de listelenen IP'lerin iç IP olması gerekir." Hangi IP'yi kastediyorsunuz? Bunu, tek düğüm kümenize atanmış statik bir IP ile çalıştırabilir misiniz?
Brett,

@ Brett: Geç cevap verdiğim için özür dilerim. Bu arada sorunuz daha önce cevaplandı mı?
Ruben Ernst

4

ConnorJC'nin mükemmel ve çalışan çözümüne ek olarak: Aynı çözüm bu soruda da açıklanmaktadır: Kubernet'ler - GCE Yük Dengeleyicisini maliyetini azaltmak için kullanmaktan kaçınabilir miyim?

"İnternalIp" hesaplama örneğinin (yani düğümün) dahili ipini (Google Cloud Platform -> Google Compute Engine -> VM Örneklerinde görüldüğü gibi) ifade eder.

Bu yorum , harici ipin değil dahili ipin neden yapılandırılması gerektiğine dair bir ipucu verir.

Ayrıca, 80 ve 443 numaralı bağlantı noktaları için servisi yapılandırdıktan sonra, örnek düğümüme trafiğe izin veren bir güvenlik duvarı kuralı oluşturmak zorunda kaldım:

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

Bu kurulumdan sonra hizmetime http (s): // externalIp üzerinden erişebilirim


Dahili IP düğümünü kullanarak hile yaptı. The İsimle ilgili bu karışıklık!
James

1

Yalnızca bir bölmeye sahipseniz, hostNetwork: truebunu başarmak için kullanabilirsiniz :

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

Bunu yaparak bölmenizin sunucunun DNS çözümleyicisini miras alacağını ve Kubernet'lerde değil mi 'olacağını unutmayın. Bu, küme hizmetlerini artık DNS adına göre çözemeyeceğiniz anlamına gelir. Örneğin, yukarıdaki örnekte staticservise http: // static adresinden erişemezsiniz . Hizmetlere, ortam değişkenleri tarafından enjekte edilen IP kümeleriyle erişebilirsiniz .

Bu çözüm, hizmetin externalIP'sini kube-proxy'yi atlattığından daha iyidir ve doğru IP kaynağını alırsınız.


1

@ConnorJC @ derMikey'in cevaplarını benim için tam olarak neyin çalıştığına sentezlemek için:

Hesaplama Motoru Örneği üzerinde çalışan bir küme havuzu göz önüne alındığında :

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

Hizmeti yaptım:

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

ve ardından projedeki tüm (?) ips güvenlik duvarını açtı:

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

ve sonra GCE Örneğinin Genel IP'sindenmy-app erişilebilirdi (ip kümesi değil)34.56.7.001


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.