본문으로 바로가기

서비스

category MLOps/K8S 2022. 3. 28. 23:35

Service

- 파드의 IP 구성정보
       -> 파드마다 특정 IP 주소를 할당받음 (고정되지 않음)
       매번(재부팅/파드재시작 자동으로 생성) 변경
- 어플리케이션 접근을 위해 고정된 주소가 필요 (어플리케이션 하나 당 IP 주소 하나)
       => 컨트롤러에 의해 실행되는 파드들 전체에 대해 하나

- 개념 : 파드 / 외부 간의 통신을 위해 고정된 IP 주소를 할당하는 오브젝트
       -> 노드에 구애받지 않고 여러 파드(동일 컨트롤러)에 주소 하나
       파드에 대한 로드벨런싱 기능 등을 제공
       파드 하나에 여러 개의 서비스가 연결될 수도 있다.

컨트롤러의 셀렉터 = 파드 레이블
       서비스의 셀렉터 = 파드 레이블
       컨트롤러의 셀렉터 != 서비스의 셀렉터 ( 꼭 같을 필요는 없음 )

- 종류
1. ClusterIP - 내부용(파드끼리) IP 주소를 사용
              내부용 IP 주소를 굳이 사용하는 이유 : 고정IP , 로드밸런싱
              파드와 연결 시 label / selector 사용

---------------------------------
2. NodePort - 물리적인 시스템(노드)의 IP 주소를 사용하면서 포트포워딩 설정

3. LoadBalancer - 쿠버네티스 클러스터 외부에 로드벨런싱 장치를 연결해서 구성 
              => 클라우드 환경은 자체적인 LB 사용
              => 온프레미스 환경에서는 MetalLB 등을 사용

              => 클라우드에서 제공하는 로드밸런서와 파드를 연결한 후 해당 로드밸런서 IP 이용해 접근
--------------------------------- 외부용(쿠버네티스 클러스터 외부에서도 접근 가능)

ExternalName - 안에서 외부로 접근할 때 사용할 이름주소를 제공
              내부적으로 사용하는 FQDN 을 통해서 외부의 시스템으로 접근 (CNAME)

- 서비스 FQDN
       각 서비스는 이름에 따라 할당된 FQDN 을 보유
       SERVICENAME . NAMESPACE . svc . cluster . local
       svc : 오브젝트 종류
       cluster.local : 쿠버네티스 클러스터의 도메인 이름

 

Kube-proxy

- 역할 : 파드 간의 통신을 담당 (네트워크 구성)
- 방식 : userspace / iptables / IPVS
            userspace -> iptables ( 성능 )
                   kube-proxy 가 아닌 iptables 를 통해 트래픽을 전달받고 전달하는 방식
                   kube-proxy 는 iptables 를 관리

            C1 =  10.233.101.145
            C2 =  10.233.103.86   

            C1 컨테이너(파드)에서 C2 주소로 요청
            C1 컨테이너 -> 브릿지(쿠버네티스) -> 1번 노드(물리인터페이스)
                      -> Dest IP 주소를 파드에서 노드 변경 ( Netfilter + iptables )
                                  => 노드는 파드의 주소를 모를 수 있으니까 동일한 네트워크인 노드의 주소로 변경
            -> 1번 노드에서 라우터로 전달 -> 라우팅 테이블 확인 -> 해당노드(2번)로 전달
                                  -> Dest IP 주소를 노드에서 파드 변경 ( Netfilter + iptables )
            -> 노드 -> 브릿지 -> C2컨테이너

 

실습

ClusterIP

- yaml 파일 작성

       spec.ports.port: 서비스가 생성할 Port

       spec.ports.tragetPort: 서비스가 접근할 Pod의 Port (기본 : port랑 동일)

       spec.selector: 서비스가 접근할 Pod의 label 조건

       spec.type: 서비스 타입; (default: ClusterIP)

       spec.clusterIP: 10.0.10.10 (default: 자동설정)

ClusterIP 서비스 작성
작성한 ClusterIP 접속하는 서비스 작성

NodePort

LoadBalancer

'MLOps > K8S' 카테고리의 다른 글

컨트롤러 (Daemonset, Statefulset, Job, CronJob)  (0) 2022.03.28
컨트롤러 (ReplicaSet, Deployment)  (0) 2022.03.26
파드 관리  (0) 2022.03.26
아키텍쳐 및 명령어 기본  (0) 2022.03.26