[Kubernetes] Kibana Ingress 적용
쿠버네티스 환경에서 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/
[노드 포트 접속 시]
기존의 노드포트로 접속하게 될 경우, /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 옵션으로도 해결할 수 있을 것이다.