본문 바로가기

Kubenetes/Service & Ingress

Service 기본

ㅁ 서비스 소개

 

 쿠버네티스 서비스는 동일한 서비스를 제공하는 포드 그룹에 단일 진입 점을 만들기 위해 생성하는 리소스

 각 서비스에는 서비스가 존재하는 동안 절대로 변경되지 않는 IP 주소와 포트가 있다.

 

ㅁ 서비스 구조

 

ㅁ 내부 클라이언트와 외부 클라이언트는 모두 서비스를 통해 포드에 접속

 

서비스를 지원하는 포드가 하나 혹은 그 이상일 수 있다.

 

ㅁ 라벨 셀렉터를 통해 어떤 포드가 서비스에 포함됐는지 결정

 

 

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

 

서비스 정의: kubia-svc.yaml


apiVersion: v1

kind: Service

metadata:

    name: kubia. 
spec: 
    ports: 
    - port: 80.     
      targetPort: 8080. 
    selector: 
      app: kubia 

 

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

 

$ kubectl exec kubia-7nog1 -- curl -s http:10.111.249.153

 

kubectl exec을 사용해 포드 중 하나에서 curl 명령을 실행해 서비스 연결 테스트 하기

 

 

ㅁ 서비스의 세션 친화성 구성

 

기본적으로 서비스 프록시는 랜덤하게 Pod를 선택해 연결을 다시 전달(forward)하기 때문에 요청할 때마다 다른 Pod가 선택됨

특정 클라이언트에서 생성된 모든 요청을 매번 같은 Pod로 리다이렉션 하고 싶다면 sessionAffinity 속성을 ClientIP로 설정

 

apiVersion: v1
kind: Service
spec:
    sessionAffinity: ClientIP
    
    ...

 

 

ㅁ 동일한 서비스에서 여러개의 Port 호출

 

YAML 디스크립터에 kubia 서비스를 정의. 80 포트로 들어오는 연결을 허용하고 각 연결을 대상으로 app=kubia 라벨 셀렉터(label selector)에 매칭되는 포드 중 하나를 8080 포트로 라우팅 

 

ㅁ 서비스 정의에서 다중 포트 설정하기 

 

apiVersion: v1

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

 

--> 다중 포트를 갖는 서비스를 생성할 때 각 포트에 이름을 꼭 지정해야 한다. 

 

ㅁ 외부 서비스에서 외부 클라이언트로

 

 서비스가 외부에 액세스 가능하게 하는 방법

 1. NodePort 서비스 타입응로 설정하기

 2. LoadBalancer 서비스 타입으로 설정하기

 3. Ingress REsource 생성하기 (하나의 IP 주소를 통해 여러 서비스를 제공하는 근분적으로 다른 매커니즘)

 

ㅁ NodePort 서비스 정의 : kubia-svc-nodeport.yaml

 

apiVerison: v1
kind: Service
metadata:
    name: kubia-nodeport
spec:
    type: NodePort
   port: 
    - port: 80
      targetPort: 8080
      nodePort: 30123
  selector:
     app: kubia

 

ㅁ 서비스 검색

 

 [환경 변수를 이용한 서비스 검색]

 

  (주의점) Pod를 생성하기 전에 Service를 생성했다면 Pod는 환경 변수에 서비스 IP를 기록한다. 하지만 서비스 생성 전에 Pod를 생성했다면 환경변수에 서비스 관련 정보가 없다.

 

$ kubectl exec kubia-3inly env

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

HOSTNAME=kubia-3inly

KUBERNETES_SERVICE_HOST=10.111.2401.

KUBERNETES_SERVICE_PORT=443

...

KUBIA_SERVICE_HOST=10.111.249.153

KUBIA_SERVICE_PORT=80

...

 

[DNS를 이용한 서비스 검색]

 

Pod에서 실행중인 프로세스가 수행하는 모든 DNS쿼리는 시스템에서 실행 중인 모든 서비스를 알고 있는 쿠버네티스의 자체 DNS 서버에서 처리

각 서비스는 내부 DNS 서버에서 DNS 항목을 가져오며 서비스 이름을 알고 있는 클라이언트 Pod는 환경변수를 사용하는 대신 FQDN(정규화된 도메인 이름)을 통해 엑세스 할 수 있다.