Konfigurasikan resource Sidecar agar Pod lain dalam kluster dapat mengakses aplikasi yang mendengarkan pada localhost melalui Service.
Mengapa Pod lain tidak dapat mengakses aplikasi localhost
localhost adalah alamat loopback yang hanya dapat dijangkau dari dalam Pod yang sama. Ketika sebuah aplikasi yang dideploy di kluster mendengarkan pada localhost, Pod lain dalam kluster tidak dapat mengaksesnya, meskipun port service aplikasi tersebut telah diekspos melalui Service.
Contoh berikut menunjukkan cara aplikasi yang ditulis dalam berbagai bahasa mendengarkan pada localhost:
Golang:
net.Listen("tcp", "localhost:8080")Node.js:
http.createServer().listen(8080, "localhost")Python:
socket.socket().bind(("localhost", 8083))
Pilih opsi
Tersedia dua opsi untuk mengekspos aplikasi Anda. Pilih salah satu berdasarkan apakah Anda dapat memodifikasi kode aplikasi:
Opsi 1 — Ubah alamat jaringan tempat aplikasi mendengarkan. Pilih opsi ini jika Anda dapat memodifikasi kode aplikasi.
Opsi 2 — Gunakan Service Mesh (ASM) untuk mengekspos aplikasi yang mendengarkan pada localhost. Pilih opsi ini jika Anda tidak ingin memodifikasi kode aplikasi.
Opsi 1: Ubah alamat jaringan tempat aplikasi mendengarkan
Untuk mengekspos aplikasi Anda, modifikasi kode aplikasi agar mendengarkan pada 0.0.0.0, bukan localhost.
Opsi 2: Gunakan ASM untuk mengekspos aplikasi yang mendengarkan pada localhost
Buat resource Sidecar di Konsol ASM. Resource Sidecar akan mengintersepsi permintaan inbound ke Pod yang Anda pilih dan meneruskan permintaan tersebut ke aplikasi Anda di localhost.
Ikuti langkah-langkah berikut:
-
Masuk ke Konsol ASM. Di panel navigasi kiri, pilih .
-
Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih . Pada halaman yang muncul, klik Create from YAML.
Pada halaman Create, pilih Namespaces dan Scenario Template yang sesuai, konfigurasikan YAML berikut, lalu klik Create.
apiVersion: networking.istio.io/v1beta1 kind: Sidecar metadata: name: localhost-access namespace: {namespace} spec: ingress: - defaultEndpoint: '127.0.0.1:{container_port}' port: name: tcp number: {port} protocol: TCP workloadSelector: labels: {key}: {value}Ganti parameter berikut dengan nilai aktual Anda:
Parameter
Deskripsi
{namespace}Namespace tempat aplikasi dideploy.
{container_port}Port container tempat aplikasi mendengarkan pada localhost.
{port}Port Service aplikasi.
{key}: {value}Label yang memilih Pod aplikasi.
Konfigurasi di atas hanya berlaku untuk Pod yang memiliki label yang didefinisikan di bawah workloadSelector, dan hanya mengekspos satu port TCP yang didefinisikan di bawah ingress.