본 포스팅은 김태민 님의 대세는 쿠버네티스 [초급~중급] 섹션 7를듣고 요약한 내용입니다.
목차
- Stateless Application과 StatefulApplication
- Ingress
- Ingress Controller
- Ingress의 세가지 주요 기능
- AutoScaler
- HPA
Stateless Application과 Stateful Application
애플리케이션의 종류에는 Stateless Application과 Stateful Application이 있다.
Stateless Application은 웹서버로 아파치, nginx 등이 있다.
Stateful Application은 데이터베이스로 몽고디비, 마리아디비, 레디스 등이 있다.
stateless application은 app이 여러개 배포되어도 똑같은 service 역할을 한다. 반면에 stateful application은 앱이 여러개 배포되면 각각 다른 역할을 수행한다.
또한, stateless은 데이터 저장을 위해 volume을 사용하려면, volume 하나에 app들을 연결해서 사용한다.
stateful은 각각의 app에 각각 다른 volume이 사용된다.
stateless은 user가 network에 접속하면 앱들이 트래픽을 나누어 가지지만,
stateful은 internal system이 network에 접속하면 app마다 권한에 따라서 트래픽을 나누어 가짐
stateless의 controller는 ReplicaSet controller라고 부르고, stateful controller는 StatefulSet controller이라고 부른다.
Ingress
Ingress는 외부로부터 서버 내부로 유입되는 네트워크 트래픽을, egress는 서버 내부에서 외부로 나가는 트래픽을 의미한다.
쿠버네티스에서 Ingress는 Service LoadBalancing, Canary Upgrade을 위해 사용한다.
Service LoadBalancing
서비스별로 pod를 각각 만들어서 shopping page에 문제가 생겨도 다른 서비스를 제공해 줄 수 있다.
ingress 오브젝트를 도메인에 해당하는 서비스 pod로 연결해준다 (별도의 ip 로드밸런싱 해줄 장비가 필요없게 됨)
Canary Upgrade
version 1와 version 2가 있을 때, Ingress를 사용하면 90%의 트래픽은 V1으로, 10%의 트래픽은 v2로 가게 할 수 있다.
Ingress Controller
ingress는 host 에 도메인 이름과 path에 따라 서비스로 연결하라는 내용이 주 내용을 이룬다.
구현체가 따로 필요한데, 이것을 ingress controller라고 한다. nginx, kong 등이 대표적인 예시이다.
nginx 를 설치하면, 실제 nginx 구현체인 pod가 생성된다. 이 pod에 ingress룰이 있는지 확인해 보고, 있다면 그 룰대로 서비스에 연결한다.
이때, 외부에서 접속하게 할 수 있게 하려면, 외부에서 접속하는 Service를 하나 만들어서 nodeport나 LoadBalancer로 pod에 연결을 한다.
즉, 외부에서 접근이 오면 서비스를 통해 ingress의 pod로 연결되어서 지정된 룰에 따라 서비스에 접근할 수 있다.
Ingress의 세가지 주요 기능
1. service loadbalancing
사용자가 192.168.0.30의 30431 포트로 접근하면 서비스 페이지로 접근하게 해준다.
2. canary upgrade
사용자가 도메인으로 30431포트로 접속하면 서비스 페이지로 접근하게 해준다.
@weight : ingress에 weight를 지정하면, weight만큼의 트래픽이 v2 pod로 흘러가서 테스팅하게 된다.
@header : 나라별로 트래픽을 다르게 가게한다.
3. https
secret을 설정해서 사용자가 도메인 앞에 https를 붙여야지만 접근이 가능하게 한다.
Autoscaler
Autoscaler는 세가지 종류가 있다.
- HPA : pod의 개수를 늘림
- VPA : pod의 리소스를 늘림
- CA : 클러스터에 노드를 추가함
HPA
HPA는 pod의 리소스가 부족해지면 replicas를 늘려서 pod를 하나 더 생성(scale out)하는 역할을 한다.
리소스(자원)가 충분하면 replicas를 줄여서 pod를 삭제 (scale in)하는 역할도 한다.
HPA를 통해 안정적으로 서비스를 사용 가능하다.
-> 기동이 빠르게 되는 app과 stateless app에서 권장된다.
VPA
VPA는 Pod의 리소스가 부족해지면 pod를 재시작하면서 리소스의 양을 늘린다. (scale up)
-> stateful app에 권장, 한 controller에 hpa와 함께 사용 할 수 없다.
CA
pod가 필요할 경우, ca에 create요청을 한다.
cloud provider에 node를 하나 만들고 스케줄러는 pod를 여기에 만든다. 만약 이 pod가 삭제되면, pod의 내용은 로컬 node로 옮겨진다.
HPA
hpa의 type이 utilization이고 averageUtilization이 50이면 현재 사용 자원이 평균 50퍼센트가 넘으면 replicas를 하나 증가한다는 뜻이다.
정해진 공식으로 증감될 replicas가 결정된다. 예를 들어,
pod의 cpu가 200이고 평균 utilization이 50이기 때문에 200 * 50% = 100이므로 실제 cpu 사용량이 100이 넘게 되면 replicas가 증가하게 된다.
scale out의 경우, 현재 replicas * 현재 평균 cpu / target값 = 증가시켜야 할 replicas 로 증가할 replicas를 구할 수 있다.
sclae in의 경우, 현재 replicas * 현재 평균 cpu / target값 = 감소시켜야 할 replicas 로 감소할 replicas를 구할 수 있다.