Jejaring stack ganda IPv4/IPv6

Google Distributed Cloud mendukung jaringan stack ganda IPv4/IPv6. Artinya, cluster dapat menerima traffic dari perangkat eksternal yang menggunakan Internet Protocol versi 4 (IPv4) atau Internet Protocol versi 6 (IPv6).

Jaringan stack ganda menetapkan alamat IPv4 dan IPv6 ke Pod dan node. Layanan Kubernetes dapat memiliki alamat IPv4, alamat IPv6, atau keduanya.

Semua cluster stack ganda menggunakan mode datar untuk IPv6. Secara default, cluster stack ganda menggunakan mode pulau untuk IPv4, tetapi Anda dapat mengonfigurasinya untuk menggunakan mode datar untuk IPv4.

Untuk membuat cluster stack ganda, jaringan pokok Anda harus mengaktifkan stack ganda. Jika jaringan pokok Anda adalah jaringan IPv4 atau IPv6 stack tunggal, Anda tidak dapat memulai cluster stack ganda.

Sebelum memulai

Jika node cluster Anda menjalankan RedHat Enterprise Linux, dan SELinux diaktifkan, di setiap node:

  • Di /etc/firewalld/firewalld.conf, tetapkan IPv6_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 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 satu stack.

Dalam manifes Cluster, di bagian clusterNetwork.services.cidrBlocks, tentukan rentang CIDR IPv4 dan rentang CIDR IPv6. Ini adalah kriteria pengaktifan untuk cluster dual-stack. Artinya, jika Anda memberikan rentang CIDR Layanan 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 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 tertentu atau node tertentu.

Keterjangkauan untuk alamat IP Pod

Cluster stack ganda menggunakan mode datar untuk jaringan IPv6. Contoh yang diberikan dalam dokumen ini ditujukan 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:

TujuanRentangNomor alamat
Seluruh domain Lapisan 2fd12::/108220
Podfd12::1:0/112216
Nodefd12::2:0/112216
Mesin lainnyafd12::3:0/112216
VIPfd12::4:0/112216

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 dari rentang besar.

  • Alamat IP node berada dalam subset yang berbeda dari rentang yang besar.

  • Alamat IP komputer 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 seluruh cluster atau memiliki rentang CIDR yang berlaku untuk node pool tertentu. Anda dapat menggabungkan jaringan datar IPv6 dengan jaringan IPv4 mode pulau. Atau, jaringan IPv4 dan IPv6 Anda mungkin 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 seluruh cluster untuk Pod
  • Rentang CIDR IPv6 seluruh cluster untuk Pod
  • Rentang CIDR IPv4 seluruh cluster untuk Layanan
  • Rentang CIDR IPv6 seluruh 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 yang dipaketkan

Untuk contoh konfigurasi tambahan, lihat Variasi penggunaan ClusterCIDRConfig.

Mengisi file konfigurasi

Ikuti petunjuk dalam 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 Layanan jenis LoadBalancer, alamat IP eksternal untuk Layanan 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 dalam manifes Cluster. Hal ini merupakan persyaratan jika IPv4 berada dalam mode pulau.

  • Tetapkan namespace ke nilai yang sama dengan yang Anda berikan dalam manifes Cluster.

  • Tetapkan ipv6.cidr ke rentang CIDR IPv6 untuk Pod.

  • Untuk setiap rentang CIDR, berikan nilai untuk perNodeMaskSize guna 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 untuk perNodeMaskSize sesuai kebutuhan. Misalnya, jika Anda menginginkan 28 alamat per node, tetapkan nilai perNodeMaskSize 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) = 216 alamat. Ukuran mask per node adalah 24, sehingga jumlah alamat yang ditetapkan ke setiap node adalah 2(32-24) = 28.

  • Rentang CIDR Pod 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 dari 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, lalu 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 CIDR Pod di seluruh cluster. Artinya, satu rentang CIDR IPv4 digunakan untuk semua Pod dalam cluster. Dan satu rentang CIDR IPv6 digunakan untuk semua Pod di 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 kumpulan node, atau Anda mungkin ingin menentukan rentang CIDR terpisah untuk setiap node. Untuk informasi selengkapnya tentang ClusterCIDRConfig dan contoh penggunaannya, lihat Memahami resource kustom ClusterCIDRConfig.

Misalnya, ClusterCIDRConfig berikut menentukan rentang CIDR untuk kumpulan node yang 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 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 Layanan sebelumnya:

  • Kolom ipFamilyPolicy ditetapkan ke RequireDualStack. Artinya, alamat IPv6 dan IPv4 ClusterIP dialokasikan untuk Layanan.

  • Kolom ipFamilies menentukan keluarga IPv6 terlebih dahulu dan keluarga IPv4 di tempat kedua. Artinya, spec.ClusterIP untuk Layanan akan berupa alamat IPv6 yang dipilih dari clusterNetwork.services.cidrBlocks dalam 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 Layanan:

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

Di node cluster, panggil Layanan:

curl IPV4_CLUSTER_IP
curl IPV6_CLUSTER_IP

Output menampilkan pesan "Halo dunia":

Hello, world!
Version: 2.0.0
Hostname: my-deployment-xxx

Membuat Layanan 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 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 diberi alamat IPv4 eksternal yang dipilih dari rentang IPv4 dan alamat IPv6 eksternal yang dipilih dari rentang IPv6.

Cantumkan detail untuk Layanan:

kubectl --kubeconfig CLUSTER_KUBECONFIG get service my-lb-service --output yaml

Dalam 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

Kemungkinan nilai 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 bagian clusterNetwork.services.cidrBlocks.

  • PreferDualStack: Pengontrol mengalokasikan alamat IP cluster IPv4 dan IPv6 untuk Layanan, yang dipilih dari rentang yang ditentukan dalam manifes Cluster di bagian clusterNetwork.services.cidrBlocks. Jika cluster bukan cluster dual-stack, perilakunya sama dengan SingleStack.

  • RequireDualStack: Pengontrol mengalokasikan alamat IP cluster IPv4 dan IPv6 untuk Layanan, yang dipilih dari rentang yang ditentukan dalam manifes Cluster di bagian clusterNetwork.services.cidrBlocks. Fungsi ini menetapkan nilai spec.clusterIP berdasarkan keluarga alamat pertama yang ditentukan dalam manifes Layanan di bagian ipFamilies.

Informasi selengkapnya

Untuk mengetahui informasi selengkapnya tentang cara membuat Layanan stack ganda, lihat Opsi stack ganda di Layanan baru.