쿠버네티스 대시보드를 설치하고 외부에서 접근할 수 있도록 설정하는 방법
쿠버네티스 대시보드는 클러스터 리소스를 시각적으로 관리하고 모니터링할 수 있는 웹 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
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
대시보드
- 쿠버네티스 대시보드 > 모든 네임스페이스
쿠버네티스 대시보드 토큰 제한 시간 변경(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
'리눅스' 카테고리의 다른 글
stress 명령어 (0) | 2021.11.21 |
---|---|
docker를 사용한 kafka 클러스터 설정 (0) | 2021.11.17 |
/var/run/docker.sock의 permission denied 발생하는 경우 (0) | 2021.11.02 |
[kubernetes] 쿠버네티스 클러스터 구성(CentOS 7) (0) | 2021.11.01 |
쿠버네티스 초기화 오류(kubeadm init) (0) | 2021.11.01 |