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 개념과 종류!
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 |