Kafka UI 설치하기

링키텍트·2025년 3월 27일
post-thumbnail

목적

이 페이지에서는 Amazon EKS(Amazon Elastic Kubernetes Service) 환경에 Kafka UI를 설치하는 방법에 대해 자세히 다룹니다. EKS 클러스터에 Kafka UI를 설치하고, 이를 통해 Kafka 클러스터의 상태를 쉽게 조회하고 관리할 수 있도록 합니다.

Kafka UI를 사용하는 이유

Kafka UI는 Kafka 클러스터를 관리하고 모니터링할 수 있는 강력한 웹 기반 도구로, Kafka 브로커, 토픽, 파티션 등 다양한 리소스를 직관적으로 관리할 수 있게 해줍니다. Kafka를 운영하는 데 있어, 명령줄 인터페이스(CLI)만으로는 부족한 경우가 많습니다. 이 때 Kafka UI를 활용하면 관리가 훨씬 수월해지고, 실시간 모니터링도 가능해집니다.



1. LoadBalancer Controller 설치

외부에서 접속 시에 Ingress ALB를 통한 접속이 필요하기 때문에 LoadBalancer Controller Add-on 설치가 필요합니다.

1.1 AWS LoadBalancer Controller IAM Policy 다운로드

curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.11.0/docs/install/iam_policy.json

1.2 IAM Policy 생성

저는 SSO를 통해 인증/접근하기 때문에 --profile 부분을 추가했습니다.

aws iam create-policy \
	-- profile <SSO Profile name>
    --policy-name AWSLoadBalancerControllerIAMPolicy \
    --policy-document file://iam_policy.json

1.3 Service Account 생성

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

1.4 EKS Chart Helm 리포지토리 추가

helm repo add eks https://aws.github.io/eks-charts

1.5 로컬 리포지토리 업데이트

helm repo update eks

1.6 LoadBalancer Controller 버전 확인

helm을 통해 LB 컨트롤러 설치 시에는 CHART 버전 확인이 필수 입니다.
APP Version이 아닌 CHART Version을 기억해야합니다.

helm search repo eks/aws-load-balancer-controller --versions

1.7 LoadBalancer Controller 설치

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

1.8 설치 확인하기

LoadBalancer가 제대로 설치되었는지 확인하고 마무리합니다.
많이 한 것 같은데 아직 멀었습니다.. Kakfa-UI는 설치도 하지 못했네요 :<

kubectl get po -n kube-system



2. Kafka UI 설치하기

이 페이지에서는 Yaml 파일을 통한 Kafka UI 설치를 해보겠습니다.
Helm을 통한 설치도 있지만 저는 오류가 너무 많이 나서... Yaml 파일을 통한 설치로 노선을 변경했습니다!

2.1 Kafka UI 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

2.2 Kafka UI 배포

kubectl apply -f kafka-ui-deployment.yaml

2.3 Kafka UI Pod 정상 확인

아래 이미지와 같이 Kafka namespace 대상으로 설치가 됐다면 Kafka 설치는 완료되었습니다.



3. Ingress ALB와 연결하기

Kafka-UI를 외부에서 접근하기 위해서는 Public한 자원에 올리던지, Ingress ALB를 통해 접근하던지 2가지의 방법이 있습니다. 저는 Private한 자원에 설치를 했기 때문에 Ingress ALB를 통한 접근이 필요합니다.

3.1 서브넷 태깅하기

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

3.2 Ingress 리소스 생성

저는 간단한 테스트를 위해 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

3.3 Ingress Yaml 파일 배포

kubectl apply -f kafka-ui-ingress.yaml

3.4 ALB 주소 확인

정상적으로 배포되었는지 확인하고 마무리합니다.

kubectl get ingress -n kafka



4. 도메인을 통한 UI 접속

ALB 도메인을 통해 Kafka UI 접속을 시도해봅니다.

4.1 Target Group 생성

아래 옵션을 선택하여 TG을 생성합니다.

  • IP Addresses 선택
  • HTTP
  • 8080
  • EKS와 동일한 VPC

4.2 Target 연결

Target IP를 연결할 때는 EKS의 노드가 아닌 POD의 IP를 연결해줘야합니다.
-o wide 명령어를 통해 POD IP를 알아냅니다. Register하면 끝!

kubectl get po -n kafka -o wide

4.3 ALB에 TG 붙이기

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



Kafka UI 접속

진짜 완료!!! 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를 제공하고 데이터를 처리합니다.

0개의 댓글