Halaman ini menunjukkan cara menyiapkan Service Steering untuk Pod Anda.
Untuk memahami cara kerja Service Steering, lihat Cara kerja Service Steering.
Persyaratan
- GKE versi 1.30 atau yang lebih baru.
Batasan
ServiceFunctionChain
dapat memiliki maksimal satu Fungsi Layanan.- Sebaiknya gunakan maksimum 100 node ditambah 10 pasangan
ServiceFunctionChain
danTrafficSelector
. - GKE Service Steering hanya tersedia dengan node yang menjalankan image node Container-Optimized OS.
- GKE Service Steering hanya mendukung alamat IP ekspor dan tujuan.
- Service Steering tidak menangani konflik yang muncul saat beberapa Pemilih Lalu Lintas dengan panjang awalan yang sama diterapkan ke subjek yang sama. Untuk menghindari konflik, desain Pemilih Traffic secara proaktif dengan rentang alamat IP yang tidak tumpang-tindih dan kriteria pemilihan yang ditentukan dengan jelas.
Mengimplementasikan Pengarahan Layanan
GKE Service Steering memungkinkan Anda menyesuaikan dan mengontrol alur traffic jaringan dalam cluster. Bagian ini menunjukkan cara menerapkan Pengarah Layanan menggunakan contoh Gateway web.
Pertimbangkan kasus penggunaan saat Anda ingin membuat Gateway web yang mengamankan traffic dari perangkat klien pengguna akhir ke internet. Terminator VPN menarik traffic ke Gateway terkelola menggunakan tunnel aman. Traffic pengguna akhir dialihkan ke firewall, lalu ke proxy. Proxy melakukan Penafsiran Alamat Jaringan Sumber (SNAT) pada traffic, menyamarkan alamat sumber asli, dan mengirimkannya ke internet.
Untuk menerapkan GKE Service Steering, lakukan hal berikut:
- Buat VPC dengan MTU 8896.
- Membuat cluster GKE.
- Buat Pod dan Layanan Fungsi Layanan.
- Buat
ServiceFunctionChain
. - Buat resource
TrafficSelector
yang mereferensikanServiceFunctionChain
.
Sebelum memulai
Sebelum memulai, pastikan Anda telah menjalankan tugas berikut:
- Aktifkan Google Kubernetes Engine API. Aktifkan Google Kubernetes Engine API
- Jika ingin menggunakan Google Cloud CLI untuk tugas ini,
instal lalu
lakukan inisialisasi
gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan
gcloud components update
.
Tinjau persyaratan dan batasan.
Harga
Fitur Network Function Optimizer (NFO) berikut hanya didukung di cluster yang berada dalam Project yang diaktifkan dengan GKE Enterprise:
- Dukungan multi-jaringan untuk Pod
- Dukungan alamat IP persisten untuk Pod (Pratinjau)
- Kebijakan jaringan multi-jaringan (Pratinjau)
- Dukungan Service Steering untuk Pod (Pratinjau)
Untuk memahami tagihan yang berlaku untuk mengaktifkan edisi Google Kubernetes Engine (GKE) Enterprise, lihat Harga GKE Enterprise.
Menyiapkan VPC
Siapkan VPC. Service Steering menggunakan enkapsulasi untuk mengalihkan traffic ke Service Function yang sesuai. Enkapsulasi melibatkan penambahan header tambahan ke setiap paket, yang akan meningkatkan ukuran paket. Pengarah Layanan tidak memerlukan konfigurasi khusus di VPC. Saat menyiapkan VPC, sebaiknya saat menentukan ukuran MTU, Anda memperhitungkan overhead enkapsulasi. Untuk mengetahui informasi selengkapnya, lihat Jaringan VPC dengan MTU yang ditentukan.
Perintah berikut menetapkan ukuran mtu di VPC Anda:
gcloud compute networks create VPC_NETWORK_NAME --mtu=8896
Ganti VPC_NETWORK_NAME
dengan nama jaringan VPC yang berisi subnet.
Membuat cluster GKE
Untuk mengaktifkan kemampuan pengelolaan alamat IP dan perutean jaringan lanjutan yang diperlukan untuk menerapkan Service Steering di GKE, create cluster GKE yang mengaktifkan GKE Dataplane V2 sebagai berikut:
gcloud container clusters create CLUSTER_NAME \
--network VPC_NAME \
--release-channel RELEASE_CHANNEL \
--cluster-version CLUSTER_VERSION \
--enable-dataplane-v2 \
--enable-ip-alias
Ganti kode berikut:
CLUSTER_NAME
: nama cluster.VPC_NAME
: nama VPC yang ingin Anda kaitkan dengan cluster.RELEASE_CHANNEL
: nama saluran rilis.VERSION
: versi GKE, yang harus versi 1.30 atau yang lebih baru. Anda juga dapat menggunakan flag--release-channel
untuk memilih saluran rilis. Saluran rilis harus memiliki versi default 1.30 atau yang lebih baru.
Membuat Pod ServiceFunction
Untuk membuat Rantai Layanan, deploy Pod terminator VPN dan Pod Fungsi Layanan yang diperlukan dalam cluster Anda. Pod mengenkapsulasi aplikasi dalam container yang menjalankan fungsi jaringan Anda.
Pod terminator VPN sering kali merupakan Fungsi Layanan pertama dalam rantai, yang menghentikan traffic yang masuk ke cluster melalui VPN. Kemudian, fungsi ini mengarahkan Fungsi Layanan lainnya seperti firewall dan load balancing untuk pemrosesan lebih lanjut sebelum mencapai tujuan akhir.
Contoh file konfigurasi berikut menentukan tiga komponen berikut yang penting untuk pengelolaan traffic jaringan dalam cluster:
- Pod VPN: membuat endpoint Virtual Private Network (VPN) dalam cluster Anda, yang memungkinkan komunikasi aman dan terenkripsi antara cluster dan jaringan eksternal.
- Deployment firewall: Men-deploy beberapa replika Pod firewall, yang menyediakan keamanan dan load balancing.
- Proxy DaemonSet: Men-deploy Pod proxy di setiap node cluster Anda, yang memastikan traffic jaringan dapat diproses secara lokal sebelum diteruskan ke layanan lain seperti firewall.
Simpan manifes contoh berikut sebagai service_function.yaml
:
apiVersion: v1
kind: Pod
name: vpn
namespace: vpn
labels:
app: vpn
spec:
containers:
- name: vpn
image: openvpn
ports:
- containerPort: 51820
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: firewall
namespace: firewall
spec:
replicas: 3
selector:
matchLabels:
app: firewall
template:
metadata:
labels:
app: firewall
spec:
containers:
- name: firewall
image: firewall
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: proxy
namespace: proxy
spec:
selector:
matchLabels:
app: proxy
template:
metadata:
labels:
app: proxy
spec:
containers:
- name: proxy
image: proxy
Terapkan manifes:
kubectl apply -f service_function.yaml
Membuat ServiceFunctionChains
Untuk menentukan urutan fungsi jaringan yang akan dilalui traffic, buat pipeline tempat setiap fungsi seperti firewall, proxy, dan load balancer melakukan tugas spesifiknya sebelum meneruskan traffic ke fungsi berikutnya.
Simpan manifes contoh berikut sebagai ServiceFunctionChain.yaml
:
apiVersion: networking.gke.io/v1
kind: ServiceFunctionChain
metadata:
name: firewall
spec:
sessionAffinity:
clientIpNoDestination:
timeoutSeconds: 3600 # 1hr
serviceFunctions:
- name: firewall
namespace: firewall
podSelector:
matchLabels:
app: firewall
---
apiVersion: networking.gke.io/v1
kind: ServiceFunctionChain
metadata:
name: proxy
spec:
sessionAffinity:
clientIpNoDestination: {}
serviceFunctions:
- name: proxy
namespace: proxy
podSelector:
matchLabels:
app: proxy
Terapkan manifes:
kubectl apply -f ServiceFunctionChain.yaml
Fungsi Layanan ditentukan secara inline dalam ServiceFunctionChain
menggunakan
kolom serviceFunctions
. Fungsi Layanan adalah pemilih endpoint.
Membuat resource TrafficSelector
Untuk menentukan tempat dan traffic mana yang dipilih untuk Service Steering, buat resource TrafficSelector
yang mereferensikan ServiceFunctionChains
untuk diterapkan ke traffic yang dipilih.
Simpan manifes contoh berikut sebagai TrafficSelector.yaml
:
apiVersion: networking.gke.io/v1
kind: TrafficSelector
metadata:
name: vpn-to-firewall
spec:
serviceFunctionChain: firewall
subject:
pods:
namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: vpn
podSelector:
matchLabels:
app: vpn
egress:
to:
ipBlock:
cidr: 0.0.0.0/0
ports:
- allPorts:
protocol: UDP
- allPorts:
protocol: TCP
---
apiVersion: networking.gke.io/v1
kind: TrafficSelector
metadata:
name: firewall-to-proxy
spec:
serviceFunctionChain: proxy
subject:
pods:
namespaceSelector:
kubernetes.io/metadata.name: firewall
podSelector:
app: firewall
egress:
to:
ipBlock:
cidr: 0.0.0.0/0
ports:
- allPorts:
protocol: UDP
- allPorts:
protocol: TCP
Terapkan manifes:
kubectl apply -f TrafficSelector.yaml
Memecahkan masalah Pengarahan Layanan
Bagian ini menunjukkan cara menyelesaikan masalah terkait GKE Service Steering.
Traffic jaringan tidak mengalir
Anda dapat melakukan tindakan berikut untuk men-debug masalah:
Langkah 1: Pastikan servicePathId
disetel di ServiceFunctionChain
Pastikan servicePathId
ditetapkan di ServiceFunctionChain
. Setiap
objek ServiceFunctionChain
diberi servicePathId
unik seperti yang ditunjukkan dalam
contoh berikut:
apiVersion: networking.gke.io/v1
kind: ServiceFunctionChain
metadata:
name: firewall
spec:
serviceFunctions:
- name: firewall
namespace: firewall
podSelector:
matchLabels:
app: firewal
status:
servicePathId: 1
Langkah 2: Pastikan Layanan Kubernetes dibuat per Fungsi Layanan
Layanan ClusterIP dibuat secara otomatis untuk setiap Fungsi Layanan. Anda dapat
melihat daftar layanan menggunakan kubectl
:
kubectl get svc -A -l networking.gke.io/managed-by=service-steering-controller.gke.io
Langkah 3: Pastikan bahwa untuk setiap Fungsi Layanan, entri peta bpf dibuat di setiap node untuk menyimpan alamat IP Layanan
Untuk setiap Fungsi Layanan, entri peta bpf dibuat di setiap node untuk menyimpan alamat IP Layanan.
Dapatkan nama Pod anetd
:
kubectl get pods -n kube-system -o wide -l k8s-app=cilium
Catat nama Pod yang mirip dengan anetd
.
Jalankan perintah berikut:
kubectl -n kube-system exec -it ANETD-POD-NAME -- cilium bpf sfcpath list
Ganti ANETD-POD-NAME
dengan nama Pod anetd
.
Outputnya mirip dengan hal berikut ini:
PATH SERVICE FUNCTION ADDRESS
(1, 1) 10.4.10.124
Langkah 4: Pastikan entri peta bpf dibuat di peta sfcselect
Pada node, jika ada Pod yang dipilih oleh TrafficSelector
, entri peta bpf
akan dibuat di peta sfcselect
. Contoh berikut menunjukkan bahwa traffic TCP/UDP
dari port endpoint (Pod) 3783 ke alamat IP tujuan 10.0.2.12 diarahkan ke
ServiceFunctionChain
.
Jalankan perintah berikut:
kubectl -n kube-system exec -it ANETD-POD-NAME -- cilium bpf sfcselect list
Ganti ANETD-POD-NAME
dengan nama sebenarnya dari Pod anetd di cluster Anda.
Outputnya mirip dengan hal berikut ini:
SELECTOR PATH
3783, egress, 0/TCP, 10.0.2.12/32 /32 (1, 1)
3783, egress, 0/UDP, 10.0.2.12/32 /32 (1, 1)
Langkah 5: Gunakan tcpdump di port 7081 untuk menangkap dan menganalisis traffic jaringan
Service Steering melakukan enkapsulasi Geneve di port UDP 7081. Anda dapat menggunakan tcpdump di node yang relevan untuk menganalisis aliran traffic dan menentukan tempat terjadinya masalah.
Langkah selanjutnya
- Baca Tentang dukungan multi-jaringan untuk Pod
- Baca Tentang Pengarah Layanan
- Baca Menyiapkan dukungan multi-jaringan untuk Pod