후니의 IT인프라 사전
1주차 - Deploying PHP Guestbook application with Redis (도전과제) 본문
1주차 - Deploying PHP Guestbook application with Redis (도전과제)
james_janghun 2022. 6. 24. 15:15
1. 실습가이드 (링크)
Redis를 이용한 PHP 방명록 애플리케이션을 구성합니다.
해당 실습을 통해서 deploy 형태의 pod 배포, Redis의 Leader-Follower 구성, service를 통한 배포, frontend web과 연결, 파드 스케일 증가를 확인할 수 있다.
2. Redis는 무엇인가?
In Memory Cache 시스템으로 메모리 속에 자료를 저장하여 처리 속도가 매우 빠른 장점이 있다.
Key-Value 저장소로, 다양한 형식의 데이터를 지원하며 NoSQL 형태이다. (참고블로그)
Redis는 메모리 상의 DB라는 점에서 영속성을 문제를 가질 수 밖에 없는데, 이를 보완하기 위해서 데이터를 Disk에 저장할 수 있도록 하여 영속성을 보장하도록 했다. 데이터를 DISK에 저장하는 방식은 크게 2가지이다.
SnapShot 방식
snapshot을 뜨는 것 처럼, 메모리에 있는 데이터를 특정 시점에 그대로 Disk로 옮겨 담는다.
이때, Redis의 쓰기를 잠시 멈추는(Blocking) Save 방식 / 쓰기를 멈추지 않는 BGSave 방식으로 또 나뉜다.
다만, 특정 시점에 유효하기 때문에 만약 snapshot을 하고 난 뒤 새로 메모리에 올라간 데이터가 있는 상태에서 redis가 죽으면 해당 데이터는 날라간다.
AOF(Append On File) 방식
모든 Write/Update의 연산을 모두 log에 남기고, 서버 재시작시 write/update 작업을 순차적으로 재실행해 데이터를 복구하는 방식이다.
다만, 서버가 죽는 그 순간까지도 로그 파일은 실시간으로 남기 때문에 데이터 보존에는 용이하나 모든 log을 남겨 점점 그 용량이 비대해지게 되고, 재시작시 write/update 작업을 다시 하기 때문에 그 양이 많을 수록 레이턴시가 발생할 수 있다.
3. 실습 배포
3.1 Redis Leader Pod 생성
데이터 작성을 위해서 Redis Leader를 생성합니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-leader
labels:
app: redis
role: leader
tier: backend
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
role: leader
tier: backend
spec:
containers:
- name: leader
image: "docker.io/redis:6.0.5"
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 6379
3.2 Redis Leader Service 생성
방명록 애플리케이션에 데이터를 쓰려면 애플리케이션이 Redis에 접근할 수 있어야 하므로 서비스를 생성합니다.
apiVersion: v1
kind: Service
metadata:
name: redis-leader
labels:
app: redis
role: leader
tier: backend
spec:
ports:
- port: 6379
targetPort: 6379
selector:
app: redis
role: leader
tier: backend
3.3 Redis 팔로워 생성
Redis Leader에 Follwer 2개를 추가하여 클러스터를 구성합니다. 이는 deploy를 통해 구성하므로 pod가 죽어도 재생성됩니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-follower
labels:
app: redis
role: follower
tier: backend
spec:
replicas: 2
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
role: follower
tier: backend
spec:
containers:
- name: follower
image: gcr.io/google_samples/gb-redis-follower:v2
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 6379
Deploy 배포의 경우 항시 2개의 replicas를 유지합니다. describe를 통해서 살펴보면, Replicas 2 desired라는 모습을 확인할 수 있습니다.
만약 pod를 없앨 경우, 다른 pod가 생성되며 맨 마지막 랜덤 이름 값은 변경됩니다.
기존에 6nfq4라는 pod가 존재했으나 삭제시에 별도로 thxzl이라는 redis가 등장하였습니다.
3.4 Redis Follower 서비스 구성
- 데이터를 읽기 위해서 Redis Follower도 서비스를 통해서 개통시켜야한다.
apiVersion: v1
kind: Service
metadata:
name: redis-follower
labels:
app: redis
role: follower
tier: backend
spec:
ports:
# the port that this service should serve on
- port: 6379
selector:
app: redis
role: follower
tier: backend
3.5 Redis cluster 확인
kubectl logs -f deploy/redis-follower 을 통해서 cluster log를 확인하고, 동기화 상태를 확인할 수 있다.
3.6. 방명록 Frontend 구축
- 저장소인 Redis를 구성했으므로, 실제 방명록 애플리케이션을 구동한다. deploy를 통해 배포해 안정성을 유지한다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
spec:
replicas: 3
selector:
matchLabels:
app: guestbook
tier: frontend
template:
metadata:
labels:
app: guestbook
tier: frontend
spec:
containers:
- name: php-redis
image: gcr.io/google_samples/gb-frontend:v5
env:
- name: GET_HOSTS_FROM
value: "dns"
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 80
3.7 Frontend Service 배포
LodePort를 기본으로하나, 외부로 서비스 배포시에 LoadBalancer 타입으로 배포가 가능하다. 서비스에서 제공되는 32065 포트를 통해서 접근하였다.
apiVersion: v1
kind: Service
metadata:
name: frontend
labels:
app: guestbook
tier: frontend
spec:
#type: LoadBalancer # 외부 오픈시는 로드밸런서 타입으로 진행
ports:
# the port that this service should serve on
- port: 80
selector:
app: guestbook
tier: frontend
3.8 방명록 웹 pod 확장
- 방문자가 많아 트래픽에 대한 분산이 필요할 경우, 존재하는 pod의 숫자를 늘릴 수 있다.
kubectl scale deployment frontend --replicas=5
kubectl scale deployment frontend --replicas=1
만약 이렇게 frontend pod가 줄어들어도 자료나 방명록 등록에는 전혀 문제 없었다. Redis에 자료를 저장하기 때문이다.
3.9 Redis 정보확인하기
# redis tools 설치
apt install redis-tools
# 서비스 IP 및 포트 확인
kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
redis-follower ClusterIP 10.200.1.185 <none> 6379/TCP 4h37m
redis-leader ClusterIP 10.200.1.13 <none> 6379/TCP 4h37m
# redis 접근
redis-cli -h 10.200.1.13 # 6379가 기본포트라서 별도 입력안함. 다를 경우 -p 사용
# info 확인
10.200.1.13:6379> info
(...)
# Replication
role:master
connected_slaves:2
slave0:ip=172.16.2.10,port=6379,state=online,offset=2114,lag=1
slave1:ip=172.16.1.17,port=6379,state=online,offset=2114,lag=0
master_replid:def716e7a6f3ed69dec6e960c8ffe61861c138ef
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2114
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2114
이상으로 Redis를 활용한 방명록 애플리케이션 배포 실습을 마무리 하겠습니다. 감사합니다.
'프로젝트&&스터디 > DOIK 스터디' 카테고리의 다른 글
2주차 - 오퍼레이터 & MySQL 오퍼레이터 (설치 및 장애테스트) (0) | 2022.06.25 |
---|---|
2주차 - 오퍼레이터 & MySQL 오퍼레이터 (0) | 2022.06.24 |
1주차 - 쿠버네티스 주요 리소스(statefulset, headless 서비스) (0) | 2022.06.24 |
1주차 - 쿠버네티스 주요 리소스(쿠버네티스 네트워크) (0) | 2022.06.24 |
1주차 - 쿠버네티스 주요 리소스 (쿠버네티스 스토리지) (0) | 2022.06.24 |