全部产品
Search
文档中心

Container Service for Kubernetes:Konfigurasikan alamat IP statis, vSwitch terpisah, dan grup keamanan terpisah untuk setiap pod

更新时间:Jul 06, 2025

Untuk mengelola dan mengisolasi lalu lintas pengguna, mengonfigurasi kebijakan jaringan, serta mengelola alamat IP secara lebih rinci, Anda dapat mengaktifkan fitur Trunk elastic network interface (ENI) Terway pada klaster Container Service for Kubernetes (ACK). Fitur ini memungkinkan Anda menentukan alamat IP statis, vSwitch terpisah, dan grup keamanan terpisah untuk setiap pod.

Informasi latar belakang

Trunk elastic network interfaces (ENIs) adalah antarmuka jaringan virtual baru yang mendukung semua fitur ENI standar. Selain itu, ketika jumlah maksimum ENI yang dapat digunakan telah tercapai, Anda dapat mengaitkan ENI tambahan dengan Trunk ENI. Setiap ENI tersebut dapat dialokasikan secara terpisah ke sebuah pod.

Setelah mengaktifkan fitur Trunk ENI pada klaster, Anda dapat menyesuaikan konfigurasi pod tertentu untuk menggunakan ENI tambahan yang terkait dengan Trunk ENI dalam mode eksklusif, sementara pod lainnya tetap berbagi ENI asli. Konfigurasi pod kustom bersifat opsional. Secara default, semua pod menggunakan alamat IP yang dialokasikan dari ENI bersama. Untuk memungkinkan pod menggunakan konfigurasi kustom, Anda harus membuat klaim untuk mengaktifkan fitur konfigurasi pod kustom.

Setelah mengaktifkan konfigurasi pod kustom, komponen terway-controlplane diterapkan di klaster. Gambar berikut menunjukkan cara kerja komponen tersebut.

Batasan

  • Jika Anda menggunakan ACK dedicated cluster, buka Konsol Quota Center dan ajukan permohonan untuk Container network supports Terway ENI Trunking mode.

  • Jumlah pod yang dapat dibuat pada sebuah node terbatas. Untuk informasi lebih lanjut, lihat Bekerja dengan Terway.

  • Aturan grup keamanan pod tidak berlaku untuk lalu lintas antar pod pada node yang sama atau lalu lintas antara pod dan node tempat pod tersebut dibuat. Jika Anda ingin menerapkan aturan grup keamanan pod dalam skenario ini, Anda dapat mengonfigurasi kebijakan jaringan.

Ruang lingkup konfigurasi pod terpisah

Konfigurasi pod terpisah dilakukan dengan membuat ENI khusus untuk setiap pod serta mengonfigurasi vSwitch eksklusif dan grup keamanan untuk ENI tersebut.

Mode konfigurasi node berikut digunakan untuk konfigurasi pod terpisah:

Node yang mendukung Trunk ENIs

Node yang mendukung ENIs (Untuk informasi lebih lanjut, lihat Konfigurasikan mode ENI eksklusif untuk pool node)

Jenis klaster yang didukung

ACK managed clusters

ACK managed clusters dan ACK dedicated clusters

Kepadatan penyebaran

Pod reguler menggunakan ENIs bersama. Pod yang ditentukan menggunakan ENIs eksklusif, yang menghasilkan kepadatan keseluruhan lebih tinggi.

Semua pod pada node hanya dapat menggunakan ENIs eksklusif, yang mengarah pada kepadatan lebih rendah.

Jenis node yang didukung

Node ECS

Node ECS

Tipe instance

Anda perlu memilih instance yang mendukung Trunk ENIs dan memiliki parameter respons EniTrunkSupported=true. Untuk informasi lebih lanjut tentang instance yang mendukung Trunk ENIs, lihat DescribeInstanceTypes.

Instance yang mendukung ENIs.

Langkah 1: Aktifkan fitur Terway Trunk ENI untuk sebuah klaster

Jika Anda menggunakan ACK dedicated cluster, Anda harus submit a ticket untuk mengajukan izin menggunakan instance ECS yang mendukung Trunk ENI. Untuk ACK managed cluster, Anda tidak perlu mengajukan izin untuk menggunakan instance ECS yang mendukung Trunk ENI.

Aktifkan fitur Terway Trunk ENI di klaster baru

Buat klaster ACK, atur Network Plug-in menjadi Terway, dan atur Terway Mode menjadi Support for ENI Trunking. Dalam mode ini, tipe plug-in jaringan adalah terway-eniip. Untuk informasi lebih lanjut, lihat Buat Klaster ACK Dedicated (tidak dilanjutkan) dan Buat Klaster ACK Managed.

Catatan

Secara default, fitur Trunk ENI diaktifkan untuk ACK managed cluster yang menjalankan Kubernetes 1.31 atau versi lebih baru.

Penting

Fitur Trunk ENI tidak dapat dinonaktifkan setelah diaktifkan untuk klaster baru.

Aktifkan fitur Trunk ENI di klaster yang sudah ada

Prasyarat

Tipe plug-in jaringan yang digunakan oleh klaster adalah terway-eniip. Untuk informasi lebih lanjut tentang plug-in jaringan Terway, lihat Bekerja dengan Terway.

Catatan

Anda dapat memeriksa plug-in jaringan yang telah diinstal di halaman Add-ons klaster.

Batasan

  • Fitur ini mungkin tidak didukung oleh ACK managed cluster yang dibuat sebelum Juni 2020. Lakukan Langkah 1 untuk memeriksa apakah klaster Anda mendukung fitur ini.

  • Alamat IP statis, vSwitch, dan grup keamanan tidak dapat dinonaktifkan setelah diaktifkan.

Langkah 1: Periksa apakah klaster mendukung fitur Terway Trunk ENI

Penting
  • Lewati langkah ini jika Anda menggunakan ACK dedicated cluster. Anda perlu mengajukan izin untuk menggunakan Trunk ENI. Anda dapat submit a ticket untuk mengajukan izin menggunakan instance ECS yang mendukung Trunk ENI.

  • Untuk ACK managed cluster yang sudah ada atau ACK managed cluster yang ditingkatkan dari ACK dedicated cluster, Anda perlu memeriksa apakah klaster mendukung fitur Terway Trunk ENI dan memodifikasi konfigurasi. Anda tidak perlu mengajukan izin untuk menggunakan instance ECS yang mendukung Trunk ENI.

Jalankan perintah berikut untuk memeriksa konfigurasi token:

kubectl get secret -nkube-system addon.network.token

Output yang Diharapkan:

NAME                  TYPE     DATA   AGE
addon.network.token   Opaque   1      69m

Jika konfigurasi token ada, lanjutkan ke langkah berikutnya. Jika konfigurasi token tidak ada, fitur Terway Trunk ENI tidak didukung oleh klaster. Dalam hal ini, Anda dapat membuat klaster baru dengan fitur Terway Trunk ENI diaktifkan.

Langkah 2: Aktifkan terway-eniip dan aktifkan fitur Terway Trunk ENI untuk klaster

  1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

  2. Di halaman Clusters, temukan klaster yang ingin Anda kelola dan klik namanya. Di panel navigasi kiri, klik Add-ons.

  3. Di halaman Add-ons, klik tab Networking dan temukan komponen terway-eniip.

  4. Di kartu terway-eniip, klik Upgrade untuk memperbarui terway-eniip ke versi terbaru.

    Jika tombol Upgrade tidak ditampilkan, versi terbaru terway-eniip telah terinstal. Anda dapat melewati langkah ini.

  5. Aktifkan terway-eniip.

    1. Jalankan perintah berikut untuk memodifikasi ConfigMap eni-config:

      kubectl edit cm -nkube-system eni-config
    2. Modifikasi parameter dalam ConfigMap eni-config.

      Parameter

      Contoh

      Deskripsi

      enable_eni_trunking

      true

      Aktifkan fitur Trunk ENI. Fitur ini tidak dapat dinonaktifkan setelah diaktifkan.

      credential_path

      /var/addon/token-config

      Jika Anda menggunakan ACK managed cluster, ConfigMap tidak berisi parameter ini. Anda perlu menambahkan parameter ini secara manual.

      Penting
      • Jangan modifikasi parameter lainnya.

      • Isi dari ConfigMap eni-config harus dalam format JSON.

      Contoh:

      apiVersion: v1
      data:
        eni_conf: |
          {
            "min_pool_size": 0,
            "enable_eni_trunking": true,
            "credential_path": "/var/addon/token-config",
            ...
          }
      kind: ConfigMap
    3. Jalankan perintah berikut untuk memulai ulang pod Terway agar ConfigMap yang dimodifikasi berlaku:

      kubectl delete pod -n kube-system -l app=terway-eniip
  6. Instal terway-controlplane dari tab Networking halaman Add-ons setelah Anda mengaktifkan terway-eniip.

    Setelah terway-controlplane diinstal, Installed akan ditampilkan di kartu terway-controlplane.

Langkah 2: Buat PodNetworking

Terway memungkinkan Anda menggunakan definisi sumber daya kustom (CRD) bernama PodNetworking untuk menggambarkan konfigurasi jaringan. Anda dapat membuat beberapa PodNetworking untuk merancang bidang jaringan yang berbeda.

  1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

  2. Di halaman Clusters, temukan klaster yang Anda inginkan dan klik namanya. Di panel kiri, pilih Workloads > Custom Resources.

  3. Di halaman Custom Resources, klik tab CRDs, lalu klik Create from YAML.

    Blok kode berikut menunjukkan contoh PodNetworking:

    apiVersion: network.alibabacloud.com/v1beta1
    kind: PodNetworking
    metadata:
      name: example
    spec:
      allocationType:
        type: Fixed # Kebijakan yang menggambarkan bagaimana alamat IP dialokasikan ke pod. Nilai valid: Elastic dan Fixed.
        releaseStrategy: TTL # Parameter ini berlaku hanya jika PodNetworking menggunakan kebijakan Fixed. Jika PodNetworking menggunakan kebijakan Elastic, Anda tidak perlu mengonfigurasi parameter releaseStrategy dan releaseAfter.
        releaseAfter: "1h" # Parameter ini berlaku hanya jika releaseStrategy diatur ke TTL.
      selector:
        podSelector:
          matchLabels:
            foo: bar
        namespaceSelector:
          matchLabels:
            foo: bar
      securityGroupIDs:
      - sg-bpxxxx
      vSwitchOptions:
      - vsw-bpxxxx
    status:
      status: Ready               

    Tabel berikut menjelaskan parameter-parameter tersebut.

    Parameter

    Deskripsi

    allocationType

    (Kebijakan yang menggambarkan bagaimana alamat IP dialokasikan ke pod)

    type

    Nilai valid:

    • Elastic: Alokasikan alamat IP elastis (EIPs) ke pod. Alamat IP dilepaskan setelah pod dihapus.

    • Fixed: Alokasikan alamat IP statis ke pod.

      Setelah Anda mengaktifkan mode ini, PodNetworking hanya berlaku pada pod dengan nama tetap. Secara default, StatefulSets dan pod tanpa ownerReferences didukung. Jika Anda perlu mengonfigurasi beban kerja kustom, konfigurasikan terway-controlplane dalam manajemen komponen.

    Catatan

    Jika Anda menggunakan kebijakan Fixed, batasan ditambahkan untuk memastikan bahwa zona tempat pod diregenerasi sama dengan zona aslinya.

    releaseStrategy

    Kebijakan yang menggambarkan bagaimana alamat IP dilepaskan. Parameter ini berlaku hanya jika type diatur ke Fixed. Nilai valid:

    • TTL: Alamat IP dilepaskan dengan penundaan. Setelah pod dihapus, alamat IP pod tidak dilepaskan sampai periode waktu yang ditentukan berakhir. Nilai minimum adalah 5 menit.

    • Never: Alamat IP tidak dilepaskan. Jika alamat IP tidak lagi digunakan, Anda harus menghapus PodENIs secara manual.

    releaseAfter

    Penundaan untuk melepaskan alamat IP pod. Parameter ini berlaku hanya jika releaseStrategy diatur ke TTL. Nilainya harus bertipe waktu Go. Unit: jam (h) dan menit (m). Contoh: 2h45m atau 5m0s. Untuk informasi lebih lanjut, lihat Tipe waktu Go.

    selector

    (Pemilih label yang digunakan untuk memilih pod untuk menggunakan PodNetworking saat ini)

    podSelector

    • Pemilih yang digunakan untuk mencocokkan label pod. Pod yang cocok dengan pemilih ini menggunakan PodNetworking saat ini.

    • Jika baik podSelector maupun namespaceSelector dikonfigurasi, hanya pod yang cocok dengan kedua pemilih yang menggunakan PodNetworking saat ini.

    • Pastikan label pod sesuai dengan selectors hanya satu ConfigMap PodNetworking. Jika pod cocok dengan beberapa ConfigMap PodNetworking, pod akan menggunakan konfigurasi jaringan dari ConfigMap PodNetworking secara acak.

    namespaceSelector

    • Pemilih yang digunakan untuk mencocokkan label namespace. Pod yang cocok dengan pemilih ini menggunakan PodNetworking saat ini.

    • Jika baik podSelector maupun namespaceSelector dikonfigurasi, hanya pod yang cocok dengan kedua pemilih yang menggunakan PodNetworking saat ini.

    • Pastikan label pod sesuai dengan selectors hanya satu ConfigMap PodNetworking. Jika pod cocok dengan beberapa ConfigMap PodNetworking, pod akan menggunakan konfigurasi jaringan dari ConfigMap PodNetworking secara acak.

    vSwitchOptions

    -

    • Menentukan vSwitches yang digunakan oleh pod. Hubungan logis di antara beberapa vSwitches adalah ATAU. Setiap pod hanya dapat menggunakan satu vSwitch. Terway secara otomatis memilih vSwitch yang tepat untuk setiap pod.

    • Batasan ditambahkan untuk memastikan zona tempat pod dapat dijadwalkan sama dengan zona vSwitches yang Anda tentukan dalam parameter vSwitchOptions.

    • Pastikan zona vSwitches di vSwitchOptions sama dengan zona node tempat pod dijadwalkan. Selain itu, pastikan vSwitches tersebut dapat menyediakan alamat IP idle yang cukup. Jika tidak, ACK gagal membuat pod.

    Catatan

    Jika Anda telah mengaktifkan penskalaan otomatis node, batasan zona ketersediaan yang ditambahkan menggunakan parameter vSwitchOptions dapat mencegah pool node melakukan penskalaan keluar. Untuk informasi lebih lanjut, lihat FAQ tentang penskalaan otomatis node.

    vSwitchSelectOptions (Kebijakan yang menentukan vSwitch yang digunakan)

    vSwitchSelectionPolicy

    Nilai valid:

    • ordered: Ini adalah nilai default. vSwitches digunakan sesuai urutan pengisian.

    • most: Memrioritaskan vSwitch dengan jumlah alamat IP tersedia terbanyak untuk digunakan.

    • random: vSwitches dipilih secara acak.

    Catatan

    Didukung di Terway v1.11.0 dan versi lebih baru.

    securityGroupIDs

    -

    Menentukan ID grup keamanan. Beberapa grup keamanan berlaku secara bersamaan. Anda dapat menentukan maksimal lima grup keamanan.

    eniOptions (Tipe ENI yang digunakan oleh pod)

    eniType

    Nilai valid:

    • Default: Ini adalah mode default. Di klaster yang berjalan dalam mode Terway shared ENI, mode Trunk ENI digunakan. Di klaster yang berjalan dalam mode Terway ENI eksklusif, mode ENI eksklusif digunakan.

    • ENI: Gunakan mode ENI eksklusif.

    • Trunk: Gunakan mode Trunk ENI.

    Catatan

    Didukung di Terway v1.11.0 dan versi lebih baru.

  4. Klik Create.

    Setelah PodNetworking dibuat, Terway secara otomatis menyinkronkan konfigurasi jaringan. PodNetworking hanya berlaku pada pod setelah status PodNetworking berubah menjadi Ready.

    Jalankan perintah berikut untuk memeriksa apakah status sumber daya adalah ready:

    kubectl describe PodNetworking example # Ganti example dengan nama sumber daya kustom sebenarnya.

(Opsional) Langkah 3: Tambahkan label ke namespace

Setelah Anda menerapkan PodNetworking, Anda harus menambahkan label yang sama ke namespace tertentu untuk memastikan bahwa namespace sesuai dengan aturan PodNetworking dengan menambahkan label ke namespace.

  1. Jalankan perintah berikut untuk membuat namespace uji bernama example:

    kubectl create ns example
  2. Jalankan perintah berikut untuk menambahkan label foo=bar ke namespace:

    kubectl label namespaces example foo=bar # Ganti example dengan nama namespace sebenarnya.
  3. Jalankan perintah berikut untuk memeriksa label namespace:

    kubectl get namespace example --show-labels # Ganti example dengan nama namespace sebenarnya.

    Output yang Diharapkan:

     NAME      STATUS   AGE   LABELS
    example   Active   24s   foo=bar,kubernetes.io/metadata.name=example

(Opsional) Langkah 4: Buat pod

Saat ACK membuat pod, label pod dicocokkan dengan PodNetworking. Jika pod tidak cocok dengan PodNetworking, pod secara default diberi alamat IP dari ENI bersama. Jika pod cocok dengan PodNetworking, alamat IP diberikan ke pod berdasarkan konfigurasi yang ditentukan dalam PodNetworking.

Terway secara otomatis membuat CRD bernama PodENI untuk pod yang cocok dengan PodNetworking. PodENI digunakan untuk melacak penggunaan sumber daya pod. PodENI dikelola oleh Terway. Untuk informasi lebih lanjut tentang label pod, lihat Labels and Selectors.

  1. Buat file my-nginx.yaml dengan template YAML berikut:

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: my-nginx # Nama aplikasi.
      namespace: example # Tentukan nama namespace sebagai example.
      labels:
        app: nginx
    spec:
      serviceName: "nginx-service"  
      replicas: 1    
      selector:
        matchLabels:
          app: nginx 
      template:
        metadata:
          labels:
            app: nginx
            foo: bar # Tambahkan label foo: bar ke pod.
        spec:
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80  
    
    Jika StatefulSet memerlukan penyimpanan persisten, Anda harus menyetel parameter volumeClaimTemplates.
    # Contoh:
    #  volumeClaimTemplates:
    #  - metadata:
    #      name: nginx-storage
    #    spec:
    #      accessModes: ["ReadWriteOnce"]
    #      storageClassName: "my-storage-class"
    #      resources:
    #        requests:
    #          storage: 1Gi
  2. Jalankan perintah berikut untuk menerapkan aplikasi contoh bernama my-nginx: Setelah pod diterapkan, verifikasi konfigurasinya. Untuk informasi lebih lanjut, lihat Bagaimana cara memeriksa apakah pod menggunakan konfigurasi jaringan yang ditentukan dalam ConfigMap PodNetworking?

    kubectl apply -f my-nginx.yaml

Hentikan terway-controlplane sebelum migrasi klaster

Setelah mengaktifkan fitur konfigurasi pod kustom untuk ACK dedicated cluster, Anda tidak dapat langsung memigrasikan beban kerja dari ACK dedicated cluster ke ACK managed Pro cluster. Anda harus menghentikan terway-controlplane sebelum migrasi dimulai dan kemudian mengaktifkan terway-controlplane setelah migrasi selesai.

  1. Lakukan langkah-langkah berikut sebelum memulai migrasi:

    1. Jalankan perintah berikut untuk menghentikan terway-controlplane:

      kubectl scale deploy -nkube-system terway-controlplane --replicas 0
    2. Jalankan perintah berikut untuk mengonfigurasi webhook:

      # Cadangkan konfigurasi webhook.
      kubectl get mutatingwebhookconfigurations.admissionregistration.k8s.io terway-controlplane -oyaml > terway-controlplane.mutatingwebhookconfigurations.yaml
      kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io terway-controlplane -oyaml > terway-controlplane.validatingwebhookconfigurations.yaml
      # Hapus konfigurasi webhook.
      kubectl delete -f terway-controlplane.mutatingwebhookconfigurations.yaml
      kubectl delete -f terway-controlplane.validatingwebhookconfigurations.yaml
  2. Verifikasi bahwa migrasi berhasil.

    Catatan

    Untuk informasi lebih lanjut tentang migrasi klaster, lihat Migrasi Panas dari Klaster ACK Dedicated ke Klaster ACK Managed Pro.

    • Jika migrasi gagal, jalankan perintah berikut untuk memulihkan webhook dan terway-controlplane:

      # Pulihkan konfigurasi webhook.
      kubectl apply -f terway-controlplane.mutatingwebhookconfigurations.yaml
      kubectl apply -f terway-controlplane.validatingwebhookconfigurations.yaml
      # Pulihkan terway-controlplane.
      kubectl scale deploy -nkube-system terway-controlplane --replicas 1
    • Jika migrasi berhasil, jalankan perintah berikut untuk menghapus sumber daya terkait:

      kubectl delete deploy -nkube-system terway-controlplane
  3. Instal komponen terway-controlplane dari halaman Add-ons. Untuk informasi lebih lanjut, lihat Kelola Komponen Sistem.

FAQ

Bagaimana cara memeriksa apakah pod menggunakan konfigurasi jaringan yang ditentukan dalam ConfigMap PodNetworking?

  1. Jika pod menggunakan konfigurasi jaringan yang ditentukan dalam PodNetworking, sebuah annotation dengan nilai k8s.aliyun.com/pod-networking ditambahkan ke pod setelah pod dibuat.

    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        k8s.aliyun.com/pod-eni: "true"
        k8s.aliyun.com/pod-networking: podnetworking
      labels:
        app: example
        pod-ip: elastic
  2. Terway secara otomatis membuat PodENI dengan nama pod dan namespace yang sama untuk mencatat konfigurasi jaringan yang digunakan oleh pod.

    kubectl get podenis.network.alibabacloud.com <my-nginx-0> -n <example> -o yaml # Ganti <my-nginx-0> dengan nama pod. Ganti <example> dengan namespace tempat pod berada.

    Output berikut menunjukkan bahwa pod menggunakan konfigurasi jaringan yang ditentukan dalam ConfigMap PodNetworking.

    apiVersion: network.alibabacloud.com/v1beta1
    kind: PodENI
    metadata:
      finalizers:
      - pod-eni
      generation: 1
      name: <my-nginx-0>
      namespace: default
    spec:
      allocations:
      - allocationType:
          type: Elastic
        eni:
          id: eni-bp1xxxx
          mac: 00:16:xx:xx:xx:xx
          securityGroupIDs:
          - sg-bp1xxxx
          vSwitchID: vsw-bp1xxxx
          zone: cn-hangzhou-h
        ipv4: 192.168.x.x
        ipv4CIDR: 192.168.x.x/19
        ipv6: 2408:x:x:x:x:x:x:x
        ipv6CIDR: 2408:x:x:x::/64
      zone: cn-hangzhou-h
    status:
      eniInfos:
        eni-bp1xxxx:
          id: eni-bp1xxxx
          status: Bind
          vid: 1001
      instanceID: i-bp1xxxx
      phase: Bind
      podLastSeen: "2021-xx-xxT00:00:00Z"
      trunkENIID: eni-bp1xxxx

Mengapa pod tidak menggunakan konfigurasi jaringan yang ditentukan dalam ConfigMap PodNetworking yang diinginkan setelah pod dibuat?

  1. Pastikan status PodNetworking adalah Ready.

  2. Pastikan label pod hanya cocok dengan label dalam PodNetworking yang diinginkan.

  3. Jika PodNetworking menggunakan kebijakan Fixed, pod yang tidak dibuat oleh StatefulSets tidak cocok dengan PodNetworking.

Referensi