Kubernetes 기반 역할 기반 접근 제어 (RBAC) 구현

KubernetesBeginner
지금 연습하기

소개

Kubernetes 클러스터에서 RBAC (Role-Based Access Control, 역할 기반 접근 제어) 는 클러스터 내 리소스 및 작업에 대한 접근을 제어하는 데 사용됩니다. RBAC 를 통해 클러스터 관리자는 사용자, 그룹 및 서비스 계정에 대한 역할과 권한을 정의하여 클러스터 내 리소스 및 작업에 대한 접근을 제어할 수 있습니다. 이 랩에서는 RBAC 를 사용하여 Kubernetes 클러스터의 리소스에 대한 접근을 제어하는 방법을 배우게 됩니다.

Minikube 클러스터 시작

리소스를 생성하기 전에 실행 중인 Kubernetes 클러스터가 필요합니다. Minikube 는 로컬 머신에서 실행되는 가벼운 Kubernetes 환경입니다.

  1. 작업 디렉토리로 이동:

    터미널을 열고 기본 프로젝트 폴더로 이동합니다.

    cd /home/labex/project
    
  2. Minikube 시작:

    Minikube 를 시작하여 Kubernetes 클러스터를 초기화합니다.

    minikube start
    
    • 이 명령은 로컬 머신에 단일 노드 Kubernetes 클러스터를 설정합니다.
    • Minikube 는 시스템 성능에 따라 시작하는 데 몇 분 정도 걸릴 수 있습니다.
  3. Minikube 가 실행 중인지 확인:

    Minikube 클러스터의 상태를 확인합니다.

    minikube status
    
    • kubeletapiserver와 같은 구성 요소가 Running으로 나열되어 있는지 확인합니다.
    • 클러스터가 실행 중이지 않으면 minikube start를 다시 실행합니다.

Minikube 를 시작하는 데 문제가 발생하면 필요에 따라 minikube delete를 사용하여 환경을 재설정하십시오.

네임스페이스 생성

다음 명령을 사용하여 myapp이라는 새 네임스페이스를 생성합니다.

kubectl create namespace myapp

Role 생성

myapp 네임스페이스에서 myapp-reader라는 새 Role 을 생성합니다. 이 Role 은 myapp-reader-role.yaml이라는 다음 YAML 파일을 사용하여 사용자가 네임스페이스 내의 Pod 및 Service 를 읽을 수 있도록 허용합니다.

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: myapp
  name: myapp-reader
rules:
  - apiGroups: [""]
    resources: ["pods", "services"]
    verbs: ["get", "watch", "list"]

이 Role 은 사용자가 myapp 네임스페이스에서 Pod 및 Service 를 읽을 수 있도록 (get, watch, list) 허용합니다.

다음 명령을 사용하여 Role 을 생성합니다.

kubectl apply -f myapp-reader-role.yaml

Role Binding 생성

myapp-reader Role 을 myapp 네임스페이스의 사용자 또는 그룹에 바인딩하는 Role Binding 을 생성합니다. 예를 들어, myapp-reader Role 을 myapp 네임스페이스의 developer 사용자에게 바인딩하려면 myapp-reader-binding.yaml이라는 다음 YAML 파일을 생성합니다.

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: myapp-reader-binding
  namespace: myapp
subjects:
  - kind: User
    name: developer
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: myapp-reader
  apiGroup: rbac.authorization.k8s.io

이 Role Binding 은 myapp-reader Role 을 myapp 네임스페이스의 developer 사용자에게 바인딩합니다.

다음 명령을 사용하여 Role Binding 을 생성합니다.

kubectl apply -f myapp-reader-binding.yaml

접근 권한 테스트

다음 명령을 사용하여 myapp 네임스페이스의 Pod 목록을 가져오려고 시도하여 myapp 네임스페이스에 대한 접근 권한을 테스트합니다.

kubectl get pods -n myapp --as developer

클러스터에 Pod 가 없을 수 있으므로 myapp 네임스페이스에 리소스가 없다는 메시지가 표시되어야 합니다. 실습을 완료하면 이 명령을 사용하고 myapp 네임스페이스의 Pod 목록을 볼 수 있습니다.

다음 명령을 사용하여 네임스페이스의 Pod 목록을 가져오려고 시도하여 default 네임스페이스에 대한 접근 권한을 테스트합니다.

kubectl get pods --as developer

default 네임스페이스에 대한 접근 권한이 없다는 오류 메시지가 표시되어야 합니다.

ClusterRole 생성

myapp-admin이라는 새로운 ClusterRole 을 생성합니다. 이 ClusterRole 은 사용자가 myapp-admin-clusterrole.yaml이라는 다음 YAML 파일을 사용하여 모든 네임스페이스에서 Pod 및 Service 를 생성, 삭제 및 업데이트할 수 있도록 허용합니다.

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: myapp-admin
rules:
  - apiGroups: [""]
    resources: ["pods", "services"]
    verbs: ["get", "list", "watch", "create", "update", "delete"]

이 ClusterRole 은 사용자가 모든 네임스페이스의 Pod 및 Service 에 대해 모든 작업 (get, list, watch, create, update, delete) 을 수행할 수 있도록 허용합니다.

다음 명령을 사용하여 ClusterRole 을 생성합니다.

kubectl apply -f myapp-admin-clusterrole.yaml

ClusterRole Binding 생성

myapp-admin ClusterRole 을 클러스터의 사용자 또는 그룹에 바인딩하는 ClusterRole Binding 을 생성합니다. 예를 들어, myapp-admin ClusterRole 을 cluster-admin 사용자에게 바인딩하려면 myapp-admin-binding.yaml이라는 다음 YAML 파일을 생성합니다.

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: myapp-admin-binding
subjects:
  - kind: User
    name: cluster-admin
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: myapp-admin
  apiGroup: rbac.authorization.k8s.io

이 ClusterRole Binding 은 myapp-admin ClusterRole 을 cluster-admin 사용자에게 바인딩합니다.

다음 명령을 사용하여 ClusterRole Binding 을 생성합니다.

kubectl apply -f myapp-admin-binding.yaml

접근 권한 테스트

myapp 네임스페이스에서 Pod 를 생성하는 접근 권한을 테스트합니다. myapp-pod.yaml이라는 다음 YAML 파일을 사용하여 Pod 를 생성합니다.

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  namespace: myapp
spec:
  containers:
    - name: myapp-container
      image: nginx
      ports:
        - containerPort: 80

다음 명령을 사용하여 Pod 를 생성합니다.

kubectl apply -f myapp-pod.yaml --as cluster-admin

Pod 가 생성되었음을 나타내는 메시지가 표시되어야 합니다.

myapp 네임스페이스에서 Deployment 를 생성하는 접근 권한을 테스트합니다. myapp-deployment.yaml이라는 다음 YAML 파일을 사용하여 Deployment 를 생성합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
  namespace: myapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp-deployment
  template:
    metadata:
      labels:
        app: myapp-deployment
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80

다음 명령을 사용하여 Pod 를 생성합니다.

kubectl apply -f myapp-deployment.yaml --as cluster-admin

myapp 네임스페이스에서 Deployment 를 생성할 권한이 없음을 나타내는 오류 메시지가 표시되어야 합니다.

요약

이 랩에서는 Kubernetes 에서 RBAC (Role-Based Access Control, 역할 기반 접근 제어) 를 사용하여 클러스터 내의 리소스 및 작업에 대한 접근 권한을 제어하는 방법을 배웠습니다. 특정 네임스페이스의 리소스에 대한 접근 권한을 제어하기 위해 네임스페이스, Role 및 Role Binding 을 생성했습니다. 또한 모든 네임스페이스의 리소스에 대한 접근 권한을 제어하기 위해 ClusterRole 및 ClusterRole Binding 을 생성했습니다. 이 랩을 마치면 Kubernetes 클러스터에서 RBAC 를 사용하여 리소스 및 작업에 대한 접근 권한을 제어하는 방법에 대한 이해를 높일 수 있습니다.