DevOps Tasks
[Kubernetes] AWS EKS에서 Kubernetes Pod별 보안 그룹 설정: 네트워크 보안 강화 본문
`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 환경을 구축할 수 있습니다.
'Kubernetes' 카테고리의 다른 글
AWS Fargate에서 Pod Disruption Budget(PDB)로 OS 패치 대응하기 (0) | 2024.12.03 |
---|---|
[Kubernetes] Karpenter Spot Node 모니터링을 위한 EventBridge 설정 (0) | 2024.12.03 |
[Kubernetes] Karpenter 를 이용한 EKS 노드 그룹 관리 (0) | 2024.12.01 |
[Kubernetes] EKS CoreDNS 및 Kubelet 통신 문제 (0) | 2024.11.30 |
Kubernetes 에서 Finalizer로 인한 리소스 삭제 지연 처리 방법 (1) | 2024.09.28 |