Kubernetes에 Akka Cluster, Lagom 배포하기

Kubernetes에 Akka Cluster, Lagom 배포하기

Akka와 Lagom을 Kubernetes 환경에 배포하는 방법을 설명합니다. MiniKube 환경에서 테스트하지만, 상용 Kubernetes 환경에서도 동일한 절차를 따를 수 있습니다.

Kubernetes에 Akka Cluster 배포하기

Akka Cluster는 JVM 기반의 분산 시스템을 구축할 수 있는 기술입니다. 이를 Kubernetes에서 운영할 경우, 두 가지 주요 이슈가 있습니다:

  1. 클러스터 초기 구성

    • 초기 클러스터 구성 시, 어떤 노드가 클러스터를 시작할지 결정해야 합니다.
    • Kubernetes에서는 고정된 IP를 사용할 수 없으므로, 동적으로 Seed Node를 찾아야 합니다.
  2. 클러스터 유지 관리

    • 컨테이너 환경에서는 Pod가 언제든지 종료될 수 있으며, 동일한 Pod가 다시 실행되지 않을 수도 있습니다.
    • 새로운 Pod가 기존 클러스터에 자동으로 합류해야 합니다.

Kubernetes에서 Akka Cluster 설정 방법

Seed Node 설정

Kubernetes 환경에서는 시드 노드를 직접 고정할 수 없으므로, akka-management를 활용하여 자동으로 클러스터를 부트스트랩해야 합니다.

application.conf 설정 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
akka {
loglevel = "DEBUG"
actor.provider = cluster
cluster {
shutdown-after-unsuccessful-join-seed-nodes = 60s
}
}

akka.management {
cluster.bootstrap.contact-point-discovery {
discovery-method = kubernetes-api
required-contact-point-nr = ${REQUIRED_CONTACT_POINT_NR}
}
}

Health Check 및 Readiness 설정

Akka Cluster에서는 노드의 상태를 주기적으로 체크하여 유지 보수합니다.

DemoHealthCheck.scala 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
package akka.sample.cluster.kubernetes

import scala.concurrent.Future
import akka.actor.ActorSystem
import org.slf4j.LoggerFactory

class DemoHealthCheck(system: ActorSystem) extends (() => Future[Boolean]) {
private val log = LoggerFactory.getLogger(getClass)
override def apply(): Future[Boolean] = {
log.info("DemoHealthCheck called")
Future.successful(true)
}
}

Kubernetes 배포 설정

akka-cluster.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
apiVersion: apps/v1
kind: Deployment
metadata:
name: akka-cluster
namespace: akka-system
spec:
replicas: 3
selector:
matchLabels:
app: akka-cluster
template:
metadata:
labels:
app: akka-cluster
spec:
containers:
- name: akka-cluster
image: akka-sample-cluster-kubernetes:latest
ports:
- name: management
containerPort: 8558
- name: http
containerPort: 8080
readinessProbe:
httpGet:
path: /ready
port: management
initialDelaySeconds: 10
periodSeconds: 10
livenessProbe:
httpGet:
path: /alive
port: management
initialDelaySeconds: 20
periodSeconds: 10

참고 자료

결론

Kubernetes에서 Akka Cluster와 Lagom을 배포하는 것은 컨테이너 환경의 동적 속성을 고려해야 합니다. akka-managementkubernetes-api 기반의 자동 클러스터 부트스트랩을 통해 문제를 해결할 수 있습니다.

Kubernetes에 Akka Cluster, Lagom 배포하기

https://hamin7.github.io/2022/03/28/akkaLagomOnKubernetes/

Author

Hamin Lee

Posted on

2022-03-28

Updated on

2022-03-30

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

Comments

You forgot to set the shortname for Disqus. Please set it in _config.yml.