Untuk memungkinkan klien eksternal mengakses aplikasi gRPC yang diterapkan di dalam kluster Container Service for Kubernetes (ACK), Anda dapat mengonfigurasi NGINX Ingress dan menambahkan anotasi nginx.ingress.kubernetes.io/backend-protocol: "GRPC" untuk merutekan lalu lintas gRPC.
Contoh konfigurasi inti
Contoh berikut menunjukkan konfigurasi inti untuk secara aman mengekspos layanan gRPC menggunakan NGINX Ingress.
Proksi Protokol gRPC: Anotasi
backend-protocol: "GRPC"menginstruksikan pengontrol Ingress untuk memproksi lalu lintas menggunakan protokol gRPC, yang didasarkan pada HTTP/2, bukan protokol HTTP default.Enkripsi TLS: Transport Layer Security (TLS) diaktifkan untuk domain sampel
grpc.example.com. Lalu lintas dienkripsi menggunakan sertifikat yang disimpan dalam Secret.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: grpc-ingress
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "GRPC" # Konfigurasi utama: Tentukan bahwa layanan backend adalah gRPC
spec:
tls:
- hosts:
- grpc.example.com # Ganti dengan domain layanan gRPC Anda
secretName: nginx-ingress-tls # Secret yang berisi sertifikat TLS Anda.
rules:
- host: grpc.example.com # Ganti dengan domain layanan gRPC Anda
#...Langkah 1: Terapkan aplikasi gRPC contoh
Dapatkan kubeconfig kluster dan hubungkan ke kluster menggunakan kubectl.
Buat file bernama
grpc.yamldengan konten berikut untuk mendefinisikan layanan gRPC contoh.apiVersion: apps/v1 kind: Deployment metadata: name: grpc-service spec: replicas: 1 selector: matchLabels: run: grpc-service template: metadata: labels: run: grpc-service spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/acs-sample/grpc-server:latest imagePullPolicy: Always name: grpc-service ports: - containerPort: 50051 protocol: TCP restartPolicy: Always --- apiVersion: v1 kind: Service metadata: name: grpc-service spec: ports: - port: 50051 protocol: TCP targetPort: 50051 selector: run: grpc-service sessionAffinity: None type: NodePortLayanan didefinisikan dalam file
.protoberikut, bernamaGreeter, yang menyediakan metodeSayHello.Terapkan aplikasi gRPC.
kubectl apply -f grpc.yaml
Langkah 2: Simpan sertifikat SSL sebagai Secret
Mengaktifkan HTTP/2, yang bergantung pada gRPC, memerlukan Anda terlebih dahulu mengaktifkan enkripsi TLS untuk Ingress Anda. Simpan sertifikat SSL dan kunci privat dalam Secret untuk manajemen yang aman. Kemudian, referensikan Secret ini untuk mengonfigurasi enkripsi TLS.
Dapatkan sertifikat SSL.
Produksi: Beli sertifikat komersial dari Otoritas Sertifikat (CA) tepercaya atau Alibaba Cloud.
Pengujian: Hasilkan sertifikat tanda tangan sendiri.
(Opsional) Jika Anda membeli sertifikat dari Alibaba Cloud, unduh file sertifikat SSL.
Buat Secret Kubernetes untuk menyimpan sertifikat dan kunci privat Anda.
Konsol
Masuk ke Konsol ACK. Di bilah navigasi kiri, klik Clusters.
Di halaman Clusters, klik nama kluster yang ingin Anda ubah. Di bilah navigasi kiri, pilih .
Di halaman Secrets, pilih namespace
default, klik Create, dan konfigurasikan Secret baru di panel yang muncul. Lalu, klik OK.Key:
nginx-ingress-tlsType: TLS Certificate
Klik + Add
Key: Konten lengkap file sertifikat (
.crtatau.pem)Value: Konten lengkap file kunci privat (
.key).
kubectl
Ganti
<PUBLIC_CERT>dan<PRIVATE_KEY>dengan jalur ke file sertifikat Anda (.crtatau.pem) dan file kunci privat (.key). Lalu, jalankan perintah untuk menyimpan sertifikat dan kunci privat sebagai Secret.# Parameter --key menentukan file kunci privat, dan parameter --cert menentukan file sertifikat. kubectl create secret tls nginx-ingress-tls --cert <PUBLIC_CERT> --key <PRIVATE_KEY>
Langkah 3: Konfigurasikan Ingress untuk mengekspos Layanan
Masuk ke Konsol ACK dan klik nama kluster target. Di bilah navigasi kiri, pilih Add-ons.
Masukkan Nginx Ingress Controller di kotak pencarian. Pada kartu add-on, klik Install atau Upgrade.
Konfigurasikan Ingress. Gunakan
annotationsuntuk menentukan bahwa protokol backend adalah gRPC dan referensikan Secret yang Anda buat.Konsol
Di bilah navigasi kiri, pilih . Pilih namespace
defaultdan klik Create Ingress.Konfigurasikan Ingress dengan parameter berikut, lalu klik OK.
Gateway Type: Pilih
Nginx Ingress.Name:
grpc-ingress.Domain Name:
grpc.example.com.Mappings
Path:
/Matching Rule:
Awalan (Pencocokan Berbasis Awalan)Service:
grpc-servicePort:
50051
TLS Settings: Aktifkan opsi ini.
Domain Name:
grpc.example.comSecret:
nginx-ingress-tls
Annotations
Name:
nginx.ingress.kubernetes.io/backend-protocolValue:
GRPC
Di halaman Ingresses, lihat Ingress baru untuk mendapatkan akses Endpoint-nya.
Membutuhkan sekitar 10 detik agar NGINX Ingress berlaku. Lalu, klik tombol refresh untuk melihat informasi endpoint. Jika informasi endpoint tidak diperbarui, klik nama Ingress dan buka tab Events untuk memperbaiki masalah.
kubectl
Buat file bernama
grpc-ingress.yamldengan konten berikut.apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: grpc-ingress annotations: # Konfigurasi utama: Tentukan bahwa protokol backend adalah gRPC nginx.ingress.kubernetes.io/backend-protocol: "GRPC" spec: ingressClassName: nginx # Konfigurasikan TLS dengan mereferensikan Secret tls: - hosts: - grpc.example.com # Ganti dengan domain layanan gRPC Anda secretName: nginx-ingress-tls # Nama yang ditentukan untuk Secret yang dibuat pada langkah sebelumnya rules: - host: grpc.example.com # Ganti dengan domain layanan gRPC Anda http: paths: - path: / pathType: Prefix backend: service: name: grpc-service port: number: 50051Terapkan sumber daya Ingress.
kubectl apply -f grpc-ingress.yamlDapatkan alamat IP eksternal pengontrol Ingress. Mungkin butuh beberapa saat untuk alamat IP ditetapkan. Jika tidak ada alamat yang dikembalikan, tunggu 10 detik dan coba lagi.
ADDRESS=$(kubectl get ingress grpc-ingress -o jsonpath='{.status.loadBalancer.ingress[0].ip}') echo $ADDRESS
Langkah 4: Akses layanan gRPC
Untuk tujuan pengujian, tambahkan entri ke file
hostslokal Anda untuk memetakan domain ke alamat IP Ingress.macOS/Linux:
sudo vi /etc/hostsWindows: Buka Notepad sebagai administrator, lalu buka file di
C:\Windows\System32\drivers\etc\hosts.
Ganti
<ADDRESS>dengan Endpoint sebenarnya. Tambahkan pemetaan nama domain berikut ke akhir file dan simpan:<ADDRESS> grpc.example.comInstal grpcurl. Lalu, panggil antarmuka layanan gRPC.
grpcurl -d '{"name": "gRPC"}' grpc.example.com:443 helloworld.Greeter/SayHello{ "message": "Hello gRPC" }
Keterbatasan
Karena sifat koneksi jangka panjang gRPC, NGINX Ingress saat ini tidak mendukung perutean berdasarkan bobot layanan (service-weight) untuk backend gRPC.
Tanya Jawab Umum
Bagaimana cara menghasilkan sertifikat tanda tangan sendiri untuk pengujian?
Gunakan openssl untuk menghasilkan sertifikat tanda tangan sendiri (grpc.crt) dan kunci privat (grpc.key) yang valid selama 365 hari untuk nama domain grpc.example.com.
openssl req -x509 -newkey rsa:2048 -keyout grpc.key -out grpc.crt -days 365 -nodes \
-subj "/CN=grpc.example.com" \
-addext "subjectAltName=DNS:grpc.example.com"Sertifikat tanda tangan sendiri tidak dipercaya secara default oleh browser atau klien. Mengakses layanan yang menggunakan sertifikat tanda tangan sendiri memicu peringatan keamanan. Jangan gunakan sertifikat tanda tangan sendiri di lingkungan produksi.
Apa perbedaan antara sertifikat SSL dan sertifikat TLS?
Secure Sockets Layer (SSL) adalah protokol lama yangsudah tidak digunakan lagi dan telah digantikan oleh protokol TLS yang lebih aman.
Dalam terminologi modern, "sertifikat SSL" sering digunakan secara umum untuk merujuk pada apa yang secara teknis merupakan "sertifikat TLS".