서비스 : 클라이언트가 파드를 검색하고 통신 가능하게 함


파드의 특징

  1. 일시적이다. (언제든 제거 or 다른 노드로 이동가능)
  2. 파드의 ip 주소는 파드시작 바로 직전에 할당되므로 클라이언트는 서버인 파드 ip주소 미리 알 수 x
  3. 모든 파드는 단일 ip 주소로 액세스 할 수 있어야 한다.

5.1 서비스 소개

쿠버네티스 서비스: 동일한 서비스를 제공하는 파드 그룹에 지속적인 단일 접점을 만들려고할 때 생성하는 리소스

ex) 백엔드와 프론트별 서비스 ip 생성 (서비스를 지원하는 파드가 여러개일 수 있음)

5.1.1 서비스 생성

서비스 연결은 서비스 뒷단의 모든 파드로 로드밸런싱 된다.

→ 어떤 파드가 서비스의 일부분인지를 어떻게 구분하나?

그건 바로 ! 레이블 셀!렉!터!

kubectl expose로 서비스 생성

expose 명령어는 파드 셀렉터를 사용해 서비스 리소스를 생성하고 모든 파드를 단이 IP 주소와 포트로 노출한다.

YAML 디스크립터를 통한 서비스 생성

kubia-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: kubia
spec:
  ports:
  - port: 80  서비스가 사용할 포트
    targetPort: 8080 서비스가 포워드할 컨테이너 포트
  selector:
    app: kubia 해당 레이블이 있는 파드가 이 서비스에 포함된다.

kubectl create 명령어 써서 서비스 생성

새 서비스 검사하기

Untitled

하단이 생성된 서비스

클러스터 IP 이므로 클러스터 내부에서만 액세스할 수 있다.

(외부는 후에 함)

클러스터 내에서 서비스 테스트

클러스터 내에서 서비스로 요청 보낼 수 있음

이중 3번째 방법 해보자.

실행중인 컨테이너에 원격으로 명령어 실행

kubectl exec 명령어를 사용하면 기존 파드의 컨테이너 내에서 원격으로 임의의 명령어를 실행할 수 있음

→ 컨테이너의 내용, 상태, 환경 검사할 때 유용함

k exec 파드번호 -- curl -s <http://10.104.156.28>

Untitled

<aside> 💡 더블 대시 사용하는 이유 : kubectl 명령줄 옵션의 끝을 의미한다.-s 옵션이 k exec 옵션으로 해석되지 않도록 한다.

</aside>

  1. kubectl exec
  2. curl 은 어플리케이션을 실행하고있는 컨테이너 내에서 실행됨
  3. curl 은 HTTP GET 요청을 보낸다.
  4. 서비스는 HTTP 연결을 임의의 파드로 전달한다.
  5. HTTP 응답은 다시 curl 로 전송된다.
  6. curl 명령의 출력은 다시 kubectl 에게 보내고 화면에 출력된다.

컨테이너의 주 프로세스가 서비스와 통신하는 것과 별반 다르지 않음

서비스의 세션 어피니티 구성

요청할때마다 다른 파드가 선택된다.

만약 매번 같은 파드로 리디렉션하려면 서비스의 sessionAffinity 속성을 기본값 None 대신 Client IP로 설정한다.

서비스 프록시는 동일한 클라이언트 IP의 요청을 동일한 파드로 전달한다.

서비스는 TCP,UDP 패킷을 처리하고 그들이 가지고 있는 페이로드는 신경쓰지 않는다. (HTTP 수준에서 작동하지 않기때문에 쿠키기반 세션 어피티니 옵션없음)

동일한 서비스에서 여러개의 포트 노출

여러 포트도 지원 가능하다. (멀티포트 서비스)

단일 클러스터 IP로 모든 서비스 포트가 노출된다.

(이때 각 포트의 이름 지정해야함)

apiVersion: v1
kind: Service
metadata:
  name: kubia
spec:
  ports:
  - name: http  포트 80은 파드의 포트 8080에 매핑된다.
    port: 80
    targetPort: 8080 
  - name: https
    port: 443 포트 443은 파드 포트 8443 에 매핑
    targetPort: 8443
  selector:
    app: kubia 모든 서비스에 적용되는 레이블 셀렉터

지금 띄운 kubia 파드는 여러 포트로 서비스 하지 않기 때문에

멀티포트 서비스와 멀티포트 파드를 만드는 것은 독자의 몫…

이름이 지정된 포트 사용

apiVersion: v1
kind: Service
metadata:
  name: kubia
spec:
  ports:
  - name: http
    port: 80
    targetPort: 8080
  - name: https
    port: 443
    targetPort: 8443
  selector:
    app: kubia

포트별로 name 설정되어있다.

5.1.2 서비스 검색

환경변수를 통한 서비스 검색

파드 시작시 쿠버네티스는 해당 시점에 존재하는 각 서비스를 가리키는 환경변수 세트를 초기화함.

클라이언트 파드 생성 전에 서비스를 생성하면 해당 파드의 프로세스는 환경변수를 검사해 서비스의 IP 주소와 포트를 얻을 수 있음

파드 먼저 생성 → 서비스 생성 하면 서비스에대한 환경변수 설정 불가능함.

  1. 파드 삭제하고 재생성
  2. 파드 조회
  3. 파드를 exec 명령어의 대상으로 선택
  4. 환경변수 조회
k exec 파드번호 env