안녕하세요, 오늘은 쿠버네티스 네임스페이스(Namespace)에 대해 자세히 알아보고, 실습을 통해 개념을 확실히 익혀보겠습니다.
쿠버네티스 네임스페이스는 클러스터 내에서 리소스들을 논리적으로 분리하여 사용할 수 있도록 도와주는 중요한 기능입니다. 네임스페이스를 활용하면, 하나의 클러스터에서 여러 애플리케이션이나 팀, 혹은 환경을 분리하여 관리할 수 있습니다. 이는 리소스 간의 충돌을 방지하고, 보다 체계적인 운영이 가능하도록 해줍니다.
하나의 클러스터에서 여러 팀이 동시에 개발하고 배포하는 경우, 각 팀이 같은 이름의 리소스를 사용할 때 문제가 발생할 수 있습니다. 예를 들어, 각 팀이 같은 이름의 파드나 서비스를 생성하면 충돌이 일어나겠죠. 이럴 때 네임스페이스를 이용해 이름 공간을 분리함으로써 각 팀이 독립적으로 리소스를 사용할 수 있게 됩니다.
여기서 예시를 들어볼게요. 가상의 에코미디어(EcoMedia)라는 회사가 있다고 가정해봅시다. 이 회사는 다양한 디지털 미디어 서비스와 커뮤니티를 운영합니다. 에코미디어는 세 가지 주요 서비스 라인을 가지고 있습니다.
이 각각의 서비스가 독립적으로 관리될 필요가 있기 때문에, 쿠버네티스에서 이를 위한 각각의 네임스페이스를 만들 수 있습니다.
이렇게 네임스페이스를 분리하면, 동일한 클러스터 내에서도 각 서비스의 리소스가 충돌 없이 운영될 수 있습니다. 각 네임스페이스에서 동일한 이름의 파드, 서비스, 컨피그맵 등이 생성되더라도 문제없이 작동합니다.
먼저, 현재 클러스터에 어떤 네임스페이스가 있는지 확인해봅시다.
kubectl get namespaces
이 명령어를 실행하면 기본 네임스페이스인 default, kube-system, kube-public 등이 출력될 것입니다.
이제 에코미디어의 세 가지 서비스 라인을 위한 네임스페이스를 만들어보겠습니다.
kubectl create namespace tv-namespace
kubectl create namespace news-namespace
kubectl create namespace community-namespace
이 명령어를 통해 각각의 네임스페이스가 생성됩니다.
생성된 네임스페이스를 다시 확인해봅시다.
kubectl get namespaces
생성된 tv-namespace, news-namespace, community-namespace가 리스트에 포함되어 있는지 확인할 수 있습니다.
이제 네임스페이스에 파드를 배포해보겠습니다. tv-namespace에 Nginx 웹 서버를 배포해보겠습니다.
kubectl run nginx-tv --image=nginx --namespace=tv-namespace
파드가 제대로 생성되었는지 확인하기 위해 tv-namespace에서 실행 중인 파드를 확인해봅니다.
kubectl get pods --namespace=tv-namespace
이제 같은 Nginx 파드를 news-namespace에도 배포해보겠습니다.
kubectl run nginx-news --image=nginx --namespace=news-namespace
배포 후 news-namespace에서 실행 중인 파드도 확인해봅시다.
kubectl get pods --namespace=news-namespace
이렇게 동일한 nginx 이미지를 각각 다른 네임스페이스에 배포해도 리소스 충돌 없이 독립적으로 운영되는 것을 확인할 수 있습니다.
네임스페이스는 리소스를 논리적으로 분리할 뿐 아니라, 리소스 격리 기능을 제공합니다. 예를 들어, CPU와 메모리 같은 자원을 네임스페이스별로 할당하여 관리할 수 있습니다. 이를 통해 각 네임스페이스가 클러스터 자원을 공평하게 사용할 수 있도록 보장할 수 있습니다.
다음은 news-namespace에서 사용할 CPU와 메모리를 제한하는 리소스 쿼터(Resource Quota)의 예시입니다.
apiVersion: v1
kind: ResourceQuota
metadata:
name: news-quota
namespace: news-namespace
spec:
hard:
requests.cpu: "2"
requests.memory: 2Gi
limits.cpu: "4"
limits.memory: 4Gi
이 YAML 파일을 통해 news-namespace에 할당할 자원을 제한할 수 있습니다. 이 리소스 쿼터를 적용하려면 다음 명령을 사용합니다.
kubectl apply -f resource-quota.yaml
네임스페이스는 RBAC(Role-Based Access Control)와도 밀접하게 연관됩니다. 각 네임스페이스별로 접근 권한을 설정하여 특정 사용자나 팀이 특정 네임스페이스에만 접근하도록 제한할 수 있습니다. 이를 통해 클러스터 보안과 관리가 더욱 강화됩니다.
다음은 tv-namespace에 대한 권한을 설정하는 RBAC 예시입니다.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: tv-user-binding
namespace: tv-namespace
subjects:
- kind: User
name: "tv-user"
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: "view"
apiGroup: rbac.authorization.k8s.io
이 설정을 통해 tv-user라는 사용자가 tv-namespace에서만 리소스를 조회할 수 있는 권한을 부여받게 됩니다.
네임스페이스를 삭제할 때는 그 안에 있는 모든 리소스도 함께 삭제됩니다. 예를 들어, community-namespace를 삭제하려면 다음 명령을 실행합니다.
kubectl delete namespace community-namespace
삭제 전에 해당 네임스페이스 안에 중요한 리소스가 있는지 꼭 확인해야 합니다. 삭제 후에는 복구할 수 없기 때문에 주의가 필요합니다.
네임스페이스를 삭제하기 전에 그 안에 어떤 리소스들이 있는지 확인하고 싶다면 다음 명령을 사용할 수 있습니다.
kubectl get all --namespace=community-namespace
이 명령을 통해 해당 네임스페이스에서 실행 중인 모든 리소스 목록을 확인할 수 있습니다.
이번 강의에서는 쿠버네티스 네임스페이스의 개념과 활용법, 그리고 실습을 통해 네임스페이스를 생성하고 관리하는 방법을 배웠습니다. 네임스페이스는 클러스터 내에서 리소스를 구분하고 독립적인 환경을 만들어 줌으로써, 여러 팀이 하나의 클러스터를 안정적으로 사용할 수 있도록 도와줍니다.
이제 여러분의 쿠버네티스 클러스터에서 네임스페이스를 활용해 효율적인 리소스 관리를 시작해보세요!
이렇게 대본을 완