Cara memilih alamat IP eksternal penyeimbang beban Kubernetes di Google Kubernetes Engine

16

Saya menggunakan aplikasi web menggunakan Google Kubernetes Engine dan saya ingin membuatnya dapat diakses melalui load balancer pada alamat IP statis yang ada yang saya kontrol sebagai bagian dari proyek yang sama di Google Cloud Platform, karena nama domain yang ingin saya gunakan sudah menunjuk ke IP ini.

File yaml yang saya gunakan untuk pod adalah:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  labels:
    app: my-app
spec:
  containers:
  - name: my-container
    image: gcr.io/my-project/my-app:latest

Saya dapat mengatur penyeimbang beban menggunakan:

apiVersion: v1
kind: Service
metadata:
  name: my-load-balancer
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: my-app
  type: LoadBalancer

Ini memberikan IP eksternal di mana aplikasi dapat diakses, tetapi saya tidak dapat menemukan cara untuk mengkonfigurasinya untuk menggunakan IP yang saya inginkan. The jasa dokumentasi menyebutkan pengaturan spec.clusterIP, tapi ini tampaknya tidak berhubungan dengan IP eksternal. Demikian juga, setelah penyeimbang beban diatur, bidang status.loadBalancer.ingress.ip layanan diatur ke alamat IP eksternal, tetapi ini tampaknya tidak menjadi pengaturan yang dapat dikonfigurasi.

Sebagai alternatif, saya mencoba secara manual membuat aturan penerusan di konsol Google Compute Engine untuk mengarahkan lalu lintas dari alamat IP statis saya ke kumpulan target yang disiapkan oleh Kubernetes, tetapi ketika saya mencoba menghubungkan koneksi ditolak.

Apakah ada cara untuk melakukan apa yang saya inginkan - untuk mengekspos pod Kubernetes (atau pengontrol replikasi) pada mesin Google Kubernetes pada alamat IP statis yang dipilih?

Ben
sumber

Jawaban:

9

TL; DR Google Kontainer Mesin berjalan Kubernetes v1.1 dukungan loadBalancerIPhanya menandai IP auto-ditugaskan sebagai statis pertama.

Kubernetes v1.1 mendukung externalIPs :

apiVersion: v1
kind: Service
spec:
  type: LoadBalancer
  loadBalancerIP: 10.10.10.10
  ...

Sejauh ini tidak ada dokumentasi konsisten yang benar-benar bagus tentang cara menggunakannya di GCE. Yang pasti adalah bahwa IP ini harus terlebih dahulu menjadi salah satu IP statis yang dialokasikan sebelumnya .

The lintas wilayah load balancing dokumentasi sebagian besar untuk Compute Engine dan tidak Kubernetes / Container Mesin, tapi masih berguna terutama bagian "Konfigurasi load balancing service".

Jika Anda hanya membuat Kubernetes LoadBalancer di GCE, itu akan membuat jaringan Compute Engine> Network> Network load balancing> Forwarding Rule yang menunjuk ke kumpulan target yang dibuat dari mesin Anda di cluster Anda (biasanya hanya mereka yang menjalankan Pod yang cocok dengan pemilih layanan) . Sepertinya menghapus namespace tidak dengan baik membersihkan aturan yang dibuat.


Memperbarui

Ini sebenarnya sekarang didukung (meskipun dalam dokumentasi):

  1. Periksa bahwa Anda menjalankan Kubernetes 1.1 atau lambat (di bawah GKE mengedit klaster dan periksa "Node versi")
  2. Di bawah Jaringan> Alamat IP eksternal Anda seharusnya sudah memiliki beberapa Ephemeral yang ditandai sebagai menunjuk ke instance VM kluster Anda (jika tidak atau tidak yakin, gunakan sekali tanpa loadBalancerIP, tunggu sampai Anda memiliki IP eksternal yang dialokasikan ketika Anda menjalankan kubectl get svc, dan cari IP itu di daftar di halaman itu). Menandai salah satu dari mereka sebagai statis , katakanlah itu Eksternal Alamat adalah 10.10.10.10.
  3. Edit LoadBalancer Anda untuk memiliki loadBalancerIP=10.10.10.10seperti di atas (beradaptasi dengan IP yang diberikan kepada Anda oleh Google).

Sekarang jika Anda menghapus LoadBalancer atau bahkan namespace Anda, itu akan mempertahankan alamat IP tersebut setelah dipekerjakan kembali pada kluster itu. Jika Anda perlu mengubah cluster, beberapa biola manual harus dimungkinkan:

  1. Di bawah bagian “Penyeimbangan beban jaringan”, tab “Kelompok target” , klik tombol “Buat kelompok target”:
    • Nama: cluster-pool(atau nama lainnya)
    • Wilayah: Pilih wilayah salah satu kelompok Anda
    • Pemeriksaan Kesehatan: Opsional, jika Anda mau
    • Pilih grup instan yang ada: Cluster Kubernetes Anda
  2. Di bagian “Penyeimbangan beban jaringan”, tab “Aturan penerusan” , klik tombol “Buat aturan penerusan”:
    • Nama: http-cross-region-gfr(atau nama lainnya)
    • Wilayah: Pilih wilayah salah satu kelompok Anda
    • IP eksternal: Pilih loadbalancer-ip-crossregionyang baru saja Anda pesan
    • Kumpulan target: Pilih cluster-poolyang baru saja Anda buat
Wernight
sumber
Apakah itu masih relevan?
Ben
8

Kabar baik. Ini akan diperbaiki di Kubernetes v1.1. Anda bisa mengatur service.spec.loadBalancerIPbidang ke IP yang Anda tahu milik Anda.


Sebelumnya:

Ini adalah fitur yang jatuh melalui celah-celah. Seharusnya berfungsi (dan bahkan mungkin telah bekerja di beberapa titik), tetapi tidak diuji dengan baik dan rusak sepanjang jalan dan kemudian semacam sengaja dirancang (sementara).

Ada dalam daftar pendek saya untuk hal-hal yang harus diperbaiki setelah 1.0.

https://github.com/GoogleCloudPlatform/kubernetes/issues/10323

Tim Hockin
sumber
Ini mungkin komentar, bukan jawaban.
Bangsal - Reinstate Monica
5
@Ward: "Itu tidak mungkin" dari dev adalah jawaban, IMHO, dan itu diterima.
Sven