Link Search Menu Expand Document

애플리케이션 노출법

배포한 애플리케이션을 노출하는 방법

  1. 간단한 방법
    • port-forward
    • HostPort
    • hostNetwork
  2. NodePort
  3. LoadBalancer
  4. ExternalName
  5. ClusterIP, Headless
  6. Endpoints
  7. Ingress

간단한 방법(port-forward, HostPort, hostNetwork)

포트 포워딩

  • 호스트 PC에서 가상 머신으로 접속 시 포트 포워딩 사용

애플리케이션 노출법 - 01 간단한 방법

port-forward 옵션

애플리케이션 노출법 - 02 간단한 방법

  • k port-forward fwd-chk-hn 80:80: 마스터 노드의 80번 포트를 fwd-chk-hn 노드의 80번 포트로 포워딩
  • 노드가 재시작될 경우 포트 포워딩이 사라짐

HostPort

애플리케이션 노출법 - 03 간단한 방법

  • containerPort: 파드의 포트
  • hostPort: 노드의 포트
  • 노드의 IP와 포트를 알고 있어야 하므로 실용적이지 않음

HostNetwork

애플리케이션 노출법 - 04 간단한 방법

  • eth0을 그대로 쓸 수 있게 해주는 기능
  • 클러스터의 노드에 직접 접속하므로 실용적이지 않음

노드포트(NodePort)

nodeport.yaml

애플리케이션 노출법 - 05 노드포트

  • selector: 노출할 오브젝트
  • nodePort: 노드 포트, 미입력시 랜덤으로 지정
  • port: 서비스 포트
  • targetPort: 파드 포트

Overview

애플리케이션 노출법 - 06 노드포트

  1. 사용자가 워커 노드의 NodePort 서비스 포트로 접속
  2. 연결을 NodePort 서비스로 보내줌
  3. NodePort는 워커 노드의 파드로 연결을 보냄

로드밸런서(LoadBalancer)

loadbalancer-11.yaml

애플리케이션 노출법 - 07 로드밸런서

  • port: 서비스 포트
  • targetPort: 파드 포트
  • Metallb로 접근

loadbalancer-12.yaml

애플리케이션 노출법 - 08 로드밸런서

Overview

애플리케이션 노출법 - 09 로드밸런서

  1. 사용자는 ConfigMap을 통하여 EXT IP로 접속
  2. 내부의 파드로 연결됨

외부이름(ExternalName)

externalname-1.yaml

애플리케이션 노출법 - 10 외부이름

externalname-2.yaml

애플리케이션 노출법 - 11 외부이름

Overview

애플리케이션 노출법 - 12 외부이름

  • 컨테이너 내부에서 외부 도메인을 aliasing 하는 데에 사용

클러스터주소(ClusterIP)와 헤드리스(Headless)

clusterip.yaml

애플리케이션 노출법 - 13 클러스터IP와 헤드리스

  • 파드와 파드의 연결을 위한 내부 IP

headless.yaml

애플리케이션 노출법 - 14 클러스터IP와 헤드리스

  • 클러스터 IP를 None으로 지정하면 Headless가 됨

클러스터주소와 헤드리스 비교

  • 헤드리스를 사용할 경우 IP 주소를 소진하지 않고 스테이트풀셋을 연결할 수 있음
  • 스테이트풀셋 각각의 파드는 고정된 이름을 갖고 각각의 목적을 갖고 있도록 설계할 수 있음
    • NodePortLoadBalancer를 사용할 경우 각각의 파드에 대한 접속을 통제하기 어려움
    • 따라서 헤드리스를 사용하여 스테이트풀셋에 대한 연결을 관리

sts-svc-domain-headless.yaml

애플리케이션 노출법 - 15 클러스터IP와 헤드리스

nslookup sts-chk-hn-0.sts-svc.domain
nslookup sts-chk-hn-1.sts-svc.domain
nslookup sts-chk-hn-2.sts-svc.domain
  • 위와 같은 명령어로 스테이트풀셋 내 각각의 노드에 서비스 이름으로 접근 가능
  • serviceName을 통하여 노드와 헤드리스가 결합됨
  • LoadBalancer로 노출은 가능하나 스테이트풀셋의 목적에 부합하지 않으므로 자주 사용하지는 않음

엔드포인트(Endpoints)

loadbalancer.yaml의 엔드포인트

애플리케이션 노출법 - 16 엔드포인트

  • 파드의 개수만큼 엔드포인트가 자동으로 생성됨
  • 외부에 노출된 서비스를 통하여 도달하는 파드의 IP를 일컬음

service-endpoints.yaml

애플리케이션 노출법 - 17 엔드포인트

  • metadata.name을 클러스터와 일치시켜 수동으로 엔드포인트 생성
  • 위와 같이 로드밸런서의 IP를 엔드포인트로 지정할 경우 로드밸런서를 거쳐 최종적으로 파드에 도달

인그레스(Ingress)

NodePort와 인그레스

애플리케이션 노출법 - 18 인그레스

  1. 사용자가 워커 노드의 포트로 접근
  2. NodePort 서비스로 이동
  3. 접속 경로에 따라 해당하는 파드로 이동

LoadBalancer와 인그레스

애플리케이션 노출법 - 19 인그레스

  1. 사용자가 로드밸런서 서비스에 접근
  2. 접속 경로에 따라 서비스로 이동
  3. 각각의 서비스의 엔드포인트로 이동

ingress.yaml

애플리케이션 노출법 - 23 인그레스

  • path를 지정하여 각각의 서비스와 연결

레이블(labels)과 애너테이션(annotations)의 차이

애플리케이션 노출법 - 24 인그레스

  • Labels: 관리자, 개발자가 인식하는 부가 정보
  • Annotation: 시스템이 인식하는 부가 정보

각 타입별 ingress controller 설정의 차이

애플리케이션 노출법 - 25 인그레스

  • NodePort의 경우 무작위로 지정되나 실습의 편의를 위해 spec 수정
  • LoadBalancer는 포트를 지정할 필요 없음