redis-deployment.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
namespace: default
spec:
selector:
matchLabels:
svc: redis # has to match .spec.template.metadata.labels
serviceName: redis
replicas: 3 # by default is 1
template: # pod의 사양
metadata:
labels:
svc: redis # has to match .spec.selector.matchLabels
spec:
containers:
- name: redis
image: redis
command:
- sh
- -c
- |
if [ `hostname` = redis-0 ]; then
redis-server
else
redis-server --replicaof redis-0.redis.default.svc.cluster.local 6379
fi
ports:
- containerPort: 6397
volumeMounts:
- name: data
mountPath: /data
volumeClaimTemplates: # persistent volume 생성을 위한 template임
- metadata:
name: data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Ki
---
apiVersion: v1
kind: Service
metadata:
name: redis
spec:
type: ClusterIP
selector:
svc: redis
ports:
- port: 6379
server.js
var http = require('http');
var redis = require('redis');
http.createServer(function (request, response) {
// url이 /inc로 들어오면 값을 증가시키고
if (request.url == '/inc'){
var redisClient = redis.createClient({
url: 'redis://redis-0.redis.default.svc.cluster.local:6379', // redis service의 도메인 네임, redis는 서비스 이름, default는 네임스페이스 이름
//svc라는 것이 쿠버네티스 service의 의미, cluster.local이 로컬 클러스터인 minikube의 도메인 네임임
legacyMode:true, // 기존 콜백 방식으로 redis 클라이언트가 동작하며, false인 경우에는 promise로 동작작
});
redisClient.connect();
redisClient.incr('count', function (err, count) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end(count.toString());
});
}
// 아니면 값을 호출한다다
else {
var redisClient = redis.createClient({
url: 'redis://redis.default.svc.cluster.local:6379',
legacyMode:true,
});
redisClient.connect();
redisClient.get('count', function (err, data) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end(data);
});
}
}).listen(8081);
console.log('Server running at http://127.0.0.1:8081/');
명령어 :
kubectl exec -ti redis-0 -- redis-cli
새로운 터미널을 열어서
kubectl exec -ti redis-1 -- redis-cli
또 터미널을 열어서
kubectl exec -ti redis-2 -- redis-cli
즉, master로 설정된 redis-0은 변경이 가능하지만, redis-1부터 2, 또는 증가되는 3,4,5 .... slave모드이기 때문에 read만 가능합니다.
redis-service로 요청하면 service가 redis-0부터 2까지 분배해서 로드밸런싱해서 처리할 수 있음을 알 수 있습니다.
read operation은 로드밸런싱이 된다는 것을 알 수 있습니다.