kubernetes service

2023. 2. 21. 17:53아키텍처/MSA

728x90
반응형

서비스는 리마인드만하고 ingress만 해오기

 

Service 개념

 ❗ 서비스 = 쿠버네티스 네트워크

동일한 서비스를 제공하는 Pod 그룹의 단일 진입점을 제공

Process

1️⃣실행 명령을 Deployment에게 시킴

2️⃣ API는 이 요청을 받아 deployment 문법을 확인

3️⃣ etcd에 있는 node1~3에 대한 정보들을 수립하고 etcd에 보존

4️⃣ controller와 scheduler의 도움을 받아 서비스 3개를 실행

 

  • 하나의 파드에 일이 몰리면 안되니까 균등하게 작업을 분산 시켜주는 게 필요
  • 어떻게?
    • 서비스를 요청해서!
    • api서비스 구조로 k8s에 명령을 내림
    • 단일 진입점을 만들어서 분산할 수 있게!
    • virtual ip를 만들어서 3개의 pod의 ip에 LB → 이 정보를 ectd에 기록 ⇒ Service API

Service 타입 - 4가지

1️⃣ Cluster Ip(default)

Pod 그룹의 단일 진입점(Virtual IP) 생성

  • 가상 ip를 만들어서 service 실행시 node로 전달
  • 가장 Basic한 service의 구조임
  • private ip
    • k8s내에서만 ip를 할당해준다.

2️⃣ Node Port

ClusterIP가 생성된 후 모든 Worker Node에 외부에서 접속 가능한 포트가 예약

  • 각 node에 port를 요청해서 각 node의 port를 열리게 함
  • cluster ip보다 규모가 커져서 cluster ip까지 지원해주겠다는 1️⃣ 보다 확장적인 의미!
  • cluster ip가 작용이 되는 공간은 가상화 된 자원에서만 작동
    • 가상화된 네트워크에서 나와서 로컬 포트랑 연결을 하고 싶으면 node port를 해야함!

3️⃣ LoadBalancer

클라우드 인프라나 오픈스택 클라우드에 적용 LB를 자동으로 provision하는 기능 지원

  • k8s 밖에서 LB를 통해 실제 장비와 node port를 연결
  • (단, LB는 클라우드 인프라 - AWS,AZURE,GCP- 와 같은 클라우드 인프라에서 사용 가능)
  • 우리는 Load Balancer ip만 알면 서비스에 접속할 수 있다.

4️⃣ ExternalName

cluster 안에서 외부에 접속 시 사용할 도메인을 등록해서 사용 cluster 도메인이 실제 외부 도메인으로 치환되어 동작

  • node의 자체 ip가 google.com 처럼 자체 설정한 도메인으로 치환 되는 것을 cluster 내부에서 지원

Ingress 개념

<aside> ❗ 인그레스란? Pod,Cluster 와 같은 API의 일부임

</aside>

  • HTTP나 HTTPS를 통해 클러스터 내부의 서비스를 외부로 노출
  • 웹 기반의 서비스를 외부에서 접속할 수 있도록 지원하는게 바로 Ingress

Ingress 기능

  • Service에 외부 URL 제공
    • 기본적으로, ingress는 서비스랑 연결되어있다!
  • 트래픽 로드 밸런싱
  • SSL 인증서 처리
  • Virtual hosting을 지정
    • rule만 잘 정리해주면 도메인 변경도 가능
    • 도메인을 가지고 기능별로 나눔 DDD
  • 도메인을 가지고 파드 리소스를 나눠주는.. 결국 도메인을 쓰는 것!

Ingress Controller설명

  • Main 페이지나 Login 페이지의 연할을 수행하는 Main, Login Service 및 Order을 담당하는 service가 있음
  • 이런 서비스에 대한 단일 진입점을 제공하는 것이 Ingress Controller!
  • 우리가 직접 만드는 것은 아니고 k8s 오픈 프로젝트로 만들어져서 제공되고 있음
  • 서비스를 묵어 하나의 rule을 만들어서 특정 서비스로 연결할 수 있게 함

Ingress Controller 설치

설치

$ kubectl apply -f <https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.5.1/deploy/static/provider/cloud/deploy.yaml>

  • 사진

Pre-flight check

# ingress-nginx에 대한 pod를 시작시킴
$ kubectl get pods --namespace=ingress-nginx

# pod가 실행되고 준비될 때 까지 wait
$ kubectl wait --namespace ingress-nginx \\
  --for=condition=ready pod \\
  --selector=app.kubernetes.io/component=controller \\
  --timeout=120s
  • 사진

Local testing

# 간단한 웹 서버와 관련 서비스 생성
$ kubectl create deployment demo --image=httpd --port=80
$ kubectl expose deployment demo

# 인그레스 리소스 생성
$ kubectl create ingress demo-localhost --class=nginx \\
  --rule="demo.localdev.me/*=demo:80"

#수신 컨트롤러에 로컬포트 전달
$ kubectl port-forward --namespace=ingress-nginx service/ingress-nginx-controller 8080:80
  • 사진인그레스 규칙을 안만들어줘서 이때는 실행이 안되었음 ㅜㅜ

Online testing

# 실제 클러스터인 LoadBalancer에 대한 외부 IP 주소 확인
$ kubectl get service ingress-nginx-controller --namespace=ingress-nginx

# 외부 ip가 pending이면 k8s 클러스터가 로드 밸런서를 프로비저닝할 수 없기에 DNS 레코드 설정
$ kubectl create ingress demo --class=nginx \\
  --rule="www.demo.io/*=demo:80"
$ kubectl create ingress demo --class=nginx \\
  --rule www.demo.io/=demo:80
  • 사진

 

참고

[따배쿠] 7-1. 쿠버네티스 Service 개념과 종류!

[따배쿠] 8-1 Kubernetes Ingress 개념과 Ingress Controller 설치!

Ingress Controller 설치

728x90
반응형

'아키텍처 > MSA' 카테고리의 다른 글

Docker 소개  (0) 2023.03.15
kubernetes - cronjob  (0) 2023.02.21
kubernetes - pod, deployment  (0) 2023.02.21
쿠버네티스 #8 Ingress  (0) 2023.02.21
쿠버네티스 #7서비스 (service)  (0) 2023.02.21