쿠버네티스 대시보드를 설치하고 외부에서 접근할 수 있도록 설정하는 방법
쿠버네티스 대시보드 설치
쿠버네티스 대시보드를 설치합니다
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
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
- 쿠버네티스 문서 : 쿠버네티스 대시보드를 배포하고 접속하기
- GitHub repository : kubernetes dashboard releases
'리눅스' 카테고리의 다른 글
CentOS 8에서 Yum Repository 서버를 구축하는 방법 (0) | 2021.11.02 |
---|---|
/var/run/docker.sock의 permission denied 발생하는 경우 (0) | 2021.11.02 |
[draft] CentOS 7에서 Bash 자동 완성 기능을 사용하는 방법 (0) | 2021.11.01 |
[kubernetes] 쿠버네티스 클러스터 구성(CentOS 7) (2) | 2021.11.01 |
쿠버네티스(kubernetes) 초기화(kubeadm init 오류) (1) | 2021.11.01 |