Ingress
Kubernetes v1.19 [stable]
Sebuah obyek API yang mengatur akses eksternal terhadap Service yang ada di dalam klaster, biasanya dalam bentuk request HTTP.
Ingress juga menyediakan load balancing, terminasi SSL, serta name-based virtual hosting.
Catatan:
Proyek Kubernetes merekomendasikan menggunakan Gateway daripada Ingress. API Ingress telah dibekukan. Ini berarti: API Ingress tersedia secara umum (generally available), dan tunduk pada jaminan stabilitas untuk API yang tersedia sepenuhnya. API Ingress tidak lagi dikembangkan, dan tidak akan ada perubahan atau pembaruan lebih lanjut yang dilakukan padanya.Terminologi
Untuk kejelasan, panduan ini mendefinisikan istilah-istilah berikut:
- Node: Mesin pekerja di Kubernetes, bagian dari sebuah cluster.
- Cluster: Sekumpulan Node yang menjalankan aplikasi terkontainerisasi yang dikelola oleh Kubernetes. Untuk contoh ini, dan dalam sebagian besar deployment Kubernetes yang umum, node di dalam cluster tidak menjadi bagian dari jaringan cluster itu sendiri.
- Edgerouter: Router yang menegakkan kebijakan firewall untuk cluster Anda. Ini bisa berupa gateway yang dikelola oleh cloud provider.
- Jaringan cluster (Cluster network): Sekumpulan tautan, baik logis maupun fisik, yang memfasilitasi komunikasi di dalam cluster Anda.
- Service: Service Kubernetes yang mengidentifikasi sekumpulan Pod menggunakan selector.
Apa itu Ingress?
Ingress mengekspos rute HTTP dan HTTPS dari luar cluster ke Service di dalam cluster. Routing lalu lintas dikendalikan oleh aturan yang didefinisikan pada resource Ingress.
Berikut adalah contoh sederhana di mana sebuah Ingress mengirimkan seluruh lalu lintasnya ke satu Service:
Gambar. Ingress Fan Out
Sebuah Ingress dapat dikonfigurasi untuk memberikan Service URL yang dapat dijangkau secara eksternal, melakukan load balance lalu lintas, melakukan terminasi SSL / TLS, dan menawarkan virtual hosting berbasis nama. Sebuah Ingress controller bertanggung jawab untuk memenuhi Ingress, biasanya dengan load balancer, meskipun ia juga dapat mengkonfigurasi edge router Anda atau frontend tambahan untuk membantu menangani permintaan.
Ingress tidak mengekspos port atau protokol arbitrer. Mengekspos service selain HTTP dan HTTPS ke internet biasanya menggunakan service dengan tipe Service.Type=NodePort atau Service.Type=LoadBalancer.
Prasyarat
Anda harus memiliki Ingress controller untuk memenuhi Ingress. Hanya membuat resource Ingress tidak akan memberikan efek apa pun.
Anda dapat memilih dari sejumlah Ingress controller.
Idealnya, semua Ingress controller harus sesuai dengan spesifikasi referensi. Kenyataannya, berbagai Ingress controller beroperasi sedikit berbeda.
Catatan:
Pastikan Anda meninjau dokumentasi Ingress controller pilihan Anda untuk memahami peringatan saat memilihnya.Sumber daya Ingress
Contoh minimal sumber daya Ingress:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minimal-ingress
spec:
ingressClassName: nginx-example
rules:
- http:
paths:
- path: /testpath
pathType: Prefix
backend:
service:
name: test
port:
number: 80
Sebuah Ingress memerlukan field apiVersion, kind, metadata, dan spec.
Nama objek Ingress harus merupakan Nama subdomain DNS yang valid.
Untuk informasi umum tentang bekerja dengan file konfigurasi, lihat
mendeploy aplikasi,
mengkonfigurasi container,
mengelola resource.
Ingress controller sering menggunakan anotasi untuk mengkonfigurasi perilaku.
Tinjau dokumentasi Ingress controller pilihan Anda untuk mengetahui anotasi mana yang diharapkan dan/atau didukung.
Spesifikasi Ingress memuat semua informasi yang dibutuhkan untuk mengkonfigurasi load balancer atau proxy server. Yang terpenting, ia berisi daftar aturan yang dicocokkan dengan semua permintaan masuk. Resource Ingress hanya mendukung aturan untuk mengarahkan lalu lintas HTTP(S).
Jika ingressClassName dihilangkan, sebuah Ingress class default
sebaiknya didefinisikan.
Beberapa ingress controller bekerja bahkan tanpa definisi IngressClass default. Meskipun Anda menggunakan ingress controller yang mampu beroperasi tanpa IngressClass apa pun, proyek Kubernetes tetap merekomendasikan agar Anda mendefinisikan IngressClass default.
Aturan Ingress
Setiap aturan HTTP memuat informasi berikut:
- Host opsional. Dalam contoh ini, tidak ada host yang ditentukan, sehingga aturan berlaku untuk semua lalu lintas HTTP masuk melalui alamat IP yang ditentukan. Jika host disediakan (misalnya,
foo.bar.com), aturan berlaku untuk host tersebut. - Daftar path (misal,
/testpath), yang masing-masing memiliki backend terkait yang didefinisikan denganservice.namedanservice.port.nameatauservice.port.number. Baik host maupun path harus cocok dengan konten permintaan masuk sebelum load balancer mengarahkan lalu lintas ke Service yang direferensikan. - Backend adalah kombinasi Service dan nama port seperti dijelaskan dalam dokumen Service atau backend custom resource melalui CRD. Permintaan HTTP (dan HTTPS) ke Ingress yang cocok dengan host dan path dari aturan dikirim ke backend yang terdaftar.
Sebuah defaultBackend sering dikonfigurasi dalam Ingress controller untuk melayani setiap permintaan yang tidak cocok dengan path dalam spesifikasi.
DefaultBackend
Ingress tanpa aturan mengirimkan semua lalu lintas ke satu default backend, dan spec.defaultBackend adalah backend yang seharusnya menangani permintaan dalam kasus tersebut. defaultBackend secara konvensional merupakan opsi konfigurasi dari Ingress controller dan tidak ditentukan dalam resource Ingress Anda. Jika tidak ada .spec.rules yang ditentukan, .spec.defaultBackend harus ditentukan. Jika defaultBackend tidak diatur, penanganan permintaan yang tidak cocok dengan aturan apa pun akan diserahkan kepada ingress controller (konsultasikan dokumentasi untuk ingress controller Anda untuk mengetahui bagaimana ia menangani kasus ini).
Jika tidak ada host atau path yang cocok dengan permintaan HTTP di objek Ingress, lalu lintas dirutekan ke default backend Anda.
Resource backends
Sebuah Resource Backend adalah ObjectRef ke resource Kubernetes lain di dalam namespace yang sama dengan objek Ingress. Sebuah Resource adalah pengaturan yang saling eksklusif dengan Service, dan akan gagal divalidasi jika keduanya ditentukan. ... Penggunaan umum untuk Resource backend adalah untuk memasukkan data ke backend object storage dengan aset statis.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-resource-backend
spec:
defaultBackend:
resource:
apiGroup: k8s.example.com
kind: StorageBucket
name: static-assets
rules:
- http:
paths:
- path: /icons
pathType: ImplementationSpecific
backend:
resource:
apiGroup: k8s.example.com
kind: StorageBucket
name: icon-assets
Setelah membuat Ingress di atas, Anda dapat melihatnya dengan perintah berikut:
kubectl describe ingress ingress-resource-backend
Name: ingress-resource-backend
Namespace: default
Address:
Default backend: APIGroup: k8s.example.com, Kind: StorageBucket, Name: static-assets
Rules:
Host Path Backends
---- ---- --------
*
/icons APIGroup: k8s.example.com, Kind: StorageBucket, Name: icon-assets
Annotations: <none>
Events: <none>
Jenis Path (Path types)
Setiap path dalam sebuah Ingress diwajibkan memiliki jenis path yang sesuai (path type). Path yang tidak menyertakan pathType secara eksplisit akan gagal dalam validasi. Ada tiga jenis path yang didukung:
-
ImplementationSpecific: Dengan tipe path ini, pencocokan tergantung pada IngressClass. Implementasi dapat memperlakukannya sebagai pathType yang terpisah atau memperlakukannya identik dengan tipe path Prefix atau Exact.
-
Exact: Mencocokkan path URL secara persis dan sensitif terhadap huruf besar/kecil (case-sensitive).
-
Prefix: Mencocokkan berdasarkan awalan path URL yang dipisahkan oleh /. Pencocokan sensitif terhadap huruf besar/kecil dan dilakukan per elemen path. Elemen path mengacu pada daftar label di path yang dipisahkan oleh pemisah /. Sebuah permintaan dianggap cocok untuk path p jika setiap p merupakan awalan per elemen dari path p dari path permintaan.
Catatan:
Jika elemen terakhir dari path merupakan substring dari elemen terakhir di path permintaan, itu bukanlah kecocokan (misalnya: /foo/bar cocok dengan /foo/bar/baz, tetapi tidak cocok dengan /foo/barbaz).Contoh Pencocokan Path
| Jenis | Path(s) | Path Permintaan | Cocok? | Catatan |
|---|---|---|---|---|
Prefix |
/ |
(semua path) | Ya | Mencocokkan semua permintaan. |
Exact |
/foo |
/foo |
Ya | Pencocokan persis. |
Exact |
/foo |
/bar |
Tidak | Path tidak sama. |
Exact |
/foo |
/foo/ |
Tidak | Exact tidak cocok dengan trailing slash. |
Exact |
/foo/ |
/foo |
Tidak | Exact tidak cocok dengan trailing slash. |
Prefix |
/foo |
/foo, /foo/ |
Ya | Cocok dengan prefix elemen. |
Prefix |
/foo/ |
/foo, /foo/ |
Ya | Cocok dengan prefix elemen. |
Prefix |
/aaa/bb |
/aaa/bbb |
Tidak | /bbb bukan elemen yang diawali /bb. |
Prefix |
/aaa/bbb |
/aaa/bbb |
Ya | Pencocokan persis. |
Prefix |
/aaa/bbb/ |
/aaa/bbb |
Ya | Mengabaikan trailing slash. |
Prefix |
/aaa/bbb |
/aaa/bbb/ |
Ya | Cocok dengan trailing slash. |
Prefix |
/aaa/bbb |
/aaa/bbb/ccc |
Ya | Cocok dengan subpath. |
Prefix |
/aaa/bbb |
/aaa/bbbxyz |
Tidak | Bukan kecocokan prefix elemen. |
Prefix |
/, /aaa |
/aaa/ccc |
Ya | Cocok dengan prefix /aaa. |
Prefix |
/, /aaa, /aaa/bbb |
/aaa/bbb |
Ya | Cocok dengan prefix /aaa/bbb. |
Prefix |
/, /aaa, /aaa/bbb |
/ccc |
Ya | Cocok dengan prefix /. |
Prefix |
/aaa |
/ccc |
Tidak | Tidak ada kecocokan, akan menggunakan default backend. |
Mixed |
/foo (Prefix), /foo (Exact) |
/foo |
Ya | Memilih Exact terlebih dahulu. |
Multiple matches
Dalam beberapa kasus, beberapa path dalam satu Ingress akan cocok dengan sebuah permintaan. Dalam situasi ini, prioritas akan diberikan pertama-tama kepada path yang paling panjang yang cocok. Jika dua path masih sama-sama cocok, prioritas akan diberikan pada path dengan tipe path exact daripada tipe path prefix.
Hostname wildcards
Host dapat berupa kecocokan tepat (misalnya “foo.bar.com”) atau wildcard (misalnya “*.foo.com”). Kecocokan tepat memerlukan bahwa header HTTP host cocok dengan field host. Kecocokan wildcard memerlukan header HTTP host sama dengan suffix dari aturan wildcard.
| Host | Header Host | Cocok? |
|---|---|---|
*.foo.com |
bar.foo.com |
Cocok berdasarkan suffix yang sama |
*.foo.com |
baz.bar.foo.com |
Tidak cocok, wildcard hanya mencakup satu label DNS |
*.foo.com |
foo.com |
Tidak cocok, wildcard hanya mencakup satu label DNS |
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-wildcard-host
spec:
rules:
- host: "foo.bar.com"
http:
paths:
- pathType: Prefix
path: "/bar"
backend:
service:
name: service1
port:
number: 80
- host: "*.foo.com"
http:
paths:
- pathType: Prefix
path: "/foo"
backend:
service:
name: service2
port:
number: 80
Ingress class
Ingress dapat diimplementasikan oleh controller yang berbeda, seringkali dengan konfigurasi yang berbeda. Setiap Ingress sebaiknya menentukan class, yaitu referensi ke resource IngressClass yang memuat konfigurasi tambahan termasuk nama controller yang seharusnya mengimplementasikan class tersebut.
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: external-lb
spec:
controller: example.com/ingress-controller
parameters:
apiGroup: k8s.example.com
kind: IngressParameters
name: external-lb
Field .spec.parameters dari IngressClass memungkinkan Anda mereferensikan resource lain yang menyediakan konfigurasi terkait dengan IngressClass tersebut.
Jenis parameter spesifik yang digunakan tergantung pada ingress controller yang Anda tentukan di field .spec.controller dari IngressClass.
Ruang lingkup IngressClass
Tergantung pada ingress controller Anda, Anda dapat menggunakan parameter yang Anda atur di seluruh cluster, atau hanya untuk satu namespace.
<li class="nav-item"><a data-toggle="tab" class="nav-link" href="#tabs-ingressclass-parameter-scope-1" role="tab" aria-controls="tabs-ingressclass-parameter-scope-1">Namespaced</a></li></ul>
Ruang lingkup default untuk parameter IngressClass adalah seluruh cluster.Jika Anda mengatur field .spec.parameters dan tidak mengatur .spec.parameters.scope, atau jika Anda mengatur .spec.parameters.scope ke Cluster, maka IngressClass merujuk ke resource berskop cluster. Kind (dikombinasikan dengan apiGroup) dari parameter merujuk ke API berskop cluster (kemungkinan custom resource), dan name dari parameter mengidentifikasi resource berskop cluster tertentu untuk API tersebut. For example:
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: external-lb-1
spec:
controller: example.com/ingress-controller
parameters:
# The parameters for this IngressClass are specified in a
# ClusterIngressParameter (API group k8s.example.net) named
# "external-config-1". This definition tells Kubernetes to
# look for a cluster-scoped parameter resource.
scope: Cluster
apiGroup: k8s.example.net
kind: ClusterIngressParameter
name: external-config-1
Kubernetes v1.23 [stable]
Jika Anda mengatur field .spec.parameters dan mengatur .spec.parameters.scope ke Namespace, maka IngressClass merujuk ke resource berskop namespace. Anda juga harus mengatur field namespace di dalam .spec.parameters ke namespace yang memuat parameter yang ingin Anda gunakan.
Kind (bersama dengan apiGroup) dari parameter merujuk ke API berskop namespace (misalnya: ConfigMap), dan name dari parameter mengidentifikasi resource tertentu di namespace yang Anda tentukan di namespace.
parameter tingkat namespace membantu operator cluster mendelegasikan kontrol atas konfigurasi (misalnya: pengaturan load balancer, definisi API gateway) yang digunakan untuk workload. Jika Anda menggunakan parameter tingkat klaster, maka:
- tim operator klaster perlu menyetujui perubahan dari tim lain setiap kali ada konfigurasi baru yang diterapkan.
- tim operator klaster harus mendefinisikan kontrol akses spesifik, seperti role dan binding RBAC, yang memungkinkan tim aplikasi membuat perubahan pada resource parameter tingkat klaster.
API IngressClass itu sendiri selalu tingkat klaster.
Berikut adalah contoh IngressClass yang merujuk ke parameter tingkat namespace:
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: external-lb-2
spec:
controller: example.com/ingress-controller
parameters:
# The parameters for this IngressClass are specified in an
# IngressParameter (API group k8s.example.com) named "external-config",
# that's in the "external-configuration" namespace.
scope: Namespace
apiGroup: k8s.example.com
kind: IngressParameter
namespace: external-configuration
name: external-config
Anotasi yang sudah tidak digunakan (Deprecated annotation)
Sebelum resource IngressClass dan field ingressClassName ditambahkan di Kubernetes 1.18, class Ingress ditentukan menggunakan anotasi kubernetes.io/ingress.class pada Ingress. Anotasi ini tidak pernah didefinisikan secara formal, tetapi didukung secara luas oleh Ingress controller.
Field ingressClassName yang lebih baru pada Ingress adalah pengganti untuk anotasi tersebut, tetapi tidak sepenuhnya setara. Meskipun anotasi umumnya digunakan untuk mereferensikan nama Ingress controller yang seharusnya mengimplementasikan Ingress, field ingressClassName adalah referensi ke resource IngressClass yang memuat konfigurasi Ingress tambahan, termasuk nama Ingress controller.
IngressClass default
Anda dapat menandai IngressClass tertentu sebagai default untuk cluster Anda. Mengatur anotasi ingressclass.kubernetes.io/is-default-class ke true pada resource IngressClass akan memastikan bahwa Ingress baru tanpa field ingressClassName yang ditentukan akan ditetapkan IngressClass default ini.
Perhatian:
Jika Anda memiliki lebih dari satu IngressClass yang ditandai sebagai default untuk cluster Anda, admission controller mencegah pembuatan objek Ingress baru yang tidak memilikiingressClassName yang ditentukan. Anda dapat menyelesaikan masalah ini dengan memastikan bahwa paling banyak 1 IngressClass ditandai sebagai default di cluster Anda.Mulailah dengan mendefinisikan IngressClass default. Namun, disarankan untuk menentukan IngressClass default:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
labels:
app.kubernetes.io/component: controller
name: nginx-example
annotations:
ingressclass.kubernetes.io/is-default-class: "true"
spec:
controller: k8s.io/ingress-nginx
Jenis-jenis Ingress
Ingress dengan satu Service
Ada konsep Kubernetes yang sudah ada yang memungkinkan Anda mengekspos satu Service (lihat alternatif). Anda juga bisa melakukan ini dengan Ingress dengan menentukan default backend tanpa aturan.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
spec:
defaultBackend:
service:
name: test
port:
number: 80
Jika Anda membuatnya menggunakan kubectl apply -f, Anda akan dapat melihat state Ingress yang Anda tambahkan:
kubectl get ingress test-ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
test-ingress external-lb * 203.0.113.123 80 59s
Di mana 203.0.113.123 adalah IP yang dialokasikan oleh Ingress controller untuk memenuhi Ingress ini.
Catatan:
Ingress controller dan load balancer mungkin membutuhkan satu atau dua menit untuk mengalokasikan alamat IP. Sampai saat itu, Anda sering melihat alamat dicantumkan sebagai<pending>.Fanout sederhana (Simple fanout)
Konfigurasi fanout mengarahkan lalu lintas dari satu alamat IP ke lebih dari satu Service, berdasarkan URI HTTP yang diminta. Ingress memungkinkan Anda untuk meminimalkan jumlah load balancer. Contoh setup seperti:
Gambar. Ingress Fan Out
Ini akan membutuhkan Ingress seperti:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: simple-fanout-example
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /foo
pathType: Prefix
backend:
service:
name: service1
port:
number: 4200
- path: /bar
pathType: Prefix
backend:
service:
name: service2
port:
number: 8080
Saat Anda membuat Ingress dengan kubectl apply -f:
kubectl describe ingress simple-fanout-example
Name: simple-fanout-example
Namespace: default
Address: 178.91.123.132
Default backend: default-http-backend:80 (10.8.2.3:8080)
Rules:
Host Path Backends
---- ---- --------
foo.bar.com
/foo service1:4200 (10.8.0.90:4200)
/bar service2:8080 (10.8.0.91:8080)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ADD 22s loadbalancer-controller default/test
Ingress controller akan menyiapkan load balancer implementasi-spesifik
yang memenuhi Ingress, selama Service (service1, service2) ada.
Setelah selesai, Anda dapat melihat alamat load balancer di field Address.
Catatan:
Tergantung pada Ingress controller yang Anda gunakan, Anda mungkin perlu membuatdefault-http-backend Service.Name based virtual hosting
Virtual host berbasis nama mendukung pengalihan traffic HTTP ke beberapa nama host pada alamat IP yang sama.
Gambar. Ingress Name-based Virtual Hosting
Ingress berikut memberitahu load balancer backing untuk merutekan permintaan berdasarkan Host header.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: name-virtual-host-ingress
spec:
rules:
- host: foo.bar.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service1
port:
number: 80
- host: bar.foo.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service2
port:
number: 80
Jika Anda membuat resource Ingress tanpa host yang didefinisikan dalam aturan, maka setiap lalu lintas web ke alamat IP dari Ingress controller Anda dapat dicocokkan tanpa memerlukan virtual host berbasis nama.
Sebagai contoh, Ingress berikut mengarahkan lalu lintas yang diminta untuk first.bar.com ke service1, second.bar.com ke service2, dan semua lalu lintas yang header host permintaannya tidak cocok dengan first.bar.com dan second.bar.com ke service3.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: name-virtual-host-ingress-no-third-host
spec:
rules:
- host: first.bar.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service1
port:
number: 80
- host: second.bar.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service2
port:
number: 80
- http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service3
port:
number: 80
TLS
Anda dapat mengamankan Ingress dengan menentukan Secret
yang berisi kunci privat TLS dan sertifikat. Resource Ingress hanya
mendukung satu port TLS, yaitu 443, dan mengasumsikan terminasi TLS pada titik Ingress
(lalu lintas ke Service dan Pod terkait dalam plaintext). Jika bagian konfigurasi TLS
dalam Ingress menentukan host yang berbeda, host-host tersebut di-multiplex pada port yang sama
berdasarkan hostname yang ditentukan melalui ekstensi TLS SNI (dengan syarat Ingress controller mendukung SNI).
Secret TLS harus memuat kunci bernama tls.crt dan tls.key yang berisi sertifikat dan kunci privat untuk digunakan bagi TLS.
For example:
apiVersion: v1
kind: Secret
metadata:
name: testsecret-tls
namespace: default
data:
tls.crt: base64 encoded cert
tls.key: base64 encoded key
type: kubernetes.io/tls
Mengacu pada secret ini dalam Ingress memberi tahu Ingress controller untuk mengamankan saluran dari client ke load balancer menggunakan TLS. Anda perlu memastikan secret TLS yang Anda buat berasal dari sertifikat yang memuat Common Name (CN), juga dikenal sebagai Fully Qualified Domain Name (FQDN) untuk https-example.foo.com.
Catatan:
Ingatlah bahwa TLS tidak akan bekerja pada aturan default karena sertifikat harus dikeluarkan untuk semua kemungkinan sub-domain. Oleh karena itu, host pada bagian TLS harus secara eksplisit cocok dengan host di bagian rules.apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-example-ingress
spec:
tls:
- hosts:
- https-example.foo.com
secretName: testsecret-tls
rules:
- host: https-example.foo.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service1
port:
number: 80
Catatan:
Fitur TLS yang didukung oleh berbagai Ingress controller bisa berbeda. Lihat dokumentasi Ingress controller yang digunakan untuk memahami cara kerja TLS di lingkungan Anda.Load balancing
Ingress controller di-bootstrapping dengan beberapa pengaturan kebijakan load balancing yang diterapkan ke semua Ingress, seperti algoritma load balancing, skema bobot backend, dan lainnya. Konsep load balancing yang lebih canggih (misalnya: persistent sessions, bobot dinamis) belum diekspos melalui Ingress. Sebagai gantinya, Anda bisa mendapatkan fitur-fitur ini melalui load balancer yang digunakan untuk Service.
Penting juga untuk dicatat bahwa meskipun pemeriksaan kesehatan (health check) tidak diekspos secara langsung melalui Ingress, ada konsep paralel di Kubernetes seperti readiness probes yang memungkinkan Anda mencapai hasil akhir yang sama. Harap tinjau dokumentasi spesifik controller untuk melihat bagaimana mereka menangani pemeriksaan kesehatan.
Memperbarui Ingress (Updating an Ingress)
Untuk menambahkan Host baru pada Ingress yang sudah ada, Anda dapat memperbaruinya dengan mengedit resource:
kubectl describe ingress test
Name: test
Namespace: default
Address: 178.91.123.132
Default backend: default-http-backend:80 (10.8.2.3:8080)
Rules:
Host Path Backends
---- ---- --------
foo.bar.com
/foo service1:80 (10.8.0.90:80)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ADD 35s loadbalancer-controller default/test
kubectl edit ingress test
Ini akan memunculkan editor dengan konfigurasi yang ada dalam format YAML. Modifikasi untuk menyertakan Host baru:
spec:
rules:
- host: foo.bar.com
http:
paths:
- backend:
service:
name: service1
port:
number: 80
path: /foo
pathType: Prefix
- host: bar.baz.com
http:
paths:
- backend:
service:
name: service2
port:
number: 80
path: /foo
pathType: Prefix
Setelah Anda menyimpan perubahan, kubectl memperbarui resource di API server, yang memberitahu Ingress controller untuk mengonfigurasi ulang load balancer.
Verifikasi ini:
kubectl describe ingress test
Name: test
Namespace: default
Address: 178.91.123.132
Default backend: default-http-backend:80 (10.8.2.3:8080)
Rules:
Host Path Backends
---- ---- --------
foo.bar.com
/foo service1:80 (10.8.0.90:80)
bar.baz.com
/foo service2:80 (10.8.0.91:80)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ADD 45s loadbalancer-controller default/test
Anda dapat mencapai hasil yang sama dengan memanggil kubectl replace -f pada file YAML Ingress yang telah dimodifikasi.
Kegagalan di seluruh Availability Zone (Failing across availability zones)
Teknik untuk menyebarkan traffic di seluruh domain kegagalan berbeda-beda antara penyedia layanan cloud. Harap periksa dokumentasi dari Ingress controller yang relevan untuk detailnya.
Alternatif (Alternatives)
Anda dapat mengekspos Service dengan berbagai cara yang tidak secara langsung melibatkan resource Ingress:
-
Gunakan Service.Type=LoadBalancer
-
Gunakan Service.Type=NodePort
Selanjutnya
-
Pelajari tentang APIIngress
-
Pelajari tentangIngress controllers