IPVLAN 및 Whereabouts로 Multus 구성

이 문서에서는 Multus CNI, IPVLAN CNI 플러그인, Whereabouts IPAM 플러그인을 사용하여 여러 네트워크 인터페이스가 있는 Google Kubernetes Engine (GKE)에서 포드를 구성하는 방법을 설명합니다.

IPVLAN CNI 플러그인 은 추가 포드 인터페이스에 레이어 2 연결을 제공하고 Whereabouts IPAM 플러그인 은 IP 주소를 동적으로 할당합니다.

이 설정을 사용하면 향상된 네트워크 격리 및 세분화를 위해 컨트롤 플레인 및 데이터 플레인 트래픽을 분리하는 등의 고급 네트워킹 구성을 사용할 수 있습니다.

이 문서는 조직의 네트워크를 설계하는 클라우드 설계자 및 네트워킹 전문가를 대상으로 합니다. 콘텐츠에서 참조하는 일반적인 역할 및 예시 태스크에 대해 자세히 알아보려면 일반 GKE 사용자 역할 및 태스크를 참조하세요. Google Cloud

이 문서를 읽기 전에 다음 개념을 잘 알고 있어야 합니다.

IPVLAN과 함께 Multus 사용의 이점

이 솔루션을 사용하여 여러 네트워크 인터페이스로 포드를 구성하면 다음과 같은 몇 가지 주요 이점이 있습니다. 레이어 2 모드에서 IPVLAN으로 Multus를 구성하는 기본 사용 사례는 레이어 2 인접성이 필요한 네트워크 세분화입니다.

  • 트래픽 격리: 향상된 보안 및 성능을 위해 다양한 유형의 트래픽을 격리합니다. 예를 들어 민감한 관리 트래픽을 애플리케이션 데이터 트래픽과 분리할 수 있습니다.
  • 컨트롤 플레인 및 데이터 플레인 분리: 기본 네트워크 인터페이스를 컨트롤 플레인 트래픽 전용으로 사용하고 높은 처리량의 데이터 플레인 트래픽을 보조 IPVLAN 인터페이스를 통해 전달합니다.
  • 레이어 2 인접성: 동일한 보조 네트워크의 포드 간에 직접 레이어 2 연결이 필요한 애플리케이션의 요구사항을 충족합니다.

제한사항

IPVLAN 및 Whereabouts가 있는 Multus에는 다음과 같은 제한사항이 있습니다.

  • Multus 인터페이스로 구성된 포드는 GKE의 기본 제공 멀티 네트워킹 기능을 동시에 사용할 수 없습니다. 포드의 네트워크 구성은 Multus 또는 클러스터의 기본 제공 멀티 네트워킹을 사용해야 합니다.
  • IPVLAN 및 Whereabouts가 있는 Multus가 올바르게 작동하려면 포드 내 레이어 2 ARP 확인이 필요합니다.
  • 기본적으로 VPC 서브넷은 Compute Engine VM의 보조 인터페이스에서 ARP 확인을 허용하지 않습니다. 이 ARP 확인을 허용하려면 지원 케이스를 열어 resolve-subnet-mask 기능의 비공개 미리보기에 등록하면 됩니다.

Multus가 IPVLAN 및 Whereabouts와 작동하는 방식

Multus는 포드를 여러 네트워크에 연결할 수 있는 CNI 메타 플러그인입니다. Multus는 디스패처 역할을 하며 다른 CNI 플러그인을 호출하여 NetworkAttachmentDefinition 리소스를 기반으로 네트워크 인터페이스를 구성합니다. NetworkAttachmentDefinition을 사용하여 각 추가 네트워크를 정의합니다. 이 정의는 해당 네트워크에 사용할 CNI 플러그인(예: IPVLAN) 및 IPAM 플러그인 (예: Whereabouts)을 지정합니다.

다음 다이어그램은 IPVLAN 및 Whereabouts 플러그인이 있는 Multus 아키텍처를 보여줍니다.Whereabouts 플러그인은 Multus 및 IPVLAN과 함께 작동하여 포드의 추가 네트워크 인터페이스에 대한 IP 주소 관리 (IPAM)를 처리합니다.

GKE에서 Multus, IPVLAN, Whereabouts가 함께 작동하는 방식을 보여주는 다이어그램
그림 1. IPVLAN 및 Whereabouts 플러그인이 있는 Multus 아키텍처

이 다이어그램은 각각 포드 하나가 있는 노드 두 개를 보여줍니다. 각 포드에는 기본 인터페이스와 추가 인터페이스가 있습니다. 두 개의 기본 인터페이스는 공유 네트워크 인터페이스 카드에 연결되고 두 개의 추가 인터페이스는 다른 공유 네트워크 인터페이스 카드에 연결됩니다.

GKE에서 IPVLAN 및 Whereabouts와 함께 Multus를 사용하는 경우 포드에는 일반적으로 다음과 같은 인터페이스 구성이 있습니다.

  • 기본 인터페이스 (eth0): GKE Dataplane V2는 이 인터페이스를 관리하여 기본 클러스터 연결을 제공합니다.
  • 추가 인터페이스 (net1 등): Multus는 이러한 인터페이스를 관리합니다. Multus는 포드의 주석에 지정한 각 NetworkAttachmentDefinition에 대해 레이어 2 모드에서 IPVLAN CNI 플러그인을 호출합니다. 이 구성은 보조 VPC 네트워크에 레이어 2 연결을 제공합니다.
  • IP 주소 관리 (IPAM): Whereabouts IPAM 플러그인을 NetworkAttachmentDefinition 내에서 구성합니다. Whereabouts IPAM 플러그인은 미리 정의된 범위에서 추가 IPVLAN 인터페이스에 IP 주소를 동적으로 할당합니다.

여러 네트워크를 사용한 포드 예약

포드를 만들고 주석에 NetworkAttachmentDefinition을 지정하면 GKE 스케줄러는 네트워크 요구사항을 충족할 수 있는 노드에만 포드를 배치합니다. 스케줄러는 필요한 보조 네트워크 인터페이스가 구성된 노드 풀 내에서 노드를 식별합니다. 이 노드 식별 프로세스를 통해 스케줄러가 추가 네트워크에 연결하고 지정된 범위에서 IP 주소를 수신할 수 있는 노드에 포드를 예약할 수 있습니다.

다음 섹션에서는 GKE 클러스터에서 IPVLAN 및 Whereabouts 플러그인으로 Multus를 구성하는 방법을 안내합니다.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치했으면 gcloud components update 명령어를 실행하여 최신 버전을 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.
  • kubectl 명령줄 도구를 설치합니다.
  • Dataplane V2, IP 별칭, 멀티 네트워킹이 사용 설정된 버전 1.28 이상을 실행하는 GKE 클러스터를 설정합니다. 방법은 포드의 멀티 네트워크 지원 설정을 참조하세요. 멀티 네트워킹을 사용 설정하면 노드 간 연결을 수동으로 설정할 필요가 없는 멀티 IP 서브넷 및 영구 IP HA 정책 기능도 사용 설정됩니다.
  • 호환성을 위해 GKE에서 검증된 Multus CNI 버전 (예: v4.2.1)을 사용합니다.

VPC 설정

노드 네트워킹을 위한 서브넷과 포드 네트워킹을 위한 보조 범위를 만드는 것을 포함하여 Multus와 함께 사용할 가상 사설 클라우드 (VPC)를 설정하려면 다음 단계를 완료하세요.

  1. 새 VPC를 만들거나 기존 VPC를 사용합니다.

    gcloud compute networks create VPC_NAME \
    --subnet-mode=custom
    

    VPC_NAME을 VPC 이름으로 바꿉니다.

  2. 이 VPC 내에서 새 서브넷을 만듭니다.

    gcloud compute networks subnets create SUBNET_NAME \
        --range=PRIMARY_RANGE \
        --network=VPC_NAME \
        --region=REGION \
        --secondary-range=SECONDARY_RANGE_NAME=SECONDARY_RANGE_CIDR
    

    다음을 바꿉니다.

    • SUBNET_NAME: 새 서브넷의 이름입니다.
    • PRIMARY_RANGE: 서브넷의 기본 CIDR 범위(예: 10.0.1.0/24)입니다. 이 명령어는 노드 인터페이스에 이 범위를 사용합니다.
    • VPC_NAME: VPC의 이름입니다.
    • REGION: 서브넷의 리전(예: us-central1)입니다.
    • SECONDARY_RANGE_NAME: 서브넷의 포드에 대한 보조 IP 주소 범위의 이름입니다.
    • SECONDARY_RANGE_CIDR: 포드의 보조 CIDR 범위(예: 172.16.1.0/24)입니다. 포드의 추가 인터페이스는 이 범위를 사용합니다.

    이 명령어는 추가 노드 인터페이스의 기본 CIDR 범위와 추가 포드 인터페이스의 보조 범위가 있는 서브넷을 만듭니다.

GKE Standard 클러스터 만들기

멀티 네트워킹이 사용 설정된 GKE Standard 클러스터를 만듭니다.

gcloud container clusters create CLUSTER_NAME \
    --cluster-version=CLUSTER_VERSION \
    --enable-dataplane-v2 \
    --enable-ip-alias \
    --enable-multi-networking

다음을 바꿉니다.

  • CLUSTER_NAME: 새 클러스터의 이름입니다.
  • CLUSTER_VERSION: GKE 클러스터의 버전입니다. 버전 1.28 이상을 사용해야 합니다.

멀티 네트워킹을 사용 설정하면 Multus CNI에 필요한 여러 네트워크 인터페이스가 있는 노드 풀을 만들 수 있습니다.

GKE Standard 노드 풀 만들기

추가 VPC 네트워크에 연결된 GKE Standard 노드 풀을 만듭니다.

gcloud container node-pools create NODEPOOL_NAME \
    --cluster CLUSTER_NAME \
    --zone "ZONE" \
    --additional-node-network network=VPC_NAME,subnetwork=SUBNET_NAME \
    --additional-pod-network subnetwork=SUBNET_NAME,pod-ipv4-range=SECONDARY_RANGE_NAME,max-pods-per-node=8

다음을 바꿉니다.

  • NODEPOOL_NAME: 새 노드 풀의 이름입니다.
  • CLUSTER_NAME: 클러스터의 이름입니다.
  • ZONE: 노드 풀의 영역(예: us-central1-c)입니다.
  • VPC_NAME: 추가 VPC의 이름입니다.
  • SUBNET_NAME: 서브넷의 이름입니다.
  • SECONDARY_RANGE_NAME: 서브넷의 포드에 대한 보조 IP 주소 범위의 이름입니다.

이 명령어는 노드에 추가 네트워크 인터페이스가 SUBNET_NAME에 있고 이러한 노드의 포드가 SECONDARY_RANGE_NAME의 IP 주소를 사용할 수 있는 노드 풀을 만듭니다.

멀티 네트워킹 기능이 있는 GKE 클러스터를 만드는 방법에 대한 자세한 내용은 포드의 멀티 네트워크 지원 설정을 참조하세요.

Multus 배포 적용

포드에 여러 네트워크 인터페이스를 사용 설정하려면 Multus CNI 플러그인을 설치합니다. 필요한 DaemonSet 및 커스텀 리소스 정의 (CRD)가 포함된 다음 매니페스트를 multus-manifest.yaml로 저장합니다.

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: ippools.whereabouts.cni.cncf.io
spec:
  group: whereabouts.cni.cncf.io
  names:
    kind: IPPool
    listKind: IPPoolList
    plural: ippools
    singular: ippool
  scope: Namespaced
  versions:
  - name: v1alpha1
    schema:
      openAPIV3Schema:
        description: IPPool is the Schema for the ippools API
        properties:
          apiVersion:
            description: 'APIVersion defines the versioned schema of this representation
                of an object. Servers should convert recognized schemas to the latest
                internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources'
            type: string
          kind:
            description: 'Kind is a string value representing the REST resource this
                object represents. Servers may infer this from the endpoint the client
                submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds'
            type: string
          metadata:
            type: object
          spec:
            description: IPPoolSpec defines the desired state of IPPool
            properties:
              allocations:
                additionalProperties:
                  description: IPAllocation represents metadata about the pod/container
                    owner of a specific IP
                  properties:
                    id:
                      type: string
                    podref:
                      type: string
                  required:
                  - id
                  type: object
                description: Allocations is the set of allocated IPs for the given
                  range. Its indices are a direct mapping to the IP with the same
                  index/offset for the pools range.
                type: object
              range:
                description: Range is a RFC 4632/4291-style string that represents
                  an IP address and prefix length in CIDR notation
                type: string
            required:
            - allocations
            - range
            type: object
        type: object
    served: true
    storage: true
status:
  acceptedNames:
    kind: ""
    plural: ""
  conditions: []
  storedVersions: []
---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  annotations:
    controller-gen.kubebuilder.io/version: v0.4.1
  name: overlappingrangeipreservations.whereabouts.cni.cncf.io
spec:
  group: whereabouts.cni.cncf.io
  names:
    kind: OverlappingRangeIPReservation
    listKind: OverlappingRangeIPReservationList
    plural: overlappingrangeipreservations
    singular: overlappingrangeipreservation
  scope: Namespaced
  versions:
  - name: v1alpha1
    schema:
      openAPIV3Schema:
        description: OverlappingRangeIPReservation is the Schema for the OverlappingRangeIPReservations
          API
        properties:
          apiVersion:
            description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
            type: string
          kind:
            description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
            type: string
          metadata:
            type: object
          spec:
            description: OverlappingRangeIPReservationSpec defines the desired state
              of OverlappingRangeIPReservation
            properties:
              containerid:
                type: string
              podref:
                type: string
            required:
            - containerid
            type: object
        required:
        - spec
        type: object
    served: true
    storage: true
status:
  acceptedNames:
    kind: ""
    plural: ""
  conditions: []
  storedVersions: []
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: multus-cni-config
  namespace: kube-system
  labels:
    app: gke-multinet
data:
  cni-conf.json: |
    {
      "name": "multus-cni-network",
      "type": "multus",
      "confDir": "/etc/cni/net.d",
      "namespaceIsolation": true,
      "logLevel": "verbose",
      "logFile": "/var/log/multus.log",
      "kubeconfig": "/var/lib/kubelet/kubeconfig",
      "clusterNetwork": "gke-pod-network"
    }
---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: network-attachment-definitions.k8s.cni.cncf.io
spec:
  group: k8s.cni.cncf.io
  scope: Namespaced
  names:
    plural: network-attachment-definitions
    singular: network-attachment-definition
    kind: NetworkAttachmentDefinition
    shortNames:
    - net-attach-def
  versions:
  - name: v1
    served: true
    storage: true
    schema:
      openAPIV3Schema:
        description: 'NetworkAttachmentDefinition is a CRD schema specified by the Network Plumbing
            Working Group to express the intent for attaching pods to one or more logical or physical
            networks. More information available at: https://github.com/k8snetworkplumbingwg/multi-net-spec'
        type: object
        properties:
          apiVersion:
            description: 'APIVersion defines the versioned schema of this represen
                tation of an object. Servers should convert recognized schemas to the
                latest internal value, and may reject unrecognized values. More info:
                https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
            type: string
          kind:
            description: 'Kind is a string value representing the REST resource this
                object represents. Servers may infer this from the endpoint the client
                submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
            type: string
          metadata:
            type: object
          spec:
            description: 'NetworkAttachmentDefinition spec defines the desired state of a network attachment'
            type: object
            properties:
              config:
                description: 'NetworkAttachmentDefinition config is a JSON-formatted CNI configuration'
                type: string
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: multus-role
rules:
- apiGroups: ["k8s.cni.cncf.io"]
  resources:
  - '*'
  verbs:
  - '*'
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: whereabouts
rules:
- apiGroups:
  - whereabouts.cni.cncf.io
  resources:
  - ippools
  - overlappingrangeipreservations
  verbs:
  - get
  - list
  - watch
  - create
  - update
  - patch
  - delete
- apiGroups:
  - coordination.k8s.io
  resources:
  - leases
  verbs:
  - create
- apiGroups:
  - coordination.k8s.io
  resources:
  - leases
  resourceNames:
  - whereabouts
  verbs:
  - '*'
- apiGroups: [""]
  resources:
  - pods
  verbs:
  - list
  - get
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: multus-role-binding
subjects:
- kind: Group
  name: system:nodes
roleRef:
  kind: ClusterRole
  name: multus-role
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: whereabouts-role-binding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: whereabouts
subjects:
- kind: ServiceAccount
  name: whereabouts-sa
  namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: whereabouts-sa
  namespace: kube-system
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: gke-multinet
  namespace: kube-system
  labels:
    app: gke-multinet
spec:
  selector:
    matchLabels:
      app: gke-multinet
  template:
    metadata:
      labels:
        app: gke-multinet
    spec:
      priorityClassName: system-node-critical
      hostNetwork: true
      tolerations:
      - operator: Exists
      serviceAccountName: whereabouts-sa
      containers:
      - name: whereabouts-gc
        command: [/ip-control-loop]
        args:
        - "--log-level=debug"
        - "--enable-pod-watch=false"
        - "--cron-schedule=* * * * *"
        image: gcr.io/gke-release/whereabouts:v0.7.0-gke.3@sha256:2bb8450a99d86c73b262f5ccd8c433d3e3abf17d36ee5c3bf1056a1fe479e8c2
        env:
        - name: NODENAME
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: spec.nodeName
        - name: WHEREABOUTS_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
          limits:
            cpu: "100m"
            memory: "50Mi"
      initContainers:
      - name: install-multus-config
        image: gcr.io/gke-release/multus-cni:v4.2.1-gke.6@sha256:25b48b8dbbf6c78a10452836f52dee456514783565b70633a168a39e6d322310
        args:
        - "--cni-conf-dir=/host/etc/cni/net.d"
        - "--multus-conf-file=/tmp/multus-conf/00-multus.conf"
        - "--multus-log-level=verbose"
        - "--multus-kubeconfig-file-host=/var/lib/kubelet/kubeconfig"
        - "--skip-multus-binary-copy=true"
        - "--skip-config-watch=true"
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
          limits:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: true
        volumeMounts:
        - name: cni
          mountPath: /host/etc/cni/net.d
        - name: multus-cfg
          mountPath: /tmp/multus-conf
      - name: install-whereabouts
        command: ["/bin/sh"]
        args:
        - -c
        - >
          SLEEP=false /install-cni.sh
        image: gcr.io/gke-release/whereabouts:v0.7.0-gke.3@sha256:2bb8450a99d86c73b262f5ccd8c433d3e3abf17d36ee5c3bf1056a1fe479e8c2
        env:
        - name: NODENAME
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: spec.nodeName
        - name: WHEREABOUTS_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
          limits:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: true
        volumeMounts:
        - name: cni
          mountPath: /host/etc/cni/net.d
        - name: cnibin
          mountPath: /host/opt/cni/bin
      - name: install-binary
        image: gcr.io/gke-release/multus-cni:v4.2.1-gke.6@sha256:25b48b8dbbf6c78a10452836f52dee456514783565b70633a168a39e6d322310
        command: ["/gkecmd"]
        args:
        - "-operation=copy"
        - "-cni-bin-dir=/host/opt/cni/bin"
        resources:
          requests:
            cpu: "10m"
            memory: "100Mi"
          limits:
            cpu: "10m"
            memory: "100Mi"
        securityContext:
          privileged: true
        volumeMounts:
        - name: cnibin
          mountPath: /host/opt/cni/bin
      volumes:
      - hostPath:
          path: /var/lib/kubelet/kubeconfig
          type: File
        name: kubelet-credentials
      - name: cni
        hostPath:
          path: /etc/cni/net.d
          type: DirectoryOrCreate
      - name: cnibin
        hostPath:
          path: /home/kubernetes/bin
          type: DirectoryOrCreate
      - name: multus-cfg
        configMap:
          name: multus-cni-config
          items:
          - key: cni-conf.json
            path: 00-multus.conf
  updateStrategy:
    rollingUpdate:
      maxUnavailable: 2
    type: RollingUpdate

그런 다음 매니페스트를 클러스터에 적용합니다.

kubectl apply -f multus-manifest.yaml

NetworkAttachmentDefinition 매니페스트 만들기

포드가 추가 네트워크에 연결할 수 있도록 하려면 NetworkAttachmentDefinition 매니페스트를 만듭니다. 이 매니페스트는 포드가 네트워크에 연결되는 방식을 정의하고 Whereabouts와 같은 IPAM 플러그인이 할당하는 IP 주소 범위를 지정합니다. 이 범위는 노드의 추가 네트워크 인터페이스를 연결하는 서브넷의 일부여야 합니다.

  1. 이 매니페스트를 nad.yaml로 저장합니다. 이 매니페스트는 IPVLAN 및 Whereabouts 플러그인을 사용합니다.

    apiVersion: "k8s.cni.cncf.io/v1"
    kind: NetworkAttachmentDefinition
    metadata:
      name: NAD_NAME
    spec:
      config: '{
        "cniVersion": "0.3.1",
        "plugins": [
          {
            "type": "ipvlan",
            "master": "eth1",
            "mode": "l2",
            "ipam": {
              "type": "whereabouts",
              "range": SECONDARY_RANGE_NAME
            }
          }
        ]
      }'
    

    매니페스트에는 다음 필드가 포함됩니다.

    • NAD_NAME: NetworkAttachmentDefinition의 이름입니다.
    • master: IPVLAN의 master 인터페이스 역할을 하는 노드의 보조 네트워크 인터페이스 이름입니다. GKE에서 보조 네트워크 인터페이스는 일반적으로 eth1로 시작하고 순차적으로 이름이 지정됩니다. 인터페이스 이름을 확인하려면 SSH를 사용하여 노드에 연결하고 ip addr 명령어를 실행합니다.
    • range: 포드 인터페이스의 IP 주소 범위입니다. 이는 포드에 대해 만든 보조 IPv4 범위 (SECONDARY_RANGE_NAME)와 동일합니다. 예를 들어 172.16.1.0/24입니다.
  2. 매니페스트를 클러스터에 적용합니다.

    kubectl apply -f nad.yaml
    

포드를 추가 네트워크에 연결

포드를 추가 네트워크에 연결하려면 k8s.v1.cni.cncf.io/networks 주석을 포드 매니페스트에 추가합니다. 여러 네트워크의 경우 다음 형식으로 쉼표로 구분된 NetworkAttachmentDefinition 이름 목록을 제공합니다. <namespace>/<nad-name>

다음 예시는 default 네임스페이스에서 NAD_NAME이라는 NetworkAttachmentDefinition에 연결되는 포드 매니페스트를 보여줍니다.

apiVersion: v1
kind: Pod
metadata:
  name: samplepod
  annotations:
    k8s.v1.cni.cncf.io/networks: default/NAD_NAME
spec:
  containers:
  - name: sample-container
    image: nginx

NAD_NAME을 만든 NetworkAttachmentDefinition의 이름으로 바꿉니다.

이 매니페스트를 적용하면 Kubernetes는 NetworkAttachmentDefinition에서 지정하는 네트워크에 연결된 추가 네트워크 인터페이스 (net1)로 포드를 만듭니다.

포드의 추가 IP 주소 확인

포드를 추가 네트워크에 연결한 후 포드가 추가 IP 주소를 수신하는지 확인하려면 포드 내의 네트워크 인터페이스를 검사합니다.

  1. samplepod를 검사하고 추가 IP 주소를 확인하려면 다음 명령어를 사용합니다.

    $kubectl describe pod PODNAME
    

    PODNAME을 포드 이름(예: samplepod)으로 바꿉니다.

  2. 출력을 검토합니다. eth0 인터페이스에는 포드의 기본 IP 주소가 있습니다. Whereabouts 플러그인은 추가 IP 주소를 다른 인터페이스(예: net1)에 할당합니다.

    출력은 다음과 비슷합니다.

    k8s.v1.cni.cncf.io/network-status:
      [{
        "name": "gke-pod-network",
        "interface": "eth0",
        "ips": [
          "10.104.3.4"
        ],
        "mac": "ea:e2:f6:ce:18:b5",
        "default": true,
        "dns": {},
        "gateway": [
          "\u003cnil\u003e"
        ]
      },{
        "name": "default/my-nad",
        "interface": "net1",
        "ips": [
          "10.200.1.1"
        ],
        "mac": "42:01:64:c8:c8:07",
        "dns": {}
      }]
    k8s.v1.cni.cncf.io/networks: default/my-nad
    

    이 예시에서 10.104.5.19eth0의 기본 IP 주소이고 10.200.1.1net1의 추가 IP 주소입니다.

다음 단계