Pada game dan aplikasi peer-to-peer (P2P), klien sering memerlukan akses langsung ke pod. Alih-alih menetapkan alamat IP elastis (EIP) ke setiap pod—yang dibatasi oleh kuota EIP dan memperumit manajemen keamanan—petakan titik akhir publik ke pod melalui aturan DNAT Gateway NAT.
Prasyarat
Sebelum memulai, pastikan Anda telah:
-
Memiliki kluster ACK yang dikelola atau kluster khusus ACK dengan Terway sebagai plugin jaringan.
-
Membuat Gateway NAT Internet di VPC kluster, yang dikelola oleh pengontrol natgw.
-
Memahami cara aturan DNAT memetakan empat nilai: IP publik (EIP pada Gateway NAT), port publik (dialokasikan secara otomatis dari portRangeStart–portRangeEnd dan dicatat dalam CR PodDNAT), port privat (port pendengar pod dari anotasi), dan IP privat (IP pod). Aturan DNAT memetakan alamat IP publik dan port ke alamat IP privat dan port.
Batasan
-
Hanya didukung pada node ECS biasa, bukan instans ECI.
-
Entri DNAT dibatasi oleh kuota Gateway NAT. Lihat FAQ fitur DNAT.
Cara kerja
ack-extend-network-controller menjalankan sub-pengontrol bernama pengontrol natgw. Saat Anda menganotasi pod untuk mengaktifkan DNAT, pengontrol natgw akan:
-
Memilih EIP dari kumpulan EIP Gateway NAT.
-
Mengalokasikan port publik dari rentang yang dikonfigurasi (
portRangeStart–portRangeEnd). -
Membuat entri forward DNAT yang memetakan IP publik dan port ke IP privat dan port pod.
-
Mencatat alokasi tersebut dalam Custom Resource (CR)
PodDNATyang dinamai sesuai pod.
Setiap aturan DNAT memetakan empat nilai: alamat IP publik, port publik, alamat IP privat, dan port privat.
Pengontrol natgw secara otomatis mengalokasikan port publik dari rentang yang Anda konfigurasi. Sesuaikan ukuran rentang tersebut berdasarkan jumlah maksimum pod yang akan diekspos secara bersamaan.
Anotasi pod
Terapkan anotasi berikut pada templat pod untuk mengontrol perilaku DNAT.
| Anotasi | Deskripsi |
|---|---|
k8s.aliyun.com/pod-dnat |
Mengaktifkan DNAT untuk pod. Tetapkan ke true atau "" untuk mengaktifkan. Untuk menonaktifkan, hapus semua anotasi terkait DNAT. |
k8s.aliyun.com/pod-dnat-expose-port |
Port pendengar pod. Pisahkan beberapa port dengan koma. Contoh: "80,443". |
k8s.aliyun.com/pod-dnat-expose-protocol |
Protokol. Nilai yang valid: tcp, udp. Default: tcp. |
k8s.aliyun.com/pod-dnat-fixed |
Mengaktifkan persistensi konfigurasi untuk kontainer stateful. |
Tambahkan aturan masuk ke grup keamanan pod untuk mengizinkan traffic pada port yang terbuka. Tanpa aturan ini, traffic DNAT akan dibuang di grup keamanan.
Aktifkan DNAT di ack-extend-network-controller
Pengontrol ack-extend-network-controller memanggil OpenAPI Alibaba Cloud untuk membuat resource. Berikan izin RAM yang diperlukan, instal ack-extend-network-controller dari Marketplace, dan gunakan anotasi pod untuk membuat serta mengaitkan entri DNAT.
Pengontrol natgw memanggil API Alibaba Cloud untuk mengelola entri forward NAT. Berikan izin berdasarkan jenis kluster Anda.
Kluster ACK yang dikelola atau khusus
Pengontrol natgw menggunakan Worker RAM Role kluster. Tambahkan kebijakan kustom dengan izin berikut ke Worker RAM Role.
-
Masuk ke Konsol Manajemen Container Service. Di panel navigasi kiri, klik Konsol Manajemen Container Service Clusters.
-
Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Cluster Information.
-
Pada tab Basic Information, klik tautan di samping Worker RAM Role.
-
Buat kebijakan kustom dengan konten berikut. Lihat Langkah 1: Buat kebijakan kustom.
{ "Effect": "Allow", "Action": [ "ecs:DescribeNetworkInterfaces", "vpc:DescribeNatGateways", "vpc:DescribeForwardTableEntries", "vpc:CreateForwardEntry", "vpc:DescribeEipAddresses", "vpc:DeleteForwardEntry", "vpc:DescribeRouteTableList", "vpc:DescribeRouteEntryList" ], "Resource": ["*"], "Condition": {} } -
Lampirkan kebijakan tersebut ke Worker RAM Role. Lihat Langkah 2: Berikan izin ke Worker RAM Role.
Kluster serverless ACK
Buat pasangan Kunci Akses untuk pengguna RAM dengan izin yang setara. Lihat Buat pengguna RAM dan Buat kebijakan kustom.
Langkah 2: Instal dan konfigurasi pengontrol natgw
Instal ack-extend-network-controller dari Marketplace dan aktifkan pengontrol natgw.
Konfigurasi pengontrol natgw dengan parameter berikut:
clusterID: "c11ba338192xxxxxxx" # ID kluster Anda
regionID: "cn-hangzhou" # ID wilayah Anda
vpcID: "vpc-bp1rkq0zxxxxxx" # ID VPC Anda
enableControllers:
- natgw # Aktifkan pengontrol natgw
networkController:
natGwPool:
- natgwId: "<nat-gateway-id>" # ID Gateway NAT Internet
zoneId: "<zone-id>" # Zona Gateway NAT, contoh: cn-hangzhou-j
portRangeStart: 512 # Awal rentang port publik
portRangeEnd: 1024 # Akhir rentang port publik
eips:
- "<eip-address>" # EIP pada Gateway NAT. Jika dihilangkan, semua EIP pada gateway akan digunakan.
credential: # Untuk kluster ACK yang menggunakan Worker RAM Role, abaikan bagian ini.
accessKey: ""
accessSecret: ""
Ekspos pod dengan DNAT
Setelah pengontrol natgw berjalan, anotasi pod untuk membuat entri DNAT secara otomatis.
-
Terapkan Deployment dengan anotasi DNAT. Contoh ini mengekspos port 80 pod nginx.
apiVersion: apps/v1 kind: Deployment metadata: name: example labels: app: example spec: replicas: 1 selector: matchLabels: app: example template: metadata: labels: app: example annotations: k8s.aliyun.com/pod-dnat: "" k8s.aliyun.com/pod-dnat-expose-port: "80" spec: containers: - name: example image: nginx -
Setelah pod berjalan, pengontrol natgw membuat CR
PodDNATyang dinamai sesuai pod. Lihat alokasi tersebut:Field Deskripsi spec.externalIPAlamat IP publik Gateway NAT. Gunakan alamat ini untuk mengakses pod dari internet. spec.externalPortPort publik yang dialokasikan dari portRangeStart–portRangeEnd. Pada contoh ini:512.spec.internalIPAlamat IP privat pod. spec.portMapping[].internalPortPort pendengar pod. Pada contoh ini: 80.status.entries[].forwardEntryIdID entri forward DNAT. kubectl get poddnats -oyamlOutput yang diharapkan:
apiVersion: alibabacloud.com/v1 kind: PodDNAT metadata: creationTimestamp: "20**-09-20T03:26:44Z" finalizers: - natgw-controller generation: 2 name: example-6cd498d7b-9**** namespace: default ownerReferences: - apiVersion: v1 blockOwnerDeletion: true kind: Pod name: example-6cd498d7b-9**** uid: 7af54e1c-eeb7-4fd0-b070-ff99ddbd**** resourceVersion: "357150" uid: 2fad9bb7-cc84-46b4-b6eb-5d15f06c**** spec: eni: eni-xxx externalIP: 114.55.**.** internalIP: 172.16.**.** portMapping: - externalPort: "512" internalPort: "80" protocol: tcp tableId: ngw-xxx vswitch: vsw-xxx zoneID: cn-hangzhou-k status: entries: - externalIP: 114.55.**.** externalPort: "512" forwardEntryId: fwd-xxx internalIP: 172.16.**.** internalPort: "80" ipProtocol: tcpPod dapat diakses melalui
114.55.**.**:512.:512dari internet.
Langkah selanjutnya
-
Untuk mengekspos beberapa port, tetapkan
k8s.aliyun.com/pod-dnat-expose-portke daftar yang dipisahkan koma, misalnya"80,443". -
Untuk menggunakan UDP alih-alih TCP, tetapkan
k8s.aliyun.com/pod-dnat-expose-protocolkeudp. -
Untuk mempertahankan port publik yang sama saat pod direstart, tambahkan anotasi
k8s.aliyun.com/pod-dnat-fixed.