Minikube 대시보드를 시작하고 외부에서 접근할 수 있도록 설정하는 단계별 방법을 설명하겠습니다.
이를 위해 minikube dashboard
명령을 사용하여 Minikube 대시보드를 시작하고 kubectl proxy
를 사용하여 외부에서 접근할 수 있게 구성할 것입니다.
- Minikube 클러스터 시작:
Minikube를 시작하려면 터미널에서 다음 명령어를 실행합니다.minikube start
- Minikube 대시보드 시작:
다음 명령어를 사용하여 Minikube 대시보드를 시작합니다.
이 명령을 실행하면 Minikube 대시보드가 기본 웹 브라우저에서 자동으로 열릴 것입니다.minikube dashboard
- kubectl proxy 실행:
Minikube 대시보드를 외부에서 접근할 수 있도록kubectl proxy
를 실행합니다. 이렇게 하면 로컬 컴퓨터와 Minikube 클러스터 간의 프록시가 설정됩니다. 새 터미널 창에서 다음 명령어를 실행합니다.kubectl proxy --address='0.0.0.0' --disable-filter=true
--address='0.0.0.0'
옵션을 사용하여 모든 IP 주소에서 대시보드에 액세스할 수 있도록 설정하고,--disable-filter=true
옵션을 사용하여 모든 요청을 허용하도록 설정합니다. - 대시보드에 액세스:
이제 로컬 브라우저에서 다음 URL을 사용하여 Minikube 대시보드에 액세스할 수 있습니다.http://MINIKUBE_IP:8001/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
MINIKUBE_IP
는 Minikube 클러스터의 IP 주소입니다.minikube ip
명령어를 사용하여 Minikube의 IP 주소를 확인할 수 있습니다.
예를 들어,http://192.168.49.2:8001/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
와 같은 URL을 사용하여 대시보드에 액세스할 수 있습니다.
이제 Minikube 대시보드를 시작하고 외부에서 접근할 수 있도록 구성되었습니다. 필요한 경우 Minikube 대시보드에 로그인하려면 대시보드에서 토큰을 생성하고 사용자 이름 및 비밀번호를 입력해야 할 수 있습니다.
Kubernetes 대시보드를 상시로 배포하고 외부에서 접근할 수 있도록 설정하려면 아래의 Kubernetes 리소스 정의와 명령어를 사용하여 대시보드를 배포하고 구성할 수 있습니다.
1. Kubernetes 리소스 정의 생성:
먼저, 다음과 같은 Kubernetes 리소스 정의를 생성합니다. 이 정의는 Kubernetes 대시보드를 배포하고 외부에서 접근할 수 있도록 서비스, Ingress, 및 RBAC(Role-Based Access Control) 설정을 포함합니다.
# dashboard.yaml
apiVersion: v1
kind: Namespace
metadata:
name: kubernetes-dashboard
---
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
# Kubernetes 대시보드 서비스
---
apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
ports:
- port: 443
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
# 대시보드에서 사용할 TLS 인증서 및 비밀키를 저장하는 시크릿
---
apiVersion: v1
kind: Secret
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard-certs
namespace: kubernetes-dashboard
type: kubernetes.io/tls
# 대시보드에서 사용할 CSRF 토큰을 저장하는 시크릿
---
apiVersion: v1
kind: Secret
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard-csrf
namespace: kubernetes-dashboard
type: Opaque
data:
csrf: ""
# 대시보드에서 사용할 Key Holder를 저장하는 시크릿
---
apiVersion: v1
kind: Secret
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard-key-holder
namespace: kubernetes-dashboard
type: Opaque
# 대시보드 설정을 저장하는 ConfigMap
---
apiVersion: v1
kind: ConfigMap
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard-settings
namespace: kubernetes-dashboard
# 대시보드에 필요한 RBAC 설정
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
rules:
- apiGroups: [""]
resources: ["secrets"]
resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs", "kubernetes-dashboard-csrf"]
verbs: ["get", "update", "delete"]
- apiGroups: [""]
resources: ["configmaps"]
resourceNames: ["kubernetes-dashboard-settings"]
verbs: ["get", "update"]
# 대시보드에 필요한 ClusterRole 설정
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
rules:
- apiGroups: ["metrics.k8s.io"]
resources: ["pods", "nodes"]
verbs: ["get", "list", "watch"]
# 대시보드에 필요한 RoleBinding 및 ClusterRoleBinding 설정
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: kubernetes-dashboard
subjects:
- kind: ServiceAccount
name: kubernetes-dashboard
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: kubernetes-dashboard
subjects:
- kind: ServiceAccount
name: kubernetes-dashboard
namespace: kubernetes-dashboard
2. Kubernetes 대시보드 배포:
위의 YAML 파일을 사용하여 Kubernetes 대시보드를 배포합니다. 다음 명령을 사용합니다.
kubectl apply -f dashboard.yaml
3. Kubernetes 대시보드 서비스 외부 노출:
외부에서 대시보드에 액세스하려면 Kubernetes Ingress 리소스를 사용하여 대시보드 서비스를 외부로 노출해야 합니다. 다음과 같이 Ingress 리소스를 생성하는 dashboard-ingress.yaml
파일을 작성합니다.
# dashboard-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: kubernetes-dashboard-ingress
namespace: kubernetes-dashboard
spec:
rules:
- host: your-domain.com # 대시보드에 액세스할 도메인을 여기에 입력
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: kubernetes-dashboard
port:
number: 443
tls:
- hosts:
- your-domain.com # TLS 인증서를 사용할 도메인을 여기에 입력
secretName: kubernetes-dashboard-certs
4. Ingress 리소스 생성:
Ingress 리소스를 생성하여 대시보드를 외부로 노출합니다. 다음 명령을 사용합니다.
kubectl apply -f dashboard-ingress.yaml
5. 대시보드 접근:
이제 대시보드를 외부에서 접근할 수 있게 설정되었습니다. 대시보드에 액세스하려면 미리 설정한 도메인(your-domain.com
)으로 브라우저에서 접속하면 됩니다. TLS 인증서를 사용하려면 도메인과 일치하는 SSL/TLS 인증서를 제공해야 합니다.
이제 Kubernetes 대시보드가 상시로 배포되고 외부에서 접근할 수 있도록 설정되었습니다.
대시보드 배포 시 아래와 같은 오류가 발생할 수 있습니다.
The ClusterRoleBinding "kubernetes-dashboard" is invalid: roleRef: Invalid value: rbac.RoleRef{APIGroup:"rbac.authorization.k8s.io", Kind:"ClusterRole", Name:"kubernetes-dashboard"}: cannot change roleRef
이 오류는 ClusterRoleBinding
리소스에서 roleRef
필드의 값을 변경하려고 시도했을 때 발생합니다.
ClusterRoleBinding
은 ClusterRole
에 대한 바인딩을 정의하며, 한 번 생성된 ClusterRoleBinding
은 roleRef
를 변경할 수 없습니다.
해결 방법
ClusterRoleBinding
을 삭제하고 새로 생성:ClusterRoleBinding
을 삭제하고 새로 생성하여roleRef
를 변경할 수 있습니다. 아래 명령어를 사용하여ClusterRoleBinding
을 삭제하고 새로 생성할 수 있습니다.
그런 다음, 새로운kubectl delete clusterrolebinding kubernetes-dashboard
ClusterRoleBinding
을 생성합니다.- 새로운
ClusterRole
및ClusterRoleBinding
생성:ClusterRole
과ClusterRoleBinding
을 새로 생성하면roleRef
를 변경할 필요가 없습니다. 다음과 같이 새로운ClusterRole
과ClusterRoleBinding
을 생성할 수 있습니다.
위 예제에서는 새로운# ClusterRole apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: labels: k8s-app: kubernetes-dashboard name: custom-dashboard-role rules: # Add your rules here # ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: custom-dashboard-role-binding subjects: - kind: ServiceAccount name: kubernetes-dashboard namespace: kubernetes-dashboard # Update with the appropriate namespace roleRef: kind: ClusterRole name: custom-dashboard-role # Reference your new ClusterRole apiGroup: rbac.authorization.k8s.io
ClusterRole
인custom-dashboard-role
과 이를 사용하는ClusterRoleBinding
인custom-dashboard-role-binding
을 생성했습니다. 필요에 따라rules
섹션에 원하는 RBAC 규칙을 추가하십시오.
두 번째 방법을 선택하면 roleRef
를 변경하지 않고도 새로운 RBAC 규칙을 만들 수 있습니다.
RBAC (Role-Based Access Control)는 Kubernetes 클러스터 내에서 권한을 관리하는 중요한 메커니즘입니다. 기존의 ClusterRole과 ClusterRoleBinding을 변경하지 않고 새로운 RBAC 규칙을 만들 수 있습니다. 이를 통해 새로운 권한을 부여하거나 새로운 서비스 계정에 역할을 할당할 수 있습니다.
다음은 기존 ClusterRole과 ClusterRoleBinding을 변경하지 않고 새로운 RBAC 규칙을 생성하는 예시입니다.
새로운 Role 생성
새로운 RBAC 역할(Role)을 생성합니다. 이 역할은 새로운 규칙을 정의하고, 기존 ClusterRole에 영향을 주지 않습니다.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: my-custom-role
namespace: my-namespace # 역할을 할당할 네임스페이스 지정
rules:
- apiGroups: [""]
resources: ["pods"] # 새로운 리소스에 대한 접근 권한 추가
verbs: ["get", "list", "create", "delete"] # 원하는 동작 지정
# 추가적인 규칙을 필요한 만큼 정의
새로운 ServiceAccount 생성
새로운 서비스 계정을 생성하고, 이 계정에 새로 만든 RBAC 역할을 할당합니다.
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-service-account
namespace: my-namespace # 새로운 서비스 계정을 생성할 네임스페이스 지정
RoleBinding 생성
새로운 RoleBinding을 생성하여 서비스 계정에 역할(Role)을 할당합니다.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: my-role-binding
namespace: my-namespace # RoleBinding을 적용할 네임스페이스 지정
roleRef:
kind: Role
name: my-custom-role # 새로운 RBAC 역할의 이름 지정
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: my-service-account # 새로운 서비스 계정의 이름 지정
namespace: my-namespace # 서비스 계정이 있는 네임스페이스 지정
이제 "my-service-account" 서비스 계정은 "my-custom-role" RBAC 역할의 정의된 접근 권한을 갖게 됩니다. 이 방법을 사용하여 새로운 규칙을 추가하고 서비스 계정에 할당할 수 있으며, 기존 ClusterRole과 ClusterRoleBinding을 변경하지 않고도 RBAC 규칙을 확장할 수 있습니다.
댓글