개요

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가 실행되는 것을 볼 수있다.