본문 바로가기
서버구축 (WEB,DB)

Minikube 대시보드 외부에서 접근을 위한 RBAC 설정

by 날으는물고기 2023. 10. 29.

Minikube 대시보드 외부에서 접근을 위한 RBAC 설정

Minikube 대시보드를 시작하고 외부에서 접근할 수 있도록 설정하는 단계별 방법을 설명하겠습니다.

이를 위해 minikube dashboard 명령을 사용하여 Minikube 대시보드를 시작하고 kubectl proxy를 사용하여 외부에서 접근할 수 있게 구성할 것입니다.

  1. Minikube 클러스터 시작:
    Minikube를 시작하려면 터미널에서 다음 명령어를 실행합니다.
    minikube start
  2. Minikube 대시보드 시작:
    다음 명령어를 사용하여 Minikube 대시보드를 시작합니다.
    minikube dashboard
    이 명령을 실행하면 Minikube 대시보드가 기본 웹 브라우저에서 자동으로 열릴 것입니다.
  3. 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 옵션을 사용하여 모든 요청을 허용하도록 설정합니다.
  4. 대시보드에 액세스:
    이제 로컬 브라우저에서 다음 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 필드의 값을 변경하려고 시도했을 때 발생합니다.

 

ClusterRoleBindingClusterRole에 대한 바인딩을 정의하며, 한 번 생성된 ClusterRoleBindingroleRef를 변경할 수 없습니다.

해결 방법

  1. ClusterRoleBinding을 삭제하고 새로 생성:
    ClusterRoleBinding을 삭제하고 새로 생성하여 roleRef를 변경할 수 있습니다. 아래 명령어를 사용하여 ClusterRoleBinding을 삭제하고 새로 생성할 수 있습니다.
    kubectl delete clusterrolebinding kubernetes-dashboard
    그런 다음, 새로운 ClusterRoleBinding을 생성합니다.
  2. 새로운 ClusterRoleClusterRoleBinding 생성:
    ClusterRoleClusterRoleBinding을 새로 생성하면 roleRef를 변경할 필요가 없습니다. 다음과 같이 새로운 ClusterRoleClusterRoleBinding을 생성할 수 있습니다.
    # 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
    위 예제에서는 새로운 ClusterRolecustom-dashboard-role과 이를 사용하는 ClusterRoleBindingcustom-dashboard-role-binding을 생성했습니다. 필요에 따라 rules 섹션에 원하는 RBAC 규칙을 추가하십시오.

두 번째 방법을 선택하면 roleRef를 변경하지 않고도 새로운 RBAC 규칙을 만들 수 있습니다.

RBAC with Kubernetes in Minikube.

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 규칙을 확장할 수 있습니다.

728x90

댓글