개요
Kubernetes에 대한 기본 이해를 했다면 이제 중급으로 넘어가 실제로 클러스터를 구성해볼 필요가 있다. 이때 인터넷에 돌아다니는 예제는 단일 Pod구성에 대한 예제가 많다. 하지만 실제로 클러스터를 구성할 때에는 여러개의 Pod을 포함하여 내부 통신이 필요한 케이스가 많다. 따라서 하나의 클러스터에서 다중 Pod으로 어떻게 클러스터를 구성하는지는 필자가 실제로 Redash 클러스터를 구축하며 정리한 내용으로 알아보자.
기본 Redash Architecture
기본적인 Redash의 아키텍쳐는 아래와 같다. 이중에서 필자는 Postgres를 제외한 Redash Server
, Redash Worker
, Redis
를 Kubernetes로 구성할 계획이다.
Kubernetes 버전 구성 Architecture
Kubernetes로 구성하면 아래와 같아진다. 핵심은 service들을 통해 Pod끼리 서로 통신이 가능하게 만드는 것이다.
YAML 설계
아래와 같이 YAML을 설계 할 수 있다. 아래의 yaml들을 kubectl
을 통해 적용만 하면 된다.
ingress.yaml
ingress를 통해 외부와 통신을 하게 만든다. ingress에서는 Kubernetes에서 ingress에 SSL(https) 적용하기를 통해 SSL까지 적용시킬 수 있다.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: alyredash-ingress
namespace: default
annotations:
ingress.kubernetes.io/rewrite-target: /
spec:
tls:
- hosts:
- www.kwangsiklee.com
secretName: star-kwangsiklee-com
rules:
- host: www.kwangsiklee.com
http:
paths:
- path: /
backend:
serviceName: redashserver-svc
servicePort: 5000
redash-deploy.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
io.kompose.service: redashserver-deploy
name: redashserver-deploy
spec:
replicas: 1
template:
metadata:
labels:
io.kompose.service: redashserver-deploy
spec:
containers:
- args:
- server
env:
- name: PYTHONUNBUFFERED
value: "0"
- name: REDASH_COOKIE_SECRET
value: veryverysecret
- name: REDASH_DATABASE_URL
value: postgresql://postgres@postgres-svc/postgres
- name: REDASH_LOG_LEVEL
value: INFO
- name: REDASH_REDIS_URL
value: redis://redis-svc:6379/0
- name: REDASH_ADDITIONAL_QUERY_RUNNERS
value: redash.query_runner.oracle,redash.query_runner.python
- name: LD_LIBRARY_PATH
value: /usr/lib/oracle/12.2/client64/lib/
- name: ORACLE_HOME
value: /usr/lib/oracle/12.2/client64
- name: LANG
value: "en_US.UTF-8"
- name: NLS_LANG
value: "AMERICAN_AMERICA.AL32UTF8"
image: lks21c/redash:5.0.2
name: redashserver-deploy
ports:
- containerPort: 5000
restartPolicy: Always
redashserver-svc.yaml
apiVersion: v1
kind: Service
metadata:
labels:
io.kompose.service: redashserver-deploy
name: redashserver-svc
spec:
clusterIP: 10.231.21.84
ports:
- port: 5000
targetPort: 5000
selector:
io.kompose.service: redashserver-deploy
redis-deploy.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
io.kompose.service: redis-deploy
name: redis-deploy
spec:
replicas: 1
template:
metadata:
creationTimestamp: null
labels:
io.kompose.service: redis-deploy
spec:
containers:
- image: redis:3.0-alpine
name: redis-deploy
restartPolicy: Always
redis-svc.yaml
apiVersion: v1
kind: Service
metadata:
labels:
io.kompose.service: redis-deploy
name: redis-svc
spec:
clusterIP: None
ports:
- name: headless
port: 55555
targetPort: 0
selector:
io.kompose.service: redis-deploy
worker-deploy.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
io.kompose.service: worker-deploy
name: worker-deploy
spec:
replicas: 2
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
io.kompose.service: worker-deploy
spec:
containers:
- args:
- scheduler
env:
- name: PYTHONUNBUFFERED
value: "0"
- name: QUEUES
value: queries,scheduled_queries,celery
- name: REDASH_DATABASE_URL
value: postgresql://postgres@postgres-svc/postgres
- name: REDASH_LOG_LEVEL
value: INFO
- name: REDASH_REDIS_URL
value: redis://redis-svc:6379/0
- name: WORKERS_COUNT
value: "4"
- name: REDASH_ADDITIONAL_QUERY_RUNNERS
value: redash.query_runner.oracle,redash.query_runner.python
- name: LD_LIBRARY_PATH
value: /usr/lib/oracle/12.2/client64/lib/
- name: ORACLE_HOME
value: /usr/lib/oracle/12.2/client64
- name: LANG
value: "en_US.UTF-8"
- name: NLS_LANG
value: "AMERICAN_AMERICA.AL32UTF8"
- name: C_FORCE_ROOT
value: "true"
image: lks21c/redash:5.0.2
name: worker-deploy
resources: {}
restartPolicy: Always
status: {}
worker-svc.yaml
apiVersion: v1
kind: Service
metadata:
labels:
io.kompose.service: worker-deploy
name: worker-svc
spec:
clusterIP: None
ports:
- name: headless
port: 55555
targetPort: 0
selector:
io.kompose.service: worker-deploy
status:
loadBalancer: {}
검증하기
위 스크립트를 통해 kubernetes를 클러스터에서 정상적으로 SSL로 Redash가 실행되는 것을 볼 수있다.