클라우드 환경에서 관리형 쿠버네티스 서비스를 사용할 경우 현재 관리 중인 클러스터에 대한 전반적인 모니터링 대시보드를 제공한다.
보통 노드 / 네임스페이스 / 워크로드의 상태나 이벤트 등을 볼 수 있는데 메트릭이나 로깅 등은 Prometheus-Grafana, Fluentbit / Fluentd 등을 따로 세팅해서 봐야 하지만 그래도 전반적인 현황을 볼 수 있어서 요긴하게 쓰인다.
이러한 대시보드는 쿠버네티스에서도 기본적으로 제공을 하고 있는데, minikube만 해도 가이드라인에 대시보드 플러그인을 설치하는 항목이 나와 있으며, 설치가 매우 간단한 편이다.
다만 일반적으로 나와 있는 가이드라인에서는 대시보드를 배포하고 Kong Proxy의 포트를 포트 포워딩하여 웹에서 접근하도록 하고 있으나, 앞서 필자는 Nginx Gateway Fabric을 배포하였으므로 그런 과정이 필요가 없게 되었다.
필자는 Helm을 통해 Kubernetes Dashboard를 배포하였는데, 관리 용이성을 위해 values.yaml을 커스텀하는 식으로 설정하였다.
(물론 건드린 부분은 딱 한 군데 뿐이지만...)
일단 Helm Repo를 추가해야 한다.
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
Helm Repo를 추가했다면 다음 values.yaml을 작성한다. 여기서 변경된 부분은 Kong Proxy에 대한 설정인데, 이유는 후술한다.
참고로 Kong Proxy는 Kubernetes Dashboard의 인증, API, 웹 서비스 엔드포인트를 하나로 묶으면서 SSL 접근하도록 도와주는 역할을 한다.
# https://github.com/kubernetes/dashboard/blob/master/charts/kubernetes-dashboard/values.yaml
kong:
proxy:
http:
enabled: true
그리고 Dashboard에 대한 접근 제어를 위해 ServiceAccount, ClusterRoleBinding, Secert 리소스를 작성한 후 배포한다.
# dashboard-sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
# dashboard-sa-crb.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
# dashboard-sa-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: admin-user
namespace: kubernetes-dashboard
annotations:
kubernetes.io/service-account.name: "admin-user"
type: kubernetes.io/service-account-token
kubectl apply -f dashboard-sa.yaml
kubectl apply -f dashboard-sa-crb.yaml
kubectl apply -f dashboard-sa-secret.yaml
모든 준비가 끝났다면 helm install을 통해 배포한다.
helm install kubernetes-dashboard/kubernetes-dashboard --name kubernetes-dashboard -f values.yaml
잘 배포가 되었는지 확인을 하려면 kubectl get all -n kubernetes-dashboard
로 확인하면 된다.
여기서 kong.proxy.http.enabled=true
를 했기 때문에 kubernetes-dashboard-kong-proxy의 포트가 80, 443 2개가 열린 것을 확인할 수 있다 (원래는 443 포트만 열린다)
일반적으로 Nginx Gateway Fabric이나 Nginx Ingress Controller가 없었다면 kubernetes-dashboard-kong-proxy를 포트 포워딩한 후, 이를 홈 서버의 Nginx에서 도메인 이름으로 분기 처리하여 연결했을 것이다.
하지만 이미 Nginx Gateway Fabric이 있기 때문에 HTTPRoute를 통해 Gateway에서 Kubernetes Dashboard로 요청을 넘길 수 있다.
이를 위해 HTTPRoute 리소스 명세와 ReferenceGrant 리소스 명세를 작성한다.
(ReferenceGrant 리소스는 Gateway에게 요청을 받는 서비스 쪽에서도 Gateway를 참조할 수 있게 해주는 리소스이다)
# dashboard-httproute.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: dashboard-httproute
spec:
parentRefs:
- name: gateway
sectionName: https
hostnames:
- "testdashboard.cocoball.info"
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: kubernetes-dashboard-kong-proxy
namespace: kubernetes-dashboard
port: 80
# dashboard-referencegrant.yaml
apiVersion: gateway.networking.k8s.io/v1beta1
kind: ReferenceGrant
metadata:
name: kubernetes-dashboard-kong-proxy
namespace: kubernetes-dashboard
spec:
from:
- group: gateway.networking.k8s.io
kind: HTTPRoute
namespace: default
to:
- group: ""
kind: Service
명세를 확인해보면, 다음 규칙에 대해
다음과 같이 라우팅한다.
여기서 443번 포트가 아닌 80번 포트로 지정을 한 이유는, 현재 Gateway의 리스너 설정에서 HTTPS 프로토콜의 경우, TLS 모드가 'Terminate' 뿐이라서 백엔드 서비스로 요청을 전달할 때엔 TLS가 종료되기 때문에 Kong Proxy의 기본 설정 포트인 443 포트로 전달될 때 Bad Request가 발생하기 때문이다.
TLS Passthrough를 위한 TLSRoute와 BackendTLSPolicy 리소스의 경우 앞서 설명했던 것처럼 stable 버전이 아닌 실험 버전에 존재하기 때문에 아직 사용할 수 없어서 이렇게 처리를 했다. 만약 TLSRoute, BackendTLSPolicy가 stable 버전에도 업데이트가 된다면 설정을 변경해볼 예정이다.
어쨌든 위의 설정으로 다음과 같은 흐름으로 대시보드에 접근이 가능해진다.
도메인 주소를 통해 접근하면 로그인 페이지가 노출되는데, 여기서 토큰은 다음 명령어로 확인해서 입력할 수 있다.
kubectl get secret admin-user -n kubernetes-dashboard -o jsonpath={".data.token"} | base64 -d
홈 서버의 가용 자원이 아주 크지 않아서 좀 더 고려를 해보긴 해야겠지만... 만약 추가를 한다면 다음 내용이 될 것 같다.
다만 Prometheus가 생각보다 리소스를 많이 사용해서 홈 서버에 무리를 주지 않을지 좀 확인이 필요할 것 같다.
ArgoCD의 경우에도 현재 사이드 프로젝트가 많지 않아서 GitOps까지 적용해야 하나 싶긴 하고...
로깅 파이프라인의 경우 로그를 저장할 백엔드를 Elasticsearch를 썼었는데 이것도 리소스를 많이 사용해서.... 잘 모르겠다.