Ekspos port 80 dan 443 di Google Container Engine tanpa penyeimbang beban

23

Saat ini saya sedang mengerjakan proyek hobi kecil yang akan saya buat open source setelah siap. Layanan ini berjalan di Google Container Engine. Saya memilih GCE untuk menghindari kerumitan konfigurasi, biaya terjangkau dan untuk mempelajari hal-hal baru.

Pod saya berjalan dengan baik dan saya membuat layanan dengan tipe LoadBalanceruntuk mengekspos layanan pada port 80 dan 443. Ini berfungsi dengan baik.

Namun, saya menemukan bahwa untuk setiap LoadBalancerlayanan, penyeimbang beban Mesin Komputasi Google baru dibuat. Penyeimbang beban ini cukup mahal dan benar-benar selesai untuk proyek hobi pada satu contoh.

Untuk memotong biaya, saya mencari cara untuk mengekspos port tanpa penyeimbang beban.

Apa yang saya coba sejauh ini:

Apakah ada cara untuk mengekspos port 80 dan 443 untuk satu instance di Google Container Engine tanpa penyeimbang beban?

Ruben Ernst
sumber

Jawaban:

10

Yap, melalui externalIP pada layanan. Contoh layanan yang saya gunakan:

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

Perlu diketahui bahwa IP yang tercantum dalam file konfigurasi harus IP internal pada GCE.

ConnorJC
sumber
Terima kasih! Tapi saya pikir saya melewatkan sesuatu. Layanan ini digunakan tetapi tidak dapat dari internet. Saya menetapkan aturan firewall yang benar. Layanan ini menampilkan yang benarexternalIp
Ruben Ernst
Maaf atas keterlambatan balasan, lupa bahwa saya menghabiskan waktu untuk masalah yang sama persis. IP yang terdaftar harus IP internal , bukan eksternal (Setidaknya pada GCE).
ConnorJC
Terima kasih, itu solusinya! Sayangnya saya belum diizinkan untuk memperbaiki suara ... Saya menjatuhkan komentar ini untuk memberi tahu Anda bahwa jawaban ini dikombinasikan dengan komentar di atas (yang merupakan kuncinya) menyelesaikan masalah saya!
Ruben Ernst
1
Apakah Anda (atau @RubenErnst) keberatan untuk sedikit memperluas jawabannya? Secara khusus, "IP yang terdaftar pada GCE harus IP intrenal." IP mana yang Anda maksud? Apakah Anda bisa mendapatkan ini berfungsi dengan IP statis yang ditugaskan untuk satu cluster node Anda?
Brett
@ Brett: Maaf atas tanggapan saya yang terlambat. Apakah pertanyaan Anda sudah dijawab untuk sementara?
Ruben Ernst
4

Selain solusi hebat dan kerja ConnorJC: Solusi yang sama juga dijelaskan dalam pertanyaan ini: Kubernetes - dapatkah saya menghindari penggunaan Penyeimbang Beban GCE untuk mengurangi biaya?

"InternalIp" mengacu pada ip internal instance komputasi (alias simpul) (seperti yang terlihat di Google Cloud Platform -> Google Compute Engine -> VM Instances)

Komentar ini memberikan petunjuk mengapa ip internal dan bukan eksternal harus dikonfigurasi.

Selain itu, setelah mengkonfigurasi layanan untuk port 80 dan 443, saya harus membuat aturan firewall yang memungkinkan lalu lintas ke simpul instance saya:

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

Setelah pengaturan ini, saya dapat mengakses layanan saya melalui http: // externalIp

derMikey
sumber
Menggunakan simpul IP internal melakukan trik. 👍 Seperti kebingungan dengan penamaan!
James
1

Jika Anda hanya memiliki satu pod, Anda dapat menggunakannya hostNetwork: trueuntuk mencapai ini:

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

Perhatikan bahwa dengan melakukan ini, pod Anda akan mewarisi resolver DNS host dan bukan Kubernetes. Itu berarti Anda tidak bisa lagi menyelesaikan layanan cluster dengan nama DNS. Misalnya, dalam contoh di atas Anda tidak dapat mengakses staticlayanan di http: // statis . Anda masih dapat mengakses layanan dengan IP cluster mereka, yang disuntikkan oleh variabel lingkungan .

Solusi ini lebih baik daripada menggunakan externalIP layanan karena mem-bypass kube-proxy, dan Anda akan menerima IP sumber yang benar.

akan akan
sumber
1

Untuk mensintesis jawaban @ConnorJC @ derMikey ke dalam apa yang berfungsi untuk saya:

Diberikan kumpulan gugus yang berjalan pada Mesin Hitung Mesin Virtual :

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

Saya membuat layanan:

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

dan kemudian membuka firewall untuk semua (?) ips di proyek:

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

dan kemudian my-appdapat diakses melalui IP Publik GCE Instance34.56.7.001 (bukan ip cluster)

membuat ukuran kecil
sumber
0

Saya lebih suka tidak menggunakan penyeimbang beban cloud, sampai diperlukan, karena biaya dan vendor terkunci.

Sebagai gantinya saya menggunakan ini: https://kubernetes.github.io/ingress-nginx/deploy/

Ini adalah pod yang menjalankan penyeimbang beban untuk Anda. Halaman itu memiliki catatan instalasi khusus GKE.

Michael Cole
sumber