쿠버네티스에서의 네트워크 환경
쿠버네티스의 네트워킹 환경에는 내부용 서비스, 외부용 서비스, 특수한 형태 등이 있습니다.
파드는 클러스터 외부의 요청이나 클러스터 내부의 다른 파드의 요청에 응답하고, 다른 파드의 애플리케이션에 접근하기 위해 파드를 찾을 수 있어야합니다.
하지만 쿠버네티스는 기존의 시스템 호스트 이름, 정적 IP 할당 등의 기능을 사용 할 수 없습니다.
1. 파드는 일회성으로 동작하기 위해 설계되어 언제든지 제거될 수 있습니다.
2. 특정 노드에 파드가 스케줄링 되고 IP 주소가 동적할당됩니다. 파드의 IP 주소를 예측할 수 없습니다.
3. 분산 아키텍처 및 수평 스케줄링의 경우 여러 파드가 같은 애플리케이션을 제공합니다. 각 파드마다 IP가 존재하고, 스케일링될 때마다 클라이언트는 해당 IP를 알 수 없습니다.
이를 해결하기 위해 단일 고정 IP를 통해 서비스를 제공해야합니다.
서비스
파드 그룹에서 실행중인 애플리케이션에 단일 네트워크 진입점을 부여해주는 리소스입니다.
부여된 IP는 해당 서비스가 종료될 때까지 변경되지 않습니다.
클라이언트는 서비스가 제공하는 IP 및 포트를 통해 접근하고, kube-dns가 적용되어 있다면 이름에 기반한 고유한 FQDN이 부여됩니다.
레이블 셀렉터를 이용해 서비스 대상을 설정하고 엔드포인트 리소스로 관리합니다.
k8s의 Service, Endpoints
서비스와 엔드포인트는 k8s의 API 서버로 접근 가능합니다.
선언형으로 service를 생성하는 법
명령형으로 Service를 생성하는 법
svc.spec
ClusterIPs
서비스의 IP를 사용자가 직접 할당합니다. 그러나 kube-dns가 있어 잘 사용하지 않습니다.
svc.spec.ports
클라이언트가 접근하는 서비스의 포트입니다
ports.name : 포트의 이름을 부여합니다
ports.port : 실제 서비스에 노출시킬 포트입니다
ports.protocol : TCP, UDP, SCTP 중 사용할 프로토콜입니다.
ports.targetPort : 파드의 포트 (서비스 > 파드)입니다.
svc.spec.selector
서비스가 연결하기 위한 파드 레이블 셀렉터입니다
svc.spec.type
ExternalName, ClusterIP, NodePort, LoadBalancer가 있고, defualt는 ClusterIP
NodePort, LoadBalancer 는 외부로 노출시키기 위한 것입니다
ClusterIP는 클러스터 내부를 위한 것입니다.
ClusterIP는 쿠버네티스 클러스트 내에서 접근 가능한 타입입니다.
클러스터 외부에서 접근할 떄는 EXTERNAL-IP를 사용하며 로드밸런서 타입으로 선언하면 할당됩니다.
엔드포인트는 레이블 셀렉터에 의해 연결된 파드의 IP 목록을 엔드포인트 리소스로 관리하고 있습니다.
엔드 포인트 이름은 서비스 이름과 같아야 합니다.
파드 생성과 엔드포인트 연결
레플리카셋을 이용해 파드를 생성해보면
IP를 통해 3개의 엔드포인트가 구성된 것을 알 수 있습니다.
서비스 접근 테스트
서비스 접근을 위한 임시 클라이언트 파드를 생성해 접근해봤습니다.
각 파드에 부하 분산이 되고 있는 것을 확인할 수 있습니다.
세션 어피니티
클라이언트의 요청이 항상 같은 파드로 연결하고 싶은 경우 세션 어피니티를 사용
서비스 다중 포트 구성
파드의 애플리케이션이 항상 하나의 포트로만 서비스하는 것이 아니기 때문에 여러 포트를 사용 가능해야합니다.
웹 서버의 경우 HTTP는 80, HTTPS는 443 포트를 사용하기 때문에 다중 포트로 설정해야합니다.
다중 포트 설정은 단순히 yaml에 추가만 해주면 됩니다.
외부 서비스에 연결하기
쿠버네티스를 사용하는 이유는 결국 외부에 웹서비스를 서비스하기 위해서 입니다.
외부와 연결 가능한 리소스 출력의 필드를 보겠습니다.
1. NodePort
NodePort + ClusterIP
쿠버네티스 모든 노드에 외부 접근용 포트를 할당합니다.
노드의 포트를 사용해 접근 가능하고, 노드의 포트로 접근하면 서비스에 의해 파드로 리다이렉션 됩니다.
파드를 실행하지 않은 노드에도 포트가 할당되어 접근이 가능해집니다.
2. LoadBalancer
LoadBalancer + NodePort + ClusterIP
NodePort의 확장형태로 클러스터 외부의 로드 밸런서를 사용해 외부에서 접근 가능합니다.
외부 로드 밸런서로 접근하면 서비스를 통해 파드로 리다이렉션됩니다.
클라우드 공급업체 등에서 지원합니다.
3. ExternalName
외부에서 접근하기 위한 유형이 아닙니다.
외부의 특정 FQDN에 대한 CNAME 매핑을 제공합니다.
파드가 CNAME을 이용해 특정 FQDN과 통신하기 위함입니다.
NodePort 실습
.spec.type: 서비스 타입 (default값: ClusterIP)
.spec.ports.nodePort: 포트를 지정하지 않으면 랜덤한 포트 지정(범위 30000-32767 포트)
노드의 80 포트로 접근하면 서비스의 80 포트로 리다이렉션 되고 그 후의 파드의 8080 포트로 리다이렉션 됩니다.
LoadBalancer 실습
클라우드 인프라에서 LoadBalancer 서비스를 생성 시 클라우드 인프라의 로드 밸런서를 자동으로 프로비저닝 하게 되고, 이 로드 밸런서를 통해 서비스와 파드에 접근이 가능해집니다.
실습을 위해 MetalLB를 설치합니다.
L2 모드
개념 증명 작업 또는 매우 작은 배포를 위한 layer 2 입니다.
모든 트래픽이 확장되지 않는 단일 노드로 이동합니다.
BGP 모드
ECMP (Equal-Cost Multi-Path)를 사용하여 트래픽을 여러 노드에 분산할 수 있습니다.
다만 ECMP를 지원하는 BGP 기능 라우터가 있어야합니다.
라우터가 없고 가상 환경이기 때문에 L2모드로 실습해야합니다.
L2 구성을 위한 디렉토리를 생성합니다.
설정 파일을 작성합니다.
현재 클러스터 대역이 10.0.27 이므로 해당 IP대역을 적습니다.
로드밸런서 오브젝트를 생성합니다.
성공적으로 생성되었고 EXTERNAL-IP가 존재한다는 것을 알 수 있었습니다.
이제 EXTERNAL_IP로 접근된 경우
'Cloud > Kubernates' 카테고리의 다른 글
[k8s, kubernates] 볼륨이란? (1) | 2024.07.16 |
---|---|
[k8s, kubernates] Apache(httpd) 웹서비스 구성 (0) | 2024.07.16 |
[k8s, kubernates]컨트롤러 : 데몬셋 (0) | 2024.07.09 |
[k8s, kubernates] 컨트롤러 : 레플리케이션 컨트롤러와 레플리카셋 (0) | 2024.07.09 |
[k8s, kubernates] 파드 라이프사이클 (0) | 2024.07.09 |