Devops/Kubernetes

[Kubernetes] Kibana Ingress 적용

dev_ss 2024. 4. 25. 19:13

 

 

 

 

[ELK] Kubernetes 환경에서 Elasticsearch / Kibana 설치

최근에는 많은 회사들이 Elastic Stack으로 데이터 파이프라인을 구축하여 다양한 분야에서 활용한다. https://ssnotebook.tistory.com/entry/ELK-Elasticsearch [ELK] Elasticsearch 1. 엘라스틱 서치(Elasticsearch) : 아파치

ssnotebook.tistory.com

 

쿠버네티스 환경에서 Elasticsearch와 Kibana의 파드(Statefulset 기반)를 생성하고 연동하는 작업을 했었다.

 

 

그리고 서비스는 NodePort를 띄워 해당 포트(30000)로 접속하는 방식으로 구현을 했었다.

 

 

하지만 쿠버네티스 환경에서는 이러한 NodePort뿐 아니라, Ingress를 적용하여 Loadbalancer를 통한 하나의 진입점에 경로(Path)를 통한 서비스의 분기도 가능하다.

 

 

이번 글에서는 Kibana에 Ingress를 적용하는 과정과, 발생한 문제에 관하여 해결하는 방법을 알아볼 것이다. 


Ingress 적용과 문제 발생

 

아래는 윗글에서 생성한 Kibana 서비스에 대한 Ingress의 yaml이다.

 

# Ingress yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: kong
  labels:
    app.kubernetes.io/name: kibana
  name: kibana
  namespace: default
spec:
  ingressClassName: kong
  rules:
  - http:
      paths:
      - backend:
          service:
            name: kibana
            port:
              number: 5601
        path: /kibana
        pathType: Prefix

 

Ingress Controller는 Kong Ingress Controller를 이용하였고, 그에 따라 ingressClassName이 kong으로 설정된 것을 볼 수 있다.

 

경로는 Prefix로 /kibana일 때, kibana 서비스로 라우팅을 설정하였다.

 

(Ingress 이용 시 Nginx 또는 Kong과 같은 Ingress Controller를 별도로 설치해야 한다.)

 

참고 : https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/

 

Ingress Controllers

In order for an [Ingress](/docs/concepts/services-networking/ingress/) to work in your cluster, there must be an _ingress controller_ running. You need to select at least one ingress controller and make sure it is set up in your cluster. This page lists co

kubernetes.io

 

 

 

 

 

 

[노드 포트 접속 시]

 

 

기존의 노드포트로 접속하게 될 경우, /login?next=%2F라는 경로로 접속하게 되는 것을 볼 수 있는데,

 

이는 Ingress를 적용시켰을 때, 문제가 된다.

 

 

 

 

 

 

 

Ingress Object를 생성하고 아래 주소로 접속을 한다.

 

 

 

 

 

그렇게 되면 노드포트에서 접속한 것처럼 하위 경로를 /login?next=%2Fkibana로 Redirect 되고, 일치하는 경로가 없는 것을 확인할 수 있다.

 

 

Ingress에서 설정한 Prefix가 /kibana인데, 이 부분이 빠져있는 상태로 Redirect 된 것이다.

 

 


Troubleshoot

 

문제는 간단하게 해결할 수 있다.

 

Kibana를 생성할 때, 환경변수 2가지만 추가하면 되는 것이다.

 

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: kibana
  labels:
    app: kibana
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kibana
  template:
    metadata:
      labels:
        app: kibana
    spec:
      containers:
      - name: kibana
        image: elastic/kibana:7.17.2
        env:
        - name: ELASTICSEARCH_HOSTS
          value: "http://elasticsearch-master:9200"
        - name: discovery.type
          value: single-node
        - name: ELASTICSEARCH_USERNAME
          value: "elastic"
        - name: ELASTICSEARCH_PASSWORD
          value: "elasticstack"
############################## 추가된 부분 ###############################
        - name: SERVER_BASEPATH
          value: "/kibana"
        - name: SERVER_REWRITEBASEPATH
          value: "true"
##########################################################################
        ports:
        - containerPort: 5601

 

 

환경변수 SERVER_REWRITEBASEPATH를 지정하여, 상위 경로에 다른 경로가 있다는 것을 선언하고, 해당 Prefix로 오는 경로를 SERVER_BASEPATH라는 환경변수로 지정하여 Ingress에 대한 설정을 할 수 있다.

 

[Ingress의 경로가 /라면, 별도의 환경변수를 주지 않아도 사용이 가능]

 

 

아래는 환경변수를 적용한 Kibana의 접속 결과이다.

 

 

 

+ 추가적으로 Helm Chart로 설치했다면, values.yaml내 Ingress 부분에 설정할 수 있는 옵션이 존재할 것이고, nginx 기반의 ingress-controller를 사용했다면, rewrite path 옵션으로도 해결할 수 있을 것이다. 

 

 

 

 

반응형