Kubernetes

[NKS] NodePort / LoadBalancer 서비스 생성

uuuhhh 2022. 11. 13. 01:47

⚠️ NKS(Naver Kubernetes Service) 환경에서 진행하였습니다. ⚠️

 

 

▪︎ NodePort 타입으로 서비스 생성 및 접속


  • NodePort 타입으로 서비스를 생성해보자 !
apiVersion: v1
kind: Service
metadata:
  name: cn-app-svc-n
spec:
  selector:
    app: cn-app
  ports:
    - port: 8080
      targetPort: 8080
  type: NodePort

 

  • 서비스 생성 확인 후 할당된 NodePort(31374) 확인 !

 

  • 노드의 IP 확인

 

  • 음.. Node IP + NodePort로 접속을 시도했는데.. 과묵하구먼..

 

🚨 트러블 슈팅


1. 포트 지정 문제 ?

  • 처음에는 ‘파드에 포트를 잘못 지정해주고 타겟 포트랑 일치가 안돼서 그런가..’ 라는 의문점으로 시작하게 되었다.
  • 하지만 파드 매니페스트 작성 시 포트와 타겟 포트를 동일하게 지정해도 똑같이 NodePort 서비스에 접속이 되지 않았다.
  • 트래픽 → 노드 포트 → 파드 포트 → 타겟 포트 → 컨테이너
  • 여기서 포트 지정과는 현재 이슈와 아무런 관계가 없다고 판단하였다.

 

2. Private Cluster or Public Cluster 문제 ? 

  • 많이 헤매고 여러 레퍼런스를 찾던 도중에 관련 문서에서 힌트를 찾을 수 있게 되었다 !
 

Amazon EKS 클러스터에서 실행되는 Kubernetes 서비스 공개

Amazon EKS 클러스터에서 실행 중인 Kubernetes 서비스를 공개하려면 어떻게 해야 합니까? 최종 업데이트 날짜: 2022년 09월 16일 Amazon Elastic Kubernetes Service(Amazon EKS) 클러스터에서 실행 중인 Kubernetes 서비

aws.amazon.com

‘노드가 프라이빗 서브넷에 있고 VPC 내부 또는 VPC를 통해서만 연결할 수 있는 경우 노드의 프라이빗 IP 주소를 확인합니다.’

 

  • 현재 사용하고 있는 클러스터는 Private Subnet에서 생성한 Private Cluster이다.
  • 여기서 반짝✨ 빛이 났다.
    • 외부에서 Node IP:NodePort로 접속 시도
    • 현재 Private Subnet에 있는 노드에 외부에서 Inbound로 들어갈 수 있는 문이 없음
    • 들어갈 수도 없고 알 수 없는 목적지를 향한 트래픽은 헤매다가 Time Out..!

 

  • 그럼 여기서 두 가지 방법을 생각하였다.
    1. Public Subnet에 Public Type으로 Kubernetes Cluster 새로 생성하기
    2. 같은 VPC 내 Public Subnet에 Bastion Host Server를 생성하고 Private Type 클러스터에 생성된 NodePort 서비스 접속하기

 

3. 보안 그룹 문제 ?

  • 외부 트래픽을 수신할 수 있도록 워커 노드의 보안 그룹(ACG : Access control Group)을 설정해보고 서비스에 접속해보기

 

 

 

2-1. Public Subnet에 Public Type Kubernetes Cluster 새로 생성 후 서비스 접속


  • public 타입으로 cluster를 구축해 보았다.

 

  • 생성 완료 !
    • 여기서 워커 노드들에 public IP가 할당되어 있는 모습을 볼 수 있다.

 

  • NodePort Type 서비스를 생성해보고 서비스에 접속을 시도해 보았다.

 

  • 또 과묵하구먼..

 

  • 실패..
  • 였지만.. 원인 분석 후 3번에서 해결 !

 

 

2-2. Bastion Host Server 생성하고 Private Type 클러스터 서비스 접속하기


  • Node 풀이 속해있는 VPC내의 Public Subnet에 Bastion Server를 생성

 

  • 접속 !

 

  • NodePort Service에 접속 성공 !

 

 

3. 특정 NodePort에 관한 보안 그룹(ACG : Access control Group) 설정


  • 2-1의 실패 원인을 분석해 보았다.
    • NodePort는 해당 서비스를 외부에 워커 노드에 대한 특정 포트를 공개하는 것이다.
    • 그렇다면 외부에서 특정 포트를 통해 노드에 접근하기 위해서는 외부 트래픽을 수신할 수 있도록 워커 노드의 보안 그룹(ACG : Access Controll Group)을 설정해줘야 하지 않을까 ?
  • 해당 특정 NodePort에 대한 Inbound 규칙 추가 및 노드에 적용

 

 

  • 서비스에 접속 !

 

  • 성공 ㅎㅎㅎㅎ

 

 

▪︎ LoadBalancer 타입으로 서비스 생성 및 접속


  • LoadBalancer 타입으로 서비스를 생성 !
apiVersion: v1
kind: Service
metadata:
  name: cn-app-svc-l
spec:
  selector:
    app: cn-app
  ports:
  - port: 8080
    targetPort: 8080
  type: LoadBalancer

 

  • 서비스 생성
    • and pending

 

  • loadbalancer 주소 할당 !

 

  • 위 주소로 서비스에 접근 !

 

  • 성공❗️❗️