본문 바로가기

리눅스

쿠버네티스 대시보드를 설치하고 외부에서 접근할 수 있도록 설정하는 방법

반응형

쿠버네티스 대시보드를 설치하고 외부에서 접근할 수 있도록 설정하는 방법

쿠버네티스 대시보드는 클러스터 리소스를 시각적으로 관리하고 모니터링할 수 있는 웹 UI입니다.

1. 쿠버네티스 대시보드 설치

공식 매니페스트를 사용하여 쿠버네티스 대시보드를 설치합니다

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.1/aio/deploy/recommended.yaml
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created

kubernetes-dashboard 네임스페이스 확인

kubectl get all -n kubernetes-dashboard
NAME                                             READY   STATUS    RESTARTS   AGE
pod/dashboard-metrics-scraper-5cb4f4bb9c-k7bbd   1/1     Running   0          9m1s
pod/kubernetes-dashboard-d77c86c87-4lfbr         1/1     Running   0          9m2s

NAME                                TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service/dashboard-metrics-scraper   ClusterIP   10.110.88.27   <none>        8000/TCP  9m2s
service/kubernetes-dashboard        ClusterIP   10.107.32.5    <none>        443/TCP   9m2s

NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/dashboard-metrics-scraper   1/1     1            1           9m1s
deployment.apps/kubernetes-dashboard        1/1     1            1           9m2s

NAME                                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/dashboard-metrics-scraper-5cb4f4bb9c   1         1         1       9m1s
replicaset.apps/kubernetes-dashboard-d77c86c87         1         1         1       9m2s

2. 서비스 계정 및 권한 설정

대시보드에 접근하기 위해서는 서비스 계정을 생성하고 필요한 권한을 부여해야 합니다.

 

관리 서비스 계정 생성(Service Account 생성)

kubectl create serviceaccount admin-user -n kubernetes-dashboard

또는

cat <<EOF | kubectl create -f -
 apiVersion: v1
 kind: ServiceAccount
 metadata:
   name: admin-user
   namespace: kubernetes-dashboard
EOF

클러스터 관리자 권한 부여(Cluster Role Binding 생성)

kubectl create clusterrolebinding admin-user \
--clusterrole=cluster-admin \
--serviceaccount=kubernetes-dashboard:admin-user

또는

cat <<EOF | kubectl create -f -
 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
EOF

3. 토큰 생성

인증 토큰을 생성하고 출력합니다.

kubectl create token admin-user -n kubernetes-dashboard

외부 접근을 위한 NodePort 또는 Ingress 설정

쿠버네티스 대시보드를 외부에서 접근할 수 있도록 NodePort 또는 Ingress를 설정합니다.

NodePort 설정

NodePort를 사용하여 외부에서 접근할 수 있도록 설정합니다.

kubectl get service kubernetes-dashboard -n kubernetes-dashboard
NAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes-dashboard   ClusterIP   10.109.227.181   <none>        443/TCP   6m59s

kubernetes-dashboard 편집

kubectl edit service kubernetes-dashboard -n kubernetes-dashboard
  • type: ClusterIP -> type: NodePort 변경
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: "2024-07-19T14:10:48Z"
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
  resourceVersion: "4424"
  uid: 35aef6a2-26c5-4667-ac22-de01a0005d5e
spec:
  clusterIP: 10.107.32.5
  clusterIPs:
  - 10.107.32.5
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - port: 443
    protocol: TCP
    targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

NodePort 확인

kubectl get service kubernetes-dashboard -n kubernetes-dashboard
NAME                   TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
kubernetes-dashboard   NodePort   10.109.227.181   <none>        443:31719/TCP   10m

NodePort 사용자 지정

  • nodePort 값을 원하는 포트로 설정할 수 있습니다.
kubectl edit service kubernetes-dashboard -n kubernetes-dashboard
  • nodePort: 31719 -> nodePort: 30001 변경
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: "2024-08-21T14:03:15Z"
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
  resourceVersion: "11298"
  uid: 443c155a-34f1-45bf-82da-b1662e0fecbb
spec:
  clusterIP: 10.109.227.181
  clusterIPs:
  - 10.109.227.181
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - nodePort: 30679
    port: 443
    protocol: TCP
    targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}

NodePort 확인

kubectl get service kubernetes-dashboard -n kubernetes-dashboard
NAME                   TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
kubernetes-dashboard   NodePort   10.109.227.181   <none>        443:30001/TCP   10m
728x90

Ingress 설정

Ingress를 사용하여 외부에서 접근할 수 있도록 설정합니다.

 

NGINX Ingress Controller를 설치합니다.

  • Ingress Controller가 설치되어 있어야 하며 설치되어 있지 않은 경우 먼저 설치를 진행합니다.
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml

Ingress 리소스를 생성합니다.

vim kubernetes-dashboard-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: kubernetes-dashboard-ingress
  namespace: kubernetes-dashboard
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: <your-dashboard-domain>
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: kubernetes-dashboard
            port:
              number: 443
  tls:
  - hosts:
    - <your-dashboard-domain>
    secretName: kubernetes-dashboard-tls

여기서 <dashboard-domain>은 대시보드에 접근할 도메인 이름으로 교체해야 합니다.

파일을 적용하여 Ingress를 생성합니다.

kubectl apply -f kubernetes-dashboard-ingress.yaml

대시보드 접속

  • NodePort를 사용하는 경우, 웹 브라우저에서 https://<NodeIP>:30001로 접속합니다.
  • Ingress를 사용하는 경우, 설정한 도메인 이름을 사용하여 https://<dashbord-domain>로 접속합니다.

대시보드 로그인 화면에서 앞서 생성한 인증 토큰을 사용하여 로그인합니다.

kubectl -n kubernetes-dashboard create token admin-user

 

웹 브라우저

https://{NODE_IP}:30001

kubernetes-dashboard

대시보드

  • 쿠버네티스 대시보드 > 모든 네임스페이스

kubernetes-dashboard

쿠버네티스 대시보드 토큰 제한 시간 변경(token --duration 변경)

서비스 계정(Service Account)에 대한 토큰 생성

kubectl create token --help
$ kubectl create token --help
Request a service account token.

Examples:
  # Request a token with a custom expiration
  kubectl create token myapp --duration 10m
...
    --duration=0s:
	Requested lifetime of the issued token. The server may return a token with a longer or shorter lifetime.

admin-user 토큰의 유효 기간을 24 시간으로 설정하여 생성

kubectl create token admin-user --duration=24h -n kubernetes-dashboard

쿠버네티스 대시보드 삭제

kubectl delete -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.1/aio/deploy/recommended.yaml

 

외부에서 쿠버네티스 대시보드에 접근할 수 있습니다.

 

참고URL

- 쿠버네티스 문서 : 쿠버네티스 대시보드를 배포하고 접속하기

- Kubernetes Documentation : Manually create a long-lived API token for a ServiceAccount

- GitHub Repository : Kubernetes Dashboard

 

728x90
반응형