Kubernetes에 Akka Cluster, Lagom 배포하기

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 설정 방법

1️⃣ 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}
}
}

2️⃣ 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)
}
}

3️⃣ 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.
You need to set client_id and slot_id to show this AD unit. Please set it in _config.yml.