일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 스타트업
- 레이캐스팅
- 도커
- enable_if
- 어셈블리어
- 쿠버네티스
- 어셈블리
- schema first
- 엣지컴퓨팅
- psql extension
- 스플릿키보드
- uuid-ossp
- 이노베이션아카데미
- 동료학습
- mistel키보드
- 창업
- 파이썬
- 정렬
- SFINAE
- Cloud Spanner
- 자료구조
- 프라이빗클라우드
- 텍스트북
- 42서울
- adminbro
- GraphQL
- c++
- raycasting
- 부동소수점
- 42seoul
- Today
- Total
written by yechoi
[쿠버네티스] 네트워킹 - 레이블 셀렉터 / 서비스 / ClusterIP, NodePort, LoadBalancer 본문
[쿠버네티스] 네트워킹 - 레이블 셀렉터 / 서비스 / ClusterIP, NodePort, LoadBalancer
yechoi 2021. 6. 29. 10:54kubernetes networking
pods' name and IP
- 각각의 파드의 서비스에는 이름과 IP가 부여됨
- 이 이름과 IP는 바뀌지 않음. 파드가 죽어서 새로 만들어진다고 하더라도.
- 이름과 IP는 클러스터 빌트인 DNS에 기록됨
- 이 DNS를 이용해 이름으로 IP를 찾아갈 수 있음
- 파드끼리는 통신할 수 있음
label selector
- 외부의 트래픽을 어떻게 각각의 파드에 나눠줄까?
- svc(service object)가 label selector를 활용한다.
- label selector에 일치하는 파드가 살아있는지는 어떻게 알까?
- Ep(end point object)를 만들어서 헬스체크. 사라지거나 새로 생긴 파드를 svc는 ep에 추가한다.
레이블 셀렉터를 통해 클라이언트와 사용자는 오브젝트를 식별할 수 있다.
엔드포인트 API는 쿠버네티스에서 네트워크 엔드포인트를 추적하는 간단하고 직접적인 방법을 제공한다. 불행하게도 쿠버네티스 클러스터와 서비스가 더 많은 수의 백엔드 파드로 더 많은 트래픽을 처리하고 전송하는 방향으로 성장함에 따라, 이 API의 한계가 더욱 눈에 띄게 되었다. 특히나, 많은 수의 네트워크 엔드포인트로 확장하는 것에 어려움이 있었다.
이후로 서비스에 대한 모든 네트워크 엔드포인트가 단일 엔드포인트 리소스에 저장되기 때문에 엔드포인트 리소스가 상당히 커질 수 있다. 이것은 쿠버네티스 구성요소 (특히 마스터 컨트롤 플레인)의 성능에 영향을 미쳤고 엔드포인트가 변경될 때 상당한 양의 네트워크 트래픽과 처리를 초래했다. 엔드포인트슬라이스는 이러한 문제를 완화하고 토폴로지 라우팅과 같은 추가 기능을 위한 확장 가능한 플랫폼을 제공한다.
service
서비스는 파드 집합에서 실행중인 애플리케이션을 네트워크 서비스로 노출하는 추상화 방법. 쿠버네티스는 파드에게 고유한 IP 주소와 파드 집합에 대한 단일 DNS 명을 부여하고, 그것들 간에 로드-밸런스를 수행할 수 있다.
서비스 정의를 API 서버에 POST
하여 새 인스턴스를 생성할 수 있다. 서비스 오브젝트의 이름은 유효한 DNS 서브도메인 이름이어야 한다.
예를 들어, 각각 TCP 포트 9376에서 수신하고 app=MyApp
레이블을 가지고 있는 파드 세트가 있다고 가정해 보자.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
이 명세는 "my-service"라는 새로운 서비스 오브젝트를 생성하고, app=MyApp
레이블을 가진 파드의 TCP 9376 포트를 대상으로 한다.
쿠버네티스는 이 서비스에 서비스 프록시가 사용하는 IP 주소 ("cluster IP"라고도 함) 를 할당한다. (이하 가상 IP와 서비스 프록시 참고)
서비스 셀렉터의 컨트롤러는 셀렉터와 일치하는 파드를 지속적으로 검색하고, "my-service"라는 엔드포인트 오브젝트에 대한 모든 업데이트를 POST한다.
service type
- ClusterIP: 클러스터 내부에서만 접근 가능, 자신의 IP를 소유.
ServiceTypes
의 기본값이다. - NodePort: cluster-wide 포트로 클러스터 바깥에서의 접근 허용. 다음과 같은 방식으로 설정. TCP/UDP 가능하며, 디폴트는 TCP.
<NodeIP>:<NodePort>
를 요청하여, 클러스터 외부에서NodePort
서비스에 접속할 수 있다. //service.yaml ... ports: - port: 80 // 파드가 듣고 있는 포트 nodePort: 30080 // 서비스가 듣고 있는 cluster-wide 포트
- LoadBalacer: 클라우드 공급자의 로드 밸런서를 사용하여 서비스를 외부에 노출시킨다. 외부 로드 밸런서가 라우팅되는
NodePort
와ClusterIP
서비스가 자동으로 생성된다.
kube-proxy
쿠버네티스 네트워크 프록시는 각 노드에서 실행된다. 이는 각 노드의 쿠버네티스 API에 정의된 서비스를 반영하며 단순한 TCP, UDP 및 SCTP 스트림 포워딩 또는 라운드 로빈 TCP, UDP 및 SCTP 포워딩을 백엔드 셋에서 수행 할 수 있다.
IPVS/IPTABLES 규칙을 작성해 들어온 서비스를 각각의 파드로 분배한다.
참고: Udemy - Google Certified Associate Cloud Engineer Certification