Jaringan stack ganda di Google Distributed Cloud memungkinkan cluster Anda menerima traffic dari perangkat eksternal yang menggunakan IPv4 atau IPv6. Pod dan node mendapatkan alamat IPv4 dan IPv6, dan Service Kubernetes dapat memiliki alamat IPv4, alamat IPv6, atau keduanya.
Cluster stack ganda selalu menggunakan mode datar untuk IPv6. Untuk IPv4, cluster dual-stack menggunakan mode island secara default, tetapi Anda dapat mengonfigurasi mode flat. Untuk membuat cluster stack ganda, jaringan yang mendasarinya harus mengaktifkan stack ganda. Anda tidak dapat memulai cluster stack ganda di jaringan IPv4 atau IPv6 stack tunggal.
Sebelum memulai
Jika node cluster Anda menjalankan RedHat Enterprise Linux, dan SELinux diaktifkan, maka di setiap node:
Di
/etc/firewalld/firewalld.conf, tetapkanIPv6_rpfilter=no.Jalankan
systemctl restart firewalld.
Ringkasan pembuatan cluster stack ganda
Anda dapat mengaktifkan jaringan stack ganda saat membuat cluster baru, tetapi Anda tidak dapat mengaktifkan jaringan stack ganda untuk cluster yang sudah ada.
Ikuti petunjuk di 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.
Dalam manifes Cluster, di bagian clusterNetwork.services.cidrBlocks, tentukan rentang CIDR IPv4 dan rentang CIDR IPv6. Ini adalah kriteria pengaktifan untuk cluster stack ganda. Artinya, jika Anda menyediakan rentang CIDR Service untuk IPv4 dan IPv6, cluster Anda akan memiliki jaringan stack ganda.
Dalam 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 yang dipaketkan, berikan alamat IPv4 dan IPv6 di bagian loadBalancer.addressPools pada manifes Cluster.
Resource ClusterCIDRConfig digunakan untuk menentukan rentang CIDR IPv4 dan IPv6 untuk Pod. Anda dapat menggunakan satu resource ClusterCIDRConfig untuk menentukan rentang CIDR
yang berlaku di seluruh cluster. Artinya, alamat Pod IPv4 untuk semua node diambil dari satu rentang CIDR, dan alamat Pod IPv6 untuk semua node diambil dari satu rentang CIDR. Atau, Anda dapat menggunakan beberapa resource ClusterCIDRConfig untuk menentukan rentang CIDR yang berlaku untuk node pool atau node tertentu.
Keterjangkauan untuk alamat IP Pod
Cluster stack ganda 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. Konfigurasi ini memungkinkan klien di luar cluster, tetapi dalam domain Lapisan 2 yang sama dengan node cluster, untuk mengirim paket langsung ke alamat IP Pod.
Misalnya, node cluster Anda dan beberapa mesin lainnya berada di domain Lapisan 2 yang sama. Berikut adalah salah satu cara untuk menentukan rentang alamat:
| Tujuan | Rentang | Nomor alamat |
|---|---|---|
| Seluruh domain Lapisan 2 | fd12::/108 | 220 |
| Pod | fd12::1:0/112 | 216 |
| Node | fd12::2:0/112 | 216 |
| Mesin lainnya | fd12::3:0/112 | 216 |
| VIP | fd12::4:0/112 | 216 |
Dalam contoh sebelumnya, berikut adalah poin-poin penting yang perlu dipahami:
Semua alamat node, Pod, dan mesin berada dalam rentang yang besar:
fd12::/108.Alamat IP Pod berada dalam subset rentang yang besar.
Alamat IP node berada dalam subset yang berbeda dari rentang yang besar.
Alamat IP mesin lain berada dalam subset yang berbeda dari rentang yang besar.
Semua rentang subset berbeda satu sama lain.
Pada contoh sebelumnya, setiap mesin di domain Lapisan 2, termasuk node cluster, harus memiliki aturan penerusan untuk rentang yang besar. Contoh:
inet fd12::/108 scope global eth0
Contoh: Membuat cluster stack ganda
Saat membuat cluster dual-stack, Anda memiliki berbagai opsi. Misalnya, Anda dapat memiliki rentang CIDR di seluruh cluster atau rentang CIDR yang berlaku untuk node pool tertentu. Anda dapat menggabungkan jaringan IPv6 datar dengan jaringan mode pulau IPv4. Atau, jaringan IPv4 dan IPv6 Anda bisa saja datar. Anda dapat menggunakan load balancing yang dipaketkan 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 di seluruh cluster untuk Pod
- Rentang CIDR IPv6 di seluruh cluster untuk Pod
- Rentang CIDR IPv4 di seluruh cluster untuk Service
- Rentang CIDR IPv6 di seluruh cluster untuk Service
- Kumpulan alamat IPv4 yang akan digunakan untuk Service jenis
LoadBalancer - Kumpulan alamat IPv6 yang akan digunakan untuk Service jenis
LoadBalancer - Load balancing paket
Untuk contoh konfigurasi tambahan, lihat Variasi dalam menggunakan ClusterCIDRConfig.
Mengisi file konfigurasi
Ikuti petunjuk di salah satu dokumen pembuatan cluster.
Dalam file konfigurasi, di manifes Cluster:
Untuk
clusterNetwork.pods.cidrBlocks, berikan satu rentang CIDR IPv4.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 jenisLoadBalancer, alamat IP eksternal untuk Service dipilih dari rentang ini.
Berikut adalah contoh yang menunjukkan bagian yang relevan dari manifes Cluster:
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.cidrke rentang CIDR yang sama dengan yang Anda berikan dalam manifesCluster. Hal ini merupakan persyaratan jika IPv4 berada dalam mode island.Tetapkan
namespaceke nilai yang sama dengan yang Anda berikan dalam manifesCluster.Tetapkan
ipv6.cidrke rentang CIDR IPv6 untuk Pod.Untuk setiap rentang CIDR, berikan nilai untuk
perNodeMaskSizeguna 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 untukperNodeMaskSizedengan tepat. Misalnya, jika Anda menginginkan 28 alamat per node, tetapkan nilaiperNodeMaskSizesebagai 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 Pod CIDR IPv4 memiliki 2(32-16) = 216 alamat. Ukuran mask per node adalah 24, sehingga jumlah alamat yang ditetapkan ke setiap node adalah 2(32-24) = 28.
Rentang Pod CIDR IPv6 memiliki 2(128-112) = 216 alamat. Ukuran mask per node adalah 120, sehingga jumlah alamat yang ditetapkan ke setiap node adalah 2(128-120) = 28.
Contoh file konfigurasi
Menyelesaikan pembuatan cluster
Selesaikan pembuatan cluster seperti yang dijelaskan dalam dokumen pembuatan cluster.
Melihat node dan Pod cluster
Cantumkan node cluster:
kubectl --kubeconfig CLUSTER_KUBECONFIG get nodes --output yaml
Ganti CLUSTER_KUBECONFIG dengan jalur file kubeconfig cluster Anda.
Dalam output, Anda dapat melihat alamat IPv4 dan IPv6 setiap node. Anda juga dapat melihat rentang alamat IPv4 dan IPv6 untuk Pod di node. 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
Cantumkan Pod di cluster:
kubectl --kubeconfig CLUSTER_KUBECONFIG get pods --all-namespaces
Pilih satu Pod, dan cantumkan detailnya. Contoh:
kubectl --kubeconfig CLUSTER_KUBECONFIG get pod gke-metrics-agent-b9qrv \ --namespace kube-system \ -- output yaml
Dalam 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 penggunaan ClusterCIDRConfig
Contoh sebelumnya menggunakan objek ClusterCIDRConfig untuk menentukan rentang Pod CIDR di seluruh cluster. Artinya, satu rentang CIDR IPv4 digunakan untuk semua Pod dalam cluster. Satu rentang CIDR IPv6 digunakan untuk semua Pod dalam cluster.
Dalam situasi tertentu, Anda mungkin tidak ingin menggunakan satu rentang CIDR untuk semua Pod dalam cluster. Misalnya, Anda mungkin ingin menentukan rentang CIDR terpisah untuk setiap node pool, atau Anda mungkin ingin 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 node pool 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 Service stack ganda 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 penting yang perlu dipahami tentang manifes Service sebelumnya:
Kolom
ipFamilyPolicyditetapkan keRequireDualStack. Artinya, alamatClusterIPIPv6 dan IPv4 dialokasikan untuk Service.Kolom
ipFamiliesmenentukan kelompok IPv6 terlebih dahulu, lalu kelompok IPv4. Artinya,spec.ClusterIPuntuk Service akan berupa alamat IPv6 yang dipilih dariclusterNetwork.services.cidrBlocksdalam manifes Cluster.
Simpan manifes dalam file bernama my-cip-service.yaml, lalu buat Service:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-cip-service.yaml
Cantumkan detail tentang Service:
kubectl --kubeconfig CLUSTER_KUBECONFIG get service my-service --output yaml
Dalam output, Anda dapat melihat alamat IP cluster untuk Service. 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 "Halo dunia":
Hello, world! Version: 2.0.0 Hostname: my-deployment-xxx
Membuat Service stack ganda 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 Service:
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 Service jenis LoadBalancer:
loadBalancer:
mode: "bundled"
...
addressPools:
- name: "pool-1"
addresses:
- "10.2.0.112-10.2.0.221"
- "fd12::4:101-fd12::4:110"
Service Anda akan diberi alamat IPv4 eksternal yang dipilih dari rentang IPv4 dan alamat IPv6 eksternal yang dipilih dari rentang IPv6.
Cantumkan detail untuk Service:
kubectl --kubeconfig CLUSTER_KUBECONFIG get service my-lb-service --output yaml
Dalam output, Anda dapat melihat alamat eksternal untuk Service. 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 Service dual-stack, Anda dapat menetapkan ipFamilyPolicy ke salah satu nilai berikut:
SingleStack: Pengontrol mengalokasikan alamat IP cluster untuk Service, yang dipilih dari rentang pertama yang ditentukan dalam manifes Cluster di bagianclusterNetwork.services.cidrBlocks.PreferDualStack: Pengontrol mengalokasikan alamat IP cluster IPv4 dan IPv6 untuk Service, yang dipilih dari rentang yang ditentukan dalam manifes Cluster di bagianclusterNetwork.services.cidrBlocks. Jika cluster bukan cluster dual-stack, perilakunya sama denganSingleStack.RequireDualStack: Pengontrol mengalokasikan alamat IP cluster IPv4 dan IPv6 untuk Service, yang dipilih dari rentang yang ditentukan dalam manifes Cluster di bagianclusterNetwork.services.cidrBlocks. Ini menetapkan nilaispec.clusterIPberdasarkan kelompok alamat pertama yang ditentukan dalam manifes Service di bagianipFamilies.
Informasi selengkapnya
Untuk mengetahui informasi selengkapnya tentang cara membuat Service stack ganda, lihat Opsi stack ganda di Service baru.