이 페이지에서는 Amazon EKS(Amazon Elastic Kubernetes Service) 환경에 Kafka UI를 설치하는 방법에 대해 자세히 다룹니다. EKS 클러스터에 Kafka UI를 설치하고, 이를 통해 Kafka 클러스터의 상태를 쉽게 조회하고 관리할 수 있도록 합니다.
Kafka UI는 Kafka 클러스터를 관리하고 모니터링할 수 있는 강력한 웹 기반 도구로, Kafka 브로커, 토픽, 파티션 등 다양한 리소스를 직관적으로 관리할 수 있게 해줍니다. Kafka를 운영하는 데 있어, 명령줄 인터페이스(CLI)만으로는 부족한 경우가 많습니다. 이 때 Kafka UI를 활용하면 관리가 훨씬 수월해지고, 실시간 모니터링도 가능해집니다.
외부에서 접속 시에 Ingress ALB를 통한 접속이 필요하기 때문에 LoadBalancer Controller Add-on 설치가 필요합니다.
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.11.0/docs/install/iam_policy.json
저는 SSO를 통해 인증/접근하기 때문에 --profile 부분을 추가했습니다.
aws iam create-policy \
-- profile <SSO Profile name>
--policy-name AWSLoadBalancerControllerIAMPolicy \
--policy-document file://iam_policy.json
profile, cluster_name,policy_arn 부분을 수정해줍니다.
eksctl create iamserviceaccount \
--cluster=<cluster_name> \
--region=<AWS_Region> \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--role-name AmazonEKSLoadBalancerControllerRole \
--attach-policy-arn=<policy_arn> \
--approve
helm repo add eks https://aws.github.io/eks-charts
helm repo update eks
helm을 통해 LB 컨트롤러 설치 시에는 CHART 버전 확인이 필수 입니다.
APP Version이 아닌 CHART Version을 기억해야합니다.
helm search repo eks/aws-load-balancer-controller --versions

helm install aws-load-balancer-controller eks/aws-load-balancer-controller
--version <CHART_Version> -n kube-system \
--set clusterName=<Cluster_Name> \
--set vpcId=<VPC_DI> \
--set region=<AWS_Region> \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller \
--set enableShield=false \
--set enableWaf=false \
--set enableWafv2=false \
--set createIngressClassResource=true \
--set ingressClass=alb
LoadBalancer가 제대로 설치되었는지 확인하고 마무리합니다.
많이 한 것 같은데 아직 멀었습니다.. Kakfa-UI는 설치도 하지 못했네요 :<
kubectl get po -n kube-system

이 페이지에서는 Yaml 파일을 통한 Kafka UI 설치를 해보겠습니다.
Helm을 통한 설치도 있지만 저는 오류가 너무 많이 나서... Yaml 파일을 통한 설치로 노선을 변경했습니다!
저는 Public 이미지를 가져오도록 설정했습니다. Private 이미지를 써야하는 분들은 "image" 부분을 Private 이미지로 수정해주시면 됩니다.
# kafka-ui-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: kafka-ui
namespace: kafka
spec:
replicas: 1
selector:
matchLabels:
app: kafka-ui
template:
metadata:
labels:
app: kafka-ui
spec:
containers:
- name: kafka-ui
image: provectuslabs/kafka-ui:latest
ports:
- containerPort: 8080
env:
- name: KAFKA_CLUSTERS_0_NAME
value: "local"
- name: KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS
value: "<BootStrap Endpoint:9092>"
---
apiVersion: v1
kind: Service
metadata:
name: kafka-ui
namespace: kafka
spec:
selector:
app: kafka-ui
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
kubectl apply -f kafka-ui-deployment.yaml
아래 이미지와 같이 Kafka namespace 대상으로 설치가 됐다면 Kafka 설치는 완료되었습니다.

Kafka-UI를 외부에서 접근하기 위해서는 Public한 자원에 올리던지, Ingress ALB를 통해 접근하던지 2가지의 방법이 있습니다. 저는 Private한 자원에 설치를 했기 때문에 Ingress ALB를 통한 접근이 필요합니다.
EKS(Amazon Elastic Kubernetes Service)에서 ALB(Application Load Balancer)를 자동으로 생성하고 관리할 수 있도록 서브넷을 태깅해야 합니다.
EKS에 할당 된 서브넷 대상으로 kubernetes.io/role/elb TAG가 붙어있는지 확인해야합니다.
aws ec2 describe-subnets --filters "Name=vpc-id,Values=<VPC_ID>"
해당 태그가 없다면 붙여줍니다. Subnet ID는 EKS에 할당되어있는 서브넷 모두 적용시켜줍니다.
aws ec2 create-tags --resources <Subnet_ID> --tags Key=kubernetes.io/role/elb,Value=1
저는 간단한 테스트를 위해 80포트로만 통신할 예정이라 80 포트를 사용하는 yaml 파일을 작성했습니다. ALB_DNS_Name에 EKS Ingress ALB의 DNS Name을 넣어줍니다.
# kafka-ui-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: kafka-ui-ingress
namespace: kafka
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}]'
alb.ingress.kubernetes.io/group.name: kafka-ui-ingress-group
spec:
ingressClassName: alb
rules:
- host: <ALB_DNS_Name>
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: kafka-ui
port:
number: 80
kubectl apply -f kafka-ui-ingress.yaml
정상적으로 배포되었는지 확인하고 마무리합니다.
kubectl get ingress -n kafka

ALB 도메인을 통해 Kafka UI 접속을 시도해봅니다.
아래 옵션을 선택하여 TG을 생성합니다.
Target IP를 연결할 때는 EKS의 노드가 아닌 POD의 IP를 연결해줘야합니다.
-o wide 명령어를 통해 POD IP를 알아냅니다. Register하면 끝!
kubectl get po -n kafka -o wide


아래 이미지와 같이 특정 도메인을 붙여 복잡한 DNS Name으로 접근 하는 것이 아닌 지정한 도메인을 통한 접근이 되게 합니다.

진짜 완료!!! kafka-ui 도메인으로 접속 시에 정상 통신 되는 것 확인 합니다.
제가 설치에 대한 부분만 넣고 ALB, EKS 방화벽에 대한 부분은 생략하였는데요.

포트별 흐름을 정리해봤습니다. 상세 내용은 아래 설명을 읽어주세요.
사용자 → ALB(80) → EKS (8080) → Kafka (8080)
사용자 (80): 사용자가 웹 브라우저나 다른 HTTP 클라이언트를 통해 포트 80을 사용하여 접속합니다. 이 때 사용자가 접속하는 도메인(예: kafka-ui.example.com)을 통해 ALB로 요청이 전달됩니다.
ALB (80): ALB(AWS Application Load Balancer)는 외부에서 들어오는 트래픽을 받아서, 요청을 내부 EKS 클러스터로 전달합니다. ALB는 80번 포트로 요청을 받아서, EKS에 설정된 Ingress 리소스를 통해 해당 서비스로 요청을 포워딩합니다.
EKS (8080): EKS에서 Ingress Controller가 ALB로부터 받은 요청을 처리하고, 해당 요청을 kafka-ui-service로 전달합니다. 이 서비스는 내부에서 8080번 포트를 사용하고, ALB는 80번 포트로 외부와 통신하므로, ALB는 요청을 80번 포트로 받고, EKS의 서비스는 8080번 포트로 처리합니다.
Kafka (8080): kafka-ui-service는 8080번 포트에서 Kafka UI를 제공하고 있습니다. EKS에서 서비스가 해당 포트를 사용하여 Kafka와 연결된 서비스를 통해 UI를 제공하고 데이터를 처리합니다.