EKS로 동작하는 K8s Pod에 EIP를 붙여 보자

Kubernetes에서는 Service를 통해 cluster 내에서 동작하는 서비스를 외부로 노출한다.
(서비스를 Service로 노출하다니!)
이 Service는 platform의 영향을 받게 되는데, EKS는 Load Balance로 할 경우 Elastic Load Balancer를 붙여 준다.
그 외에도 Cluster IP나 Node Port 등이 존재하는데, 이에 대한 설명은 생략하고, Service가 아닌 Pod에 Elastic IP를 붙일 순 없을까 생각해 봤다.
(정확하게 말하자면, out-bound의 IP를 고정 IP로 지정하기)

Pod에 고정 IP 필요한 경우

매우 드문 경우이겠지만, 몇몇 서비스 들은 IP주소로 접근을 제한하기도 한다.
IP 필터링으로 보안을 강화 하는건 당연한 것이지만, 이번 경우는 IP만 열려있으면 별도의 인증없이 서비스 이용이 가능하다는 것이다.
그레서 IP가 매우 중요한 인증수단이 되버리는데, AWS에서는 고정 IP를 받기위해서 Elatic IP를 써야한다. 그것이 Kubernetes 일지라도…

Pod 정보 받기

  • kubectl을 이용하여 pod에 할당된 IP를 확인
    $ kubectl get pod
    NAME                                    READY   STATUS    RESTARTS   AGE
    your-pod-name-unique-randomdvalue       1/1     Running   0          38d
    
    $ kubectl describe pod/your-pod-name-unique-randomdvalue
    Name:           your-pod-name-unique-randomdvalue
    Namespace:      default
    Node:           ip-99-99-99-11.ec2.internal/99.99.99.11
    Start Time:     Fri, 02 Nov 2018 20:24:16 +0900
    Labels:         pod-template-hash=2463000000
                    run=your-pod-name
    Annotations:    <none>
    Status:         Running
    IP:             99.99.99.222
    Controlled By:  ReplicaSet/your-pod-name-replica
    Containers:
    ...
    
    • IP는 Node가 배포된 VPC의 IP range안에서 랜덤하게 할당됨(Private IP)

Pod의 Private IP를 이용해 ENI찾기

  • Elastic Network Interface(이하 ENI)
    • Pod에게 private IP가 있다는 말은 ENI가 존재한다는 의미와 동일
    • AWS EKS는 kubernetes의 모든 동작을 지원하는데, AWS의 resource를 적극 활용함
      • Storage는 EBS를 활용하는 것 처럼 가상 네트워크 인터페이스 조차도 AWS 자원(ENI)을 활용하네…
  • AWS Console에서 EC2 > Network Interface 검색
    • ENI의 ID 획득

Elastic IP 설정

  • Elastic IP(이하 EIP)
    • EIP를 할당(allocate)
    • Associate할 대상 선택 시, Resource type을 Instance가 아닌 Network interface로 선택
      • Pod은 한 worker node(= instance) 아래에 여러개가 존재
      • 개별 pod은 각자에게 할당된 ENI에 연결
      • 만약 Instance로 지정하려 하면 설정 적용이 실패
    • ENI에 EIP를 붙이고 나면, 해당 pod에서 나가는 traffic의 source는 EIP 주소가 됨

문제점

Pod이 죽으면 ENI도 사라져 EIP는 (아마)주인을 잃게되고 비용만 발생하게 된다.
(EIP는 무료이지만, 할당 후 사용하지 않으면 비용이 발생함)
Pod 이라는 생사를 보증할 수 없는 가상의 존재에 고정 IP를 부여하고, 이 IP로만 인증 해야하는 아키텍처는 지양해야 마땅하겠다.
하지만, 이 바닥은 늘 이상적으로 돌아가지 않으니 Pod이 바뀌거나 scale out/in 되더라도 유지할 수 있는 방법을 고민할 필요가 있을 것이다.