CNI 사용자 지정 네트워킹 - Amazon EKS

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

CNI 사용자 지정 네트워킹

기본적으로 새 네트워크 인터페이스가 포드에 할당되면 ipamD는 노드의 기본 네트워크 인터페이스 보안 그룹 및 서브넷을 사용합니다. 포드가 제어 플레인 보안 그룹과 동일한 VPC 내의 다른 보안 그룹 또는 서브넷을 사용하도록 해야 할 수 있습니다. 다음 예를 참조하십시오.

  • 서브넷에서 사용 가능한 IP 주소의 수는 제한되어 있습니다. 이렇게 하면 클러스터에서 생성할 수 있는 포드 수가 제한될 수 있습니다. 포드에 다른 서브넷을 사용하면 사용 가능한 IP 주소의 수를 늘릴 수 있습니다.

  • 보안상의 이유로 포드는 노드의 기본 네트워크 인터페이스와 다른 보안 그룹 또는 서브넷을 사용해야 합니다.

  • 노드는 퍼블릭 서브넷에서 구성되며, NAT 게이트웨이를 사용하여 포드를 프라이빗 서브넷에 배치하려고 합니다. 자세한 정보는 외부 SNAT(Source Network Address Translation) 단원을 참조하십시오.

참고
  • 자체 관리형 노드 그룹 또는 사용자 지정 AMI를 사용하는 시작 템플릿으로 생성된 관리형 노드 그룹에 대해 사용자 지정 네트워킹을 구성할 수 있습니다. 이 주제의 절차에는 Kubernetes용 Amazon VPC CNI 플러그인 버전 1.4.0 이상이 필요합니다. CNI 버전을 확인하고 필요한 경우 업그레이드하려면 Kubernetes 업그레이드용 Amazon VPC CNI 플러그인 단원을 참조하십시오.

  • 사용자 지정 네트워크를 활성화하면 이를 사용하는 각 노드에서 사용 가능한 네트워크 인터페이스(및 포드에 사용 가능한 모든 IP 주소)가 효과적으로 제거됩니다. 사용자 지정 네트워크가 활성화되면 노드의 기본 네트워크 인터페이스가 포드 배치에 사용되지 않습니다.

  • 이 주제의 절차에서는 인스턴스의 기본 네트워크 인터페이스와 다른 보안 그룹을 보조 네트워크 인터페이스에 연결하도록 CNI 플러그인에 지시합니다. 보조 네트워크 인터페이스를 사용하는 모든 포드는 여전히 보조 네트워크 인터페이스 사용을 공유하며 모두 동일한 보안 그룹을 사용합니다. 다른 보안 그룹을 개별 포드에 할당하려면 포드에 대한 보안 그룹를 사용할 수 있습니다. 포드의 보안 그룹은 각각 고유한 보안 그룹을 할당할 수 있는 추가 네트워크 인터페이스를 생성합니다. 포드의 보안 그룹은 사용자 지정 네트워킹을 사용하거나 사용하지 않고 사용할 수 있습니다.

CNI 사용자 지정 네트워킹을 구성하려면 다음을 수행합니다.

  1. 보조 CIDR 블록을 클러스터의 VPC에 연결합니다. 자세한 내용은 IPv4의 VPC에 보조 CIDR 블록 연결Amazon VPC 사용 설명서을 참조하십시오.

  2. 보조 CIDR 블록을 사용하여 각 가용 영역에 대한 VPC에서 서브넷을 생성합니다. 사용자 지정 서브넷은 노드가 시작된 서브넷과 다른 VPC CIDR 블록에 위치해야 합니다. 자세한 내용은 https://docs.aws.amazon.com/vpc/latest/userguide/;working-with-vpcs.html#AddaSubnetVPC에서 서브넷 생성Amazon VPC 사용 설명서을 참조하십시오.

  3. AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG에서 true 환경 변수를 aws-node로 설정합니다.DaemonSet

    kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true
  4. 현재 설치된 CNI 버전을 봅니다.

    kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2

    결과:

    amazon-k8s-cni:1.7.5
  5. CNI 버전 1.3 이상이 설치되어 있는 경우 6단계로 건너뛸 수 있습니다. 클러스터에 대한 새 ENIConfig 사용자 지정 리소스를 정의합니다.

    1. ENIConfig.yaml이라는 파일을 생성하고 다음 콘텐츠를 붙여 넣습니다.

      apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: eniconfigs.crd.k8s.amazonaws.com spec: scope: Cluster group: crd.k8s.amazonaws.com version: v1alpha1 names: plural: eniconfigs singular: eniconfig kind: ENIConfig
    2. 다음 명령을 사용하여 클러스터에 파일을 적용합니다.

      kubectl apply -f ENIConfig.yaml
  6. 포드를 예약하려는 각 서브넷에 대해 ENIConfig 사용자 지정 리소스를 생성합니다.

    1. 각 네트워크 인터페이스 구성에 대해 고유한 파일을 생성합니다. 각 파일은 name에 대해 고유한 값이 있는 다음 콘텐츠를 포함해야 합니다. 다중 AZ Auto Scaling 그룹을 더 간단하게 배포할 수 있으므로 서브넷의 name와 일치하는 가용 영역에 대한 값을 사용하는 것이 좋습니다(아래 6c단계 참조).

      이 예의 경우 이름이 us-west-2a.yaml인 파일이 생성됩니다. , <example values> 및 namesubnet를 사용자의 값으로 바꿉니다.securityGroups 이 예에서는 모범 사례를 따르고 name에 대한 값을 서브넷이 있는 가용 영역로 설정합니다. 포드용으로 연결할 특정 보안 그룹이 없는 경우 지금은 이 값을 비어 둘 수 있습니다. 나중에 ENIConfig에서 노드 보안 그룹을 지정합니다.

      apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: <us-west-2a> spec: securityGroups: - <sg-0dff111a1d11c1c11> subnet: <subnet-011b111c1f11fdf11>
      참고

      각 서브넷 및 보안 그룹 조합에는 자체 사용자 지정 리소스가 필요합니다. 동일한 가용 영역에 여러 서브넷이 있는 경우 다음 명령을 사용하여 각 서브넷의 노드에 일치하는 구성 이름을 주석으로 추가합니다.

      kubectl annotate node <node-name>.<region>.compute.internal k8s.amazonaws.com/eniConfig=<subnet1ConfigName>
    2. 다음 명령을 사용하여 생성된 각 사용자 지정 리소스 파일을 클러스터에 적용합니다.

      kubectl apply -f <us-west-2a>.yaml
    3. (선택 사항이지만 다중 가용 영역 노드 그룹에 권장됨) 기본적으로 Kubernetes는 노드의 가용 영역를 failure-domain.beta.kubernetes.io/zone 레이블에 적용합니다. 6a단계에서 권장한 대로 VPC의 각 ENIConfig 뒤에 가용 영역 사용자 지정 리소스의 이름을 붙인 경우, 다음 명령을 사용하여 Kubernetes가 해당 ENIConfig를 노드의 가용 영역에 자동으로 적용하도록 설정할 수 있습니다.

      kubectl set env daemonset aws-node -n kube-system ENI_CONFIG_LABEL_DEF=failure-domain.beta.kubernetes.io/zone
      참고

      ENI_CONFIG_ANNOTATION_DEF 환경 변수에 대한 k8s.amazonaws.com/eniConfig 키가 포함된 주석이 aws-node 데몬 세트의 컨테이너 사양에 없어야 합니다. 이러한 주석이 있는 경우 ENI_CONFIG_LABEL_DEF 값이 재정의되므로 주석을 제거해야 합니다. kubectl describe daemonset aws-node -n kube-system | grep ENI_CONFIG_ANNOTATION_DEF 명령을 사용하여 이 변수가 설정되어 있는지 확인할 수 있습니다. 출력이 반환되지 않으면 변수가 설정되지 않은 것입니다.

  7. 새 자체 관리형 노드 그룹을 생성합니다. 관리형 노드 그룹의 경우 시작 템플릿이 있는 사용자 지정 AMI를 사용합니다.

    1. 다음 수식을 사용하여 각 노드에서 예약할 수 있는 최대 포드 수를 결정합니다.

      maxPods = (number of interfaces - 1) * (max IPv4 addresses per interface - 1) + 2

      예를 들어 m5.large 인스턴스 유형은 각 인터페이스에 대해 3개의 네트워크 인터페이스와 10개의 IPv4 주소를 지원합니다. 다음 계산에 표시된 대로 값을 수식에 삽입하면 인스턴스는 최대 20개의 포드를 지원할 수 있습니다.

      maxPods = (3 - 1) * (10 - 1) + 2 = 20

      각 인스턴스 유형에 대한 최대 네트워크 인터페이스 수에 대한 자세한 내용은 https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI의 Linux 인스턴스용 Amazon EC2 사용 설명서인스턴스 유형별 네트워크 인터페이스당 IP 주소를 참조하십시오.

    2. 자체 관리형 노드에 대한 단계를 수행하여 새 자체 관리형 노드 그룹을 생성합니다.자체 관리형 Amazon Linux 노드 시작 AWS CloudFormation 템플릿을 연 후 지침에 설명된 대로 값을 입력합니다. 배포한 ENIConfig 리소스에 지정한 서브넷을 지정합니다. BootstrapArguments 필드에 다음 값을 입력합니다.

      --use-max-pods false --kubelet-extra-args '--max-pods=<20>'
  8. 노드 그룹이 생성된 후 서브넷용으로 생성된 보안 그룹을 기록하고 보안 그룹을 연결된 ENIConfig에 적용합니다. 다음 명령으로 각 ENIConfig를 편집하여 <eniconfig-name>를 사용자의 값으로 바꿉니다.

    kubectl edit eniconfig.crd.k8s.amazonaws.com/<eniconfig-name>

    6a 및 6c 단계에서 모범 사례를 따른 경우 eniconfig-name이 가용 영역 이름에 해당합니다.

    spec 섹션은 다음과 같아야 합니다.

    spec: securityGroups: - <sg-0dff222a2d22c2c22> subnet: <subnet-022b222c2f22fdf22>
  9. 이 절차를 완료하기 전에 클러스터에 포드가 배치된 노드가 있는 경우 해당 노드를 종료해야 합니다. 레이블에 등록된 새 노드만 새 사용자 지정 네트워킹 기능을 사용합니다.k8s.amazonaws.com/eniConfig