12-13 22:10
반응형
250x250
Recent Posts
Recent Comments
Link
관리 메뉴

DevOps Tasks

[Kubernetes] AWS EKS에서 Kubernetes Pod별 보안 그룹 설정: 네트워크 보안 강화 본문

Kubernetes

[Kubernetes] AWS EKS에서 Kubernetes Pod별 보안 그룹 설정: 네트워크 보안 강화

데밥스 2024. 12. 3. 16:21
728x90
반응형

`AWS EKS`에서 Kubernetes Pod마다 개별 보안 그룹을 할당하면 서비스별로 네트워크 접근을 제어하여 보안을 강화할 수 있습니다.

이 가이드는 Amazon VPC CNI 플러그인을 사용하여 Pod별 보안 그룹을 설정하고, Karpenter를 통해 효율적인 노드 프로비저닝을 지원하는 방법을 단계별로 설명합니다.


1. AWS CNI 및 VPC 보안 그룹 할당 관련 로그 분석

1-1. 보안 그룹 할당 요청

로그

Normal   SecurityGroupRequested  64s  vpc-resource-controller
Pod will get the following Security Groups [sg-xxxxxxxxxxxxxxxxx]

 

  • `vpc-resource-controller`가 Pod에 보안 그룹 [sg-xxxxxxxxxxxxxxxxx]을 할당합니다.
  • 이는 Pod가 네트워크 인터페이스 설정 중에 필요한 보안 그룹을 요청하고 할당받는 과정입니다.

 

1-2. Pod Sandbox 생성 실패

로그

Warning  FailedCreatePodSandBox  64s  kubelet  Failed to create pod sandbox: rpc error:
code = Unknown desc = failed to setup network for sandbox "...": plugin type="aws-cni"
name="aws-cni" failed (add): add cmd: failed to assign an IP address to container
  • `AWS CNI` 플러그인이 Pod에 필요한 IP 주소를 할당하는 과정에서 문제가 발생하여 Pod Sandbox 생성에 실패한 경우입니다.
  • 이는 네트워크 설정 단계에서 흔히 발생하는 문제로, 플러그인 설정을 점검해야 합니다.

 

1-3. 네트워크 리소스 할당

로그

Normal   ResourceAllocated  63s  vpc-resource-controller  Allocated
[{"eniId":"eni-xxxxxxxxxxxxxxxxx","privateIp":"10.xx.xx.xx"}] to the pod
  • `vpc-resource-controller`가 Pod에 ENI(eni-xxxxxxxxxxxxxxxxx)와 IP(10.xx.xx.xx)를 성공적으로 할당했습니다.
  • 이를 통해 Pod는 네트워크 트래픽 관리가 가능합니다.

 


2. Amazon VPC CNI 플러그인 설정

2-1. CNI 플러그인 버전 확인

`Amazon VPC CNI 플러그인`의 최소 버전은 `v1.7.7` 이상이어야 합니다. 현재 버전을 확인하려면 아래 명령어를 사용하세요

kubectl describe daemonset aws-node --namespace kube-system | grep amazon-k8s-cni: | cut -d : -f 3

출력 결과가 `v1.7.7` 이상이어야 보안 그룹과 ENI 기능이 지원됩니다.

 


3. 보안 그룹 할당을 위한 IAM 권한 설정

Pod별로 보안 그룹을 할당하려면 `AmazonEKSVPCResourceController` 정책을 클러스터 IAM 역할에 추가해야 합니다.

3-1. 클러스터 IAM 역할에 정책 연결

cluster_role=$(aws eks describe-cluster --name <my-cluster> --query cluster.roleArn --output text | cut -d / -f 2)
aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKSVPCResourceController --role-name $cluster_role

 


4. Pod ENI 활성화 설정

`Pod ENI`는 Pod에 직접 ENI를 연결하여 개별 보안 그룹을 적용하는 기능입니다.

4-1. Pod ENI 활성화

kubectl set env daemonset aws-node -n kube-system ENABLE_POD_ENI=true

4-2. 트렁크 네트워크 인터페이스 설정

kubectl set env daemonset aws-node -n kube-system RESERVED_ENIS=1

이 설정으로 Pod의 최대 수용 밀도와 실제 가능한 Pod 수 간의 불일치를 방지할 수 있습니다.

 


5. Pod에 보안 그룹 설정 및 CNINode 확인

5-1. 트렁크 인터페이스 확인

kubectl get nodes -o wide -l vpc.amazonaws.com/has-trunk-attached=true

5-2. CNINode 리소스 확인

Pod 보안 그룹 설정을 확인하려면 `CNINode` 리소스를 확인합니다:

kubectl get cninode -A

 


6. Karpenter와 Pod ENI 활용

Pod에 보안 그룹을 연결하려면 `Pod ENI` 활성화 이후, 리소스 요청을 설정해야 합니다.

6-1. Deployment 매니페스트에 Pod ENI 리소스 요청 추가

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-secure-app
spec:
  replicas: 2
  template:
    spec:
      containers:
      - name: app-container
        image: nginx
        resources:
          limits:
            vpc.amazonaws.com/pod-eni: "1"  # Pod당 ENI 1개 할당

6-2. Karpenter에서 ENI 예약 설정

Karpenter의 컨트롤러 설정 파일에서 아래 값을 추가하여 Pod ENI를 지원합니다:

reservedENIs: "1"

 

 


7. 주요 aws-node 옵션 정리

옵션 설명
ENABLE_POD_ENI Pod ENI 활성화.
RESERVED_ENIS ENI 예약 설정.
POD_SECURITY_GROUP_ENFORCING_MODE 보안 그룹 적용 모드 설정.
AWS_VPC_K8S_CNI_EXTERNALSNAT 외부 네트워크 아웃바운드 트래픽 설정.

 


💡 결론적으로

Pod마다 `ENI`를 추가로 할당함으로써 네트워크 트래픽이 서비스 단위로 격리되고, 보안 그룹을 통해 더 세밀한 제어가 가능합니다.

이는 특히 멀티 테넌트 환경이나 보안 요구사항이 높은 애플리케이션에서 필수적입니다.

이 접근 방식은 네트워크 자원 사용량 증가를 수반하지만, 이를 통해 대규모 클러스터에서도 서비스 간 보안을 크게 강화할 수 있습니다.

지속적인 모니터링과 설정 최적화를 통해 더욱 안정적이고 안전한 Kubernetes 환경을 구축할 수 있습니다.

 

 

728x90
반응형