GDCV untuk Bare Metal mendukung jaringan dual-stack IPv4/IPv6. Artinya, cluster dapat menerima traffic dari perangkat eksternal yang menggunakan Internet Protocol versi 4 (IPv4) atau Internet Protocol versi 6 (IPv6).
Jaringan dual-stack menetapkan alamat IPv4 dan IPv6 ke Pod dan node. Layanan Kubernetes dapat memiliki alamat IPv4, alamat IPv6, atau keduanya.
Semua cluster dual stack menggunakan mode datar untuk IPv6. Secara default, cluster dual-stack menggunakan mode pulau untuk IPv4, tetapi Anda dapat mengonfigurasinya agar menggunakan mode datar untuk IPv4.
Untuk membuat cluster dual-stack, jaringan dasar Anda harus mengaktifkan dual-stack. Jika jaringan yang mendasarinya adalah jaringan IPv4 atau IPv6 stack tunggal, Anda tidak dapat memulai cluster dual-stack.
Sebelum memulai
Jika node cluster Anda menjalankan CentOS atau RedHat Enterprise Linux, dan mengaktifkan SELinux, berarti di setiap node:
Di
/etc/firewalld/firewalld.conf
, tetapkanIPv6_rpfilter=no
.Jalankan
systemctl restart firewalld
.
Ringkasan pembuatan cluster dual stack
Anda dapat mengaktifkan jaringan dual-stack saat membuat cluster baru, tetapi tidak dapat mengaktifkan jaringan dual-stack untuk cluster yang ada.
Ikuti petunjuk dalam salah satu dokumen pembuatan cluster.
Dalam file konfigurasi Anda, sertakan manifes untuk hal berikut:
- Resource namespace
- Resource Cluster
- Satu atau beberapa resource NodePool
- Satu atau beberapa resource ClusterCIDRConfig
Isi manifes Namespace dan manifes NodePool seperti yang Anda lakukan untuk cluster stack tunggal.
Di manifes Cluster, di bagian clusterNetwork.services.cidrBlocks
, tentukan
rentang CIDR IPv4 dan rentang CIDR IPv6. Ini adalah kriteria yang diaktifkan untuk
cluster dual stack. Artinya, jika Anda memberikan rentang CIDR Layanan untuk IPv4 dan IPv6, cluster Anda akan memiliki jaringan dual-stack.
Di manifes Cluster, di bagian clusterNetwork.pods.cidrBlocks
, tentukan rentang CIDR IPv4, tetapi jangan tentukan rentang CIDR IPv6. Rentang CIDR IPv6 untuk Pod
ditentukan dalam manifes ClusterCIDRConfig.
Jika Anda menggunakan load balancing paket, berikan alamat IPv4 dan IPv6 di bagian loadBalancer.addressPools
manifes Cluster.
Resource ClusterCIDRConfig ditujukan untuk menentukan rentang CIDR IPv4 dan IPv6 untuk Pod. Anda dapat menggunakan satu resource ClusterCIDRConfig untuk menentukan rentang CIDR yang mencakup seluruh cluster. Artinya, alamat Pod IPv4 untuk semua node diambil dari satu rentang CIDR, dan alamat Pod IPv6 untuk semua node diambil dari rentang CIDR tunggal. Atau, Anda dapat menggunakan beberapa resource ClusterCIDRConfig untuk menentukan rentang CIDR yang berlaku untuk kumpulan node tertentu atau node tertentu.
Keterjangkauan untuk alamat IP Pod
Cluster dual-stack menggunakan mode datar untuk jaringan IPv6. Contoh yang diberikan dalam dokumen ini adalah untuk cluster yang menggunakan jaringan mode datar statis untuk IPv6. Artinya, cluster tidak dikonfigurasi untuk menggunakan Border Gateway Protocol (BGP).
Untuk cluster yang menggunakan jaringan mode datar statis, Anda harus menentukan alamat IP node dan Pod yang semuanya merupakan bagian dari subnet yang sama. Hal ini memungkinkan klien di luar cluster, tetapi dalam domain lapisan 2 (L2) yang sama dengan node cluster, untuk mengirim paket langsung ke alamat IP Pod.
Misalnya, node cluster Anda dan beberapa mesin lain semuanya berada di domain L2 yang sama. Berikut adalah salah satu cara untuk menentukan rentang alamat:
Tujuan | Rentang | Nomor alamat |
---|---|---|
Seluruh domain L2 | fd12::/108 | 2^20 |
Pod | fd12::1:0/112 | 2^16 |
Node | fd12::2:0/112 | 2^16 |
Mesin lainnya | fd12::3:0/112 | 2^16 |
VIP | fd12::4:0/112 | 2^16 |
Dalam contoh sebelumnya, berikut adalah poin-poin penting yang perlu dipahami:
Semua alamat node, Pod, dan mesin berada dalam rentang besar: fd12::/108.
Alamat IP Pod berada dalam subset rentang besar.
Alamat IP node berada di subset yang berbeda dari rentang besar.
Alamat IP komputer lain berada di subset rentang besar yang berbeda.
Semua rentang subset berbeda satu sama lain.
Pada contoh sebelumnya, setiap mesin di domain L2, termasuk node cluster, harus memiliki aturan penerusan untuk rentang besar. Contoh:
inet fd12::/108 scope global eth0
Contoh: Membuat cluster dual stack
Saat membuat cluster dual-stack, Anda memiliki berbagai opsi. Misalnya, Anda dapat memiliki rentang CIDR tingkat cluster atau memiliki rentang CIDR yang berlaku untuk kumpulan node tertentu. Anda dapat menggabungkan jaringan datar IPv6 dengan jaringan mode pulau IPv4. Atau jaringan IPv4 dan IPv6 Anda mungkin datar. Anda dapat menggunakan load balancing paket atau load balancing manual.
Bagian ini memberikan satu contoh cara membuat cluster dual stack. Cluster dalam contoh ini memiliki karakteristik berikut:
- Jaringan IPv4 dalam mode pulau
- Jaringan IPv6 dalam mode datar
- Rentang CIDR IPv4 tingkat cluster untuk Pod
- Rentang CIDR IPv6 tingkat cluster untuk Pod
- Rentang CIDR IPv4 tingkat cluster untuk Layanan
- Rentang CIDR IPv6 tingkat cluster untuk Layanan
- Kumpulan alamat IPv4 yang akan digunakan untuk Layanan jenis
LoadBalancer
- Kumpulan alamat IPv6 yang akan digunakan untuk Layanan jenis
LoadBalancer
- Load balancing paket
Untuk contoh konfigurasi tambahan, lihat Variasi terkait penggunaan ClusterCIDRConfig.
Mengisi file konfigurasi
Ikuti petunjuk dalam salah satu dokumen pembuatan cluster.
Di file konfigurasi Anda, dalam manifes Cluster
:
Untuk
clusterNetwork.pods.cidrBlocks
, berikan rentang CIDR IPv4 tunggal.Untuk
clusterNetwork.services.cidrBlocks
, berikan dua rentang CIDR: satu untuk IPv4 dan satu untuk IPv6.Untuk
loadBalancer.addressPools
, berikan dua rentang alamat: satu untuk IPv4 dan satu untuk IPv6. Saat Anda membuat Service dari jenisLoadBalancer
, alamat IP eksternal untuk Layanan akan dipilih dari rentang ini.
Berikut adalah contoh yang menunjukkan bagian manifes Cluster yang relevan:
apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: "dual-stack" namespace: "cluster-dual-stack" spec: clusterNetwork: pods: cidrBlocks: - "192.168.0.0/16" services cidrBlocks: - "172.16.0.0/20" - "fd12::5:0/116" ... loadBalancer: mode: "bundled" ... addressPools: - name: "pool-1" addresses: - "10.2.0.212-10.2.0.221" - "fd12::4:101-fd12::4:110"
Dalam file konfigurasi yang sama, sertakan manifes untuk ClusterCIDRConfig
.
Tetapkan
ipv4.cidr
ke rentang CIDR yang sama dengan yang Anda berikan di manifesCluster
. Ini adalah persyaratan jika IPv4 berada dalam mode pulau.Setel
namespace
ke nilai yang sama dengan yang Anda berikan dalam manifesCluster
.Tetapkan
ipv6.cidr
ke rentang CIDR IPv6 untuk Pod.Untuk setiap rentang CIDR, berikan nilai bagi
perNodeMaskSize
untuk menentukan jumlah alamat Pod yang akan ditetapkan ke setiap node. Jumlah alamat IPv4 yang ditetapkan ke setiap node harus sama dengan jumlah alamat IPv6 yang ditetapkan ke setiap node. Anda harus menetapkan nilai Anda untukperNodeMaskSize
sebagaimana mestinya. Misalnya, jika Anda menginginkan 2^8 alamat per node, tetapkan nilaiperNodeMaskSize
sebagai berikut:ipv4.perNodeMaskSize: 24
# (32 - 8 = 24)ipv6.perNodeMaskSize: 120
# (128 - 8 = 120)
Berikut adalah contoh manifes ClusterCIDRConfig:
apiVersion: baremetal.cluster.gke.io/v1alpha1 kind: ClusterCIDRConfig metadata: name: "cluster-wide-ranges" namespace: "cluster-dual-stack" # Must be the same as the Cluster namespace. spec: ipv4: cidr: "192.168.0.0/16" # For island mode, must be the same as the Cluster CIDR. perNodeMaskSize: 24 ipv6: cidr: "fd12::1:0/112" perNodeMaskSize: 120
Dalam contoh sebelumnya:
Rentang CIDR Pod IPv4 memiliki 2^(32-16) = 2^16 alamat. Ukuran mask per node adalah 24, sehingga jumlah alamat yang ditetapkan ke setiap node adalah 2^(32-24) = 2^8.
Rentang CIDR Pod IPv6 memiliki 2^(128-112) = 2^16 alamat. Ukuran mask per node adalah 120, sehingga jumlah alamat yang ditetapkan ke setiap node adalah 2^(128-120) = 2^8.
Contoh file konfigurasi
Selesaikan pembuatan cluster
Selesaikan pembuatan cluster seperti yang dijelaskan dalam dokumen pembuatan cluster.
Melihat node cluster dan Pod
Buat daftar node cluster:
kubectl --kubeconfig CLUSTER_KUBECONFIG get nodes --output yaml
Ganti CLUSTER_KUBECONFIG
dengan jalur file kubeconfig
cluster Anda.
Di output, Anda dapat melihat alamat IPv4 dan IPv6 dari setiap node. Anda juga dapat melihat rentang alamat IPv4 dan IPv6 untuk Pod di node tersebut. Contoh:
- apiVersion: v1 kind: Node ... spec: podCIDR: 192.168.1.0/24 podCIDRs: - 192.168.1.0/24 - fd12::1:100/120 providerID: baremetal://10.2.0.5 status: addresses: - address: 10.2.0.5 type: InternalIP - address: fd12::2:5 type: InternalIP
Buat daftar Pod dalam cluster:
kubectl --kubeconfig CLUSTER_KUBECONFIG get pods --all-namespaces
Pilih satu Pod, lalu cantumkan detailnya. Contoh:
kubectl --kubeconfig CLUSTER_KUBECONFIG get pod gke-metrics-agent-b9qrv \ --namespace kube-system \ -- output yaml
Di output, Anda dapat melihat alamat IPv4 dan IPv6 Pod. Contoh:
apiVersion: v1 kind: Pod metadata: ... name: gke-metrics-agent-b9qrv namespace: kube-system ... status: ... podIPs: - ip: 192.168.1.146 - ip: fd12::1:11a
Variasi tentang penggunaan ClusterCIDRConfig
Contoh sebelumnya menggunakan objek ClusterCIDRConfig untuk menentukan rentang CIDR Pod seluruh cluster. Artinya, satu rentang CIDR IPv4 digunakan untuk semua Pod di cluster tersebut. Selain itu, satu rentang CIDR IPv6 akan digunakan untuk semua Pod di cluster.
Dalam situasi tertentu, Anda mungkin tidak ingin menggunakan rentang CIDR tunggal untuk semua Pod dalam cluster. Misalnya, Anda mungkin ingin menentukan rentang CIDR terpisah untuk setiap kumpulan node, atau menentukan rentang CIDR terpisah untuk setiap node. Untuk mengetahui informasi selengkapnya tentang ClusterCIDRConfig dan contoh penggunaannya, lihat Memahami resource kustom ClusterCIDRConfig.
Misalnya, ClusterCIDRConfig berikut menentukan rentang CIDR untuk kumpulan
node bernama "workers"
.
apiVersion: baremetal.cluster.gke.io/v1alpha1 kind: ClusterCIDRConfig metadata: name: "worker-pool-ccc" namespace: "cluster-dual-stack" spec: ipv4: cidr: "192.168.0.0/16" perNodeMaskSize: 24 ipv6: cidr: "fd12::1:0/112" perNodeMaskSize: 120 nodeSelector: matchLabels: baremetal.cluster.gke.io/node-pool: "workers"
ClusterCIDRConfig berikut menentukan rentang CIDR untuk satu node yang memiliki alamat IP 10.2.0.5:
apiVersion: baremetal.cluster.gke.io/v1alpha1 kind: ClusterCIDRConfig metadata: name: "range-node1" namespace: "cluster-dual-stack" spec: ipv4: cidr: "192.168.1.0/24" perNodeMaskSize: 24 ipv6: cidr: "fd12::1:0/120" perNodeMaskSize: 120 nodeSelector: matchLabels: baremetal.cluster.gke.io/k8s-ip: "10.2.0.5"
Membuat Layanan dual-stack jenis ClusterIP
Berikut manifes untuk Deployment:
apiVersion: apps/v1 kind: Deployment metadata: name: "my-deployment" spec: selector: matchLabels: app: "try-dual-stack" replicas: 3 template: metadata: labels: app: "try-dual-stack" spec: containers: - name: "hello" image: "us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0"
Simpan manifes dalam file bernama my-deployment.yaml
, lalu buat Deployment:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-deployment.yaml
Ganti CLUSTER_KUBECONFIG
dengan jalur file kubeconfig
cluster Anda.
Berikut manifes untuk Service jenis ClusterIP
:
apiVersion: v1 kind: Service metadata: name: "my-service" spec: selector: app: "try-dual-stack" type: "ClusterIP" ipFamilyPolicy: "RequireDualStack" ipFamilies: - "IPv6" - "IPv4" ports: - port: 80 targetPort: 8080
Dalam konteks latihan ini, berikut adalah poin-poin utama yang harus dipahami tentang manifes Layanan sebelumnya:
Kolom
ipFamilyPolicy
ditetapkan keRequireDualStack
. Ini berarti alamatClusterIP
IPv6 dan IPv4 dialokasikan untuk Layanan.Kolom
ipFamilies
menentukan keluarga IPv6 terlebih dahulu dan keluarga IPv4 kedua. Artinya,spec.ClusterIP
untuk Layanan akan menjadi alamat IPv6 yang dipilih dariclusterNetwork.services.cidrBlocks
di manifes Cluster.
Simpan manifes dalam file bernama my-cip-service.yaml
, lalu buat Layanan:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-cip-service.yaml
Detail daftar tentang Layanan:
kubectl --kubeconfig CLUSTER_KUBECONFIG get service my-service --output yaml
Pada output, Anda dapat melihat alamat IP cluster untuk Layanan. Misalnya:
apiVersion: v1 kind: Service metadata: name: my-service … spec: clusterIP: fd12::5:9af clusterIPs: - fd12::5:9af - 172.16.12.197
Pada node cluster, panggil Service:
curl IPV4_CLUSTER_IP curl [IPV6_CLUSTER_IP]
Output akan menampilkan pesan "Hello world":
Hello, world! Version: 2.0.0 Hostname: my-deployment-xxx
Membuat Layanan dual-stack jenis LoadBalancer
Berikut manifes untuk Service jenis LoadBalancer
:
apiVersion: v1 kind: Service metadata: name: "my-lb-service" spec: selector: app: "try-dual-stack" type: "LoadBalancer" ipFamilyPolicy: "RequireDualStack" ipFamilies: - "IPv6" - "IPv4" ports: - port: 80 targetPort: 8080
Simpan manifes dalam file bernama my-lb-service.yaml
, lalu buat Layanan:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-lb-service.yaml
Ingat bahwa dalam manifes Cluster, Anda menentukan rentang alamat IPv6 dan rentang alamat IPv4 yang akan digunakan untuk Layanan jenis LoadBalancer
:
loadBalancer: mode: "bundled" ... addressPools: - name: "pool-1" addresses: - "10.2.0.112-10.2.0.221" - "fd12::4:101-fd12::4:110"
Layanan Anda akan mendapatkan alamat IPv4 eksternal yang dipilih dari rentang IPv4 dan alamat IPv6 eksternal yang dipilih dari rentang IPv6.
Detail daftar untuk Layanan:
kubectl --kubeconfig CLUSTER_KUBECONFIG get service my-lb-service --output yaml
Di output, Anda dapat melihat alamat eksternal untuk Layanan. Contoh:
apiVersion: v1 kind: Service metadata: name: my-lb-service ... status: loadBalancer: ingress: - ip: 10.2.0.213 - ip: fd12::4:101
Nilai yang mungkin untuk ipFamilyPolicy
Saat membuat Layanan dual stack, Anda dapat menetapkan ipFamilyPolicy
ke salah satu
nilai berikut:
SingleStack
: Pengontrol mengalokasikan alamat IP cluster untuk Layanan, yang dipilih dari rentang pertama yang ditentukan dalam manifes Cluster di bagianclusterNetwork.services.cidrBlocks
.PreferDualStack
: Pengontrol mengalokasikan alamat IP cluster IPv4 dan IPv6 untuk Layanan, yang dipilih dari rentang yang ditentukan dalam manifes Cluster di bagianclusterNetwork.services.cidrBlocks
. Jika cluster bukan merupakan cluster dua stack, perilakunya sama sepertiSingleStack
.RequireDualStack
: Pengontrol mengalokasikan alamat IP cluster IPv4 dan IPv6 untuk Layanan, yang dipilih dari rentang yang ditentukan dalam manifes Cluster di bagianclusterNetwork.services.cidrBlocks
. Ini menetapkan nilaispec.clusterIP
berdasarkan kelompok alamat pertama yang ditentukan dalam manifes Layanan di bagianipFamilies
.
Informasi selengkapnya
Untuk informasi selengkapnya tentang cara membuat Layanan dual stack, lihat Opsi dual stack di Layanan baru.