본문 바로가기

Devops/Kubernetes

[Kubernetes] 쿠버네티스 Dashboard 설치하기

쿠버네티스 공식 홈페이지 yml로 서비스 설치를 수행한다.

root@master:~# kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
namespace/kubernetes-dashboard unchanged
serviceaccount/kubernetes-dashboard unchanged
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf configured
Warning: resource secrets/kubernetes-dashboard-key-holder is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically.
secret/kubernetes-dashboard-key-holder configured
configmap/kubernetes-dashboard-settings unchanged
role.rbac.authorization.k8s.io/kubernetes-dashboard unchanged
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard unchanged
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard unchanged
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard unchanged
deployment.apps/kubernetes-dashboard configured
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper configured

 

 

설치후 정상적으로 서비스가 떠있는지 확인한다.

root@master:~# kubectl get svc -n kubernetes-dashboard
NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
dashboard-metrics-scraper   ClusterIP   10.110.137.126   <none>        8000/TCP   9m30s
kubernetes-dashboard        ClusterIP   10.97.19.146     <none>        443/TCP    10m

 

외부 접속을 위해 NodePort 설정

 

기존적으로 Service type이 ClusterIP로 되어있다. 노드 외부에서 접속이 가능하도록 Type을 NodePort로 바꾸어준다. 그리고 NodePort가 랜덤으로 생성되면 관리가 어려우므로 특정 Port를 지정해준다.

 

root@master:~# kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: Service
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"k8s-app":"kubernetes-dashboard"},"name":"kubernetes-dashboard","namespace":"kubernetes-dashboard"},"spec":{"ports":[{"port":443,"targetPort":8443}],"selector":{"k8s-app":"kubernetes-dashboard"}}}
  creationTimestamp: "2023-12-26T07:55:00Z"
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
  resourceVersion: "496361"
  uid: 227af817-5a33-4ce8-a3dd-adb43030d376
spec:
  clusterIP: 10.97.19.146
  clusterIPs:
  - 10.97.19.146
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - nodePort: 31000 -> 추가한다.
    port: 443
    protocol: TCP
    targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard
  sessionAffinity: None
  type: NodePort -> 수정한다.
status:
  loadBalancer: {}

 

정상적으로 수정을 완료하면 아래와 같이 완료 메세지가 나온다. 만일 공백 대신에 탭 등으로 띄워쓰기를 하면 잘못된 yaml로 판단하여 에러가 발생하고 상단 주석에 어떤 원인으로 Edit가 거절되었는지 명시가 된다.

 

root@master:~# kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
service/kubernetes-dashboard edited

 

변경 후 다시 확인해보면 NodePort로 서비스 타입이 정상 변경 되었음을 볼 수 있다.

root@master:~# kubectl get svc -n kubernetes-dashboard
NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
dashboard-metrics-scraper   ClusterIP   10.110.137.126   <none>        8000/TCP        18m
kubernetes-dashboard        NodePort    10.97.19.146     <none>        443:31000/TCP   19m

 

NodeIP + 대쉬보드 NodePort 조합으로 url을 브라우저에 입력하면 아래와 같이 대쉬보드 메인으로 진입한다.

 

Access Token 발급 방법

token 생성을 위해서 아래와 같이 role 과 account를 생성한다.

 

clusterRoleBinding.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard

 

serviceAccount.yaml

 

apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard

 

 

위  role과 account 를 생성하였으면 아래와 같이 token 을 발급받는다.

root@DESKTOP-GH94F8C:/home/kindlove/k8s# kubectl -n kubernetes-dashboard create token admin-user
eyJhbGciOiJSUzI1NiIsImtpZCI6IllTSkp5SnhSd0ZCOVZMakI5MDhWWHMwcUZXdGFBUWxrcGtBa2lZYmpMdzQifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzA0NTYyMzc4LCJpYXQiOjE3MDQ1NTg3NzgsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJhZG1pbi11c2VyIiwidWlkIjoiOTc5NTQ0NWYtYTgxMC00NTk4LTkyODgtY2NiNjIzZDAyZjAwIn19LCJuYmYiOjE3MDQ1NTg3NzgsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDphZG1pbi11c2VyIn0.JGFwqgMdESGWScXBO-FwgJRAJrPV0n_OoVoYFok5k3zWPC4Lo9kMffR0KHJnZPggv4cyDYV3gDy4YsRM32PuDlSokPjcq_31sPNKY07ILKeqDeKuIZl_eRpi_3iarQ_iWe-CCjKKp1jRSGZnEwID0hsBz9bmKCClukA455uU4QVdoQ8s5b9MbCNwi4mMGuMXzIZMrGZ6yRSnD2r5_oiOAl_YiCPIY-j3P20rLXFQoTHZrvSB3DHVIz0p8Np0g69o4dxTWzvOEQT-89yXFL8olGz74OaMoxJgF0XRPuNM14oNnQb9rkCr2yEZgluoLTJIlzxKhtUYLsSqwGKYOOLDGQ

 

 

위 발급 받은 토큰으로 로그인 하면 아래와 같이 현재 연결된 Workloads를 볼수 있는 대쉬보드 화면을 볼 수 있게 된다.

 

 

"NET::ERR_CERT_INVALID" 로 로그인 화면 진입이 되지 않는 경우

 

아래 Article을 참조한다. (https://1week.tistory.com/10)

 

아래 yaml로 cert-manager를 다운로드 받아서 설치한다.

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.9.1/cert-manager.yaml

 

대쉬보드 진입시 namespace 조회 권한이 없어서 에러 발생시 임시 조치 방법

 

다음 Article을 참조한다. (https://devpress.csdn.net/k8s/62fcf766c6770329308026a9.html)

 

결론은 아래 명령을 수행하여 admin 권한을 부여한다. 단, 보안에 취약해지기 때문에 학습용도로 제시된 방법임을 숙지한다.

kubectl create clusterrolebinding serviceaccounts-cluster-admin \
  --clusterrole=cluster-admin \
  --group=system:serviceaccounts

 

-- The end --