본문 바로가기

리눅스

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

728x90

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

쿠버네티스 대시보드 설치

쿠버네티스 대시보드를 설치합니다

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.1/aio/deploy/recommended.yaml
$ 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
$ 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

관리자 서비스 계정 및 인증 토큰 생성

대시보드에 접근하기 위해 관리자 권한을 가진 서비스 계정을 생성하고 인증 토큰을 발급받습니다.

 

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

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

관리자 권한 부여(Cluster Role Binding 생성)

  • 역할 바인딩을 통해 서비스 계정에 관리자 권한을 부여합니다.
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
$ 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
clusterrolebinding.rbac.authorization.k8s.io/admin-user created

인증 토큰 생성

  • 인증 토큰을 생성하고 출력합니다.
kubectl create token admin-user -n kubernetes-dashboard

kubernetes-dashboard 네임스페이스에 있는 admin-user 서비스 계정과 관련된 secret의 상세 정보를 확인

kubectl describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}') -n kubernetes-dashboard
Name:         kubernetes-dashboard-certs
Namespace:    kubernetes-dashboard
Labels:       k8s-app=kubernetes-dashboard
Annotations:  <none>

Type:  Opaque

Data
====


Name:         kubernetes-dashboard-csrf
Namespace:    kubernetes-dashboard
Labels:       k8s-app=kubernetes-dashboard
Annotations:  <none>

Type:  Opaque

Data
====
csrf:  256 bytes


Name:         kubernetes-dashboard-key-holder
Namespace:    kubernetes-dashboard
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
priv:  1679 bytes
pub:   459 bytes

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

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

NodePort 설정

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

kubectl get service kubernetes-dashboard -n kubernetes-dashboard
$ kubectl get service kubernetes-dashboard -n kubernetes-dashboard
NAME                   TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
kubernetes-dashboard   ClusterIP   10.102.6.82   <none>        443/TCP   3m27s

kubernetes-dashboard 편집

kubectl edit service kubernetes-dashboard -n kubernetes-dashboard
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: {}
  • type: ClusterIP -> type: NodePort 변경
kubectl edit service kubernetes-dashboard -n kubernetes-dashboard
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: NodePort
status:
  loadBalancer: {}

NodePort 확인

kubectl get service kubernetes-dashboard -n kubernetes-dashboard

또는 NodePort를 사용자 지정할 수도 있습니다.

  • 아래 명령어를 실행하여 YAML 파일을 편집한 후 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-07-19T14:10:48Z"
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
  resourceVersion: "5014"
  uid: 35aef6a2-26c5-4667-ac22-de01a0005d5e
spec:
  clusterIP: 10.107.32.5
  clusterIPs:
  - 10.107.32.5
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - nodePort: 30001
    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
$ kubectl get service kubernetes-dashboard -n kubernetes-dashboard
NAME                   TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)         AGE
kubernetes-dashboard   NodePort   10.107.32.5   <none>        443:30001/TCP   7m12s
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

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

- GitHub repository : kubernetes dashboard releases

 

728x90