[Kubernetes] Namespace


서론

쿠버네티스 클러스터를 설치할 때 네트워크, DNS 등 내부 시스템을 위해 자체적으로 파드와 서비스들을 실행하는데 이런 시스템들이 사용자로 부터 삭제 또는 수정되는 것을 방지하기 위해 kube-system이라는 별도의 namespace안에서 생성되어 진다.

그리고 모든 사용자에게 공개되어야 하는 리소스들은 kube-public이라는 namespace에 생성된다.

마지막으로 자동으로 만들어지는 Namespace는 default namespace로 사용자가 기본적으로 작업하는 공간이 된다.

하지만 클러스터 규모가 커지면 기업용이나 서비스 용도로 사용하게 되면, 네임스페이스의 사용을 고려해야 한다.

예를 들어 동일한 클러스터를 개발(dev)과 운영(prod)에 함께 사용하되, 자원은 분리하고 싶다면,

각 환경마다 별도의 네임스페이스를 생성할 수 있다.

각 네임스페이스는 고유한 정책(RBAC 등)을 적용할 수 있, 누가 무엇을 할 수 있는지를 정의할 수도 있다.

또한, 각 네임스페이스에 자원 할당량(quota)을 지정할 수도 있다.

Namespace

  • Kubernetes에서 네임스페이스는 여러 프로젝트, 팀, 환경(dev/prod 등) 을 논리적으로 분리하는 단위
  • 자동으로 생성되는 네임스페이스:
    • default: 사용자 기본 작업공간
    • kube-system: 쿠버네티스 내부 시스템 리소스용
    • kube-public: 모든 사용자에게 공개되는 리소스용

같은 namespace 내 리소스는 이름만으로 서로를 참조할 수 있지만 다른 네임스페이스에 접근하기 위해서는 서비스 뒤에 네임스페이스 이름을 덧붙여야 한다.

예를 들어 기본 네임스페이스의 web 파드가 dev namespace의 데이터베이스(dbsrvice)에 접속하려는 경우

  • servicename.namespace.svc.cluster.local
  • dbservice.dev.svc.cluster.local

Namespace DNS

servicename.namespace.svc.cluster.local

  • cluster.local은 Kubernetes 클러스터의 기본 도메인이다.
  • servicename.namespace.svc은 서비스 도메인, 그 다음은 네임스페이스, 그리고 서비스 이름순이다.

Namespace 생성

  • 명령어로 실행하는 방법:
    $ kubectl create namespace dev
  • 파드에 네임스페이스를 직접주는 법
apiVersion: v1
kind: Pod
metadata:
  name: my-app-pod
  namespace: dev        # ← 여기에 원하는 네임스페이스
spec:
  containers:
    - name: app
      image: nginx:1.25

Namespace에서의 자원 사용

ResourceQuota 파일을 만들어서 적용할 네임스페이스를 지정한다.

그리고 spec 아래에 파드 수, CPU 수, 메모리 용량 등 자원 제한을 설정한다.