티스토리 뷰

도커나 도커 스웜 모드를 사용할 때에는 컨테이너를 논리적으로 구분하는 방법이 없었다. 그래서 용도에 따라 컨테이너와 그에 관련된 리소스들을 구분 지어 관리할 수 있는 일종의 논리적인 그룹이 있으면 좀 더 편할 것이다. 쿠버네티스에서는 리소스를 논리적으로 구분하기 위해 네임스페이스(Namespace)라는 오브젝트를 제공한다. 간단히 생각해 네임스페이스는 파드, 레플리카셋, 디플로이먼트, 서비스 등과 같은 쿠버네티스 리소스들이 묶여 있는 하나의 가상 공간 또는 그룹이라고 생각하면 된다.

예를들어 모니터링을 위한 모든 리소스들을 monitoring이라는 이름의 네임스페이스에서 생성할 수 있고, 테스트를 위한 리소스들은 testbed라는 네임스페이스에서 생성할 수 있다. 또는 여러 개발 조직이 하나의 쿠버네티스 클러스터를 공유해 사용해야 한다면 조직별로 네임스페이스를 사용하도록 구성할 수도 있다. 이처럼 여러 개의 네임스페이스를 사용하면 마치 하나의 클러스터에서 여러 개의 가상 클러스터를 사용하는 것처럼 느껴질 것이다.

네임스페이스 기본 개념 이해

네임스페이스를 빠르게 이해하기 위해 직접 네임스페이스를 사용해 보기로 하자. 네임스페이스는 namespace 또는 ns라는 이름으로 k8s에서 사용할 수 있으며, 목록은 kubectl get namespaces 명령어로 확인할 수 있다.

네임스페이스를 생성한 적이 없는데, 기본적으로 생성된 네임스페이스가 존재하는 것을 볼 수 있다. 

각각의 네임스페이스는 논리적인 리소스 공간이기 때문에 각 네임스페이스에는 파드, 레플리카셋, 서비스와 같은 리소스가 따로 존재한다. 예를 들어 default라는 이름의 네임스페이스에 생성된 파드를 확인하려면 아래의 명령어와 같이 --namespace 옵션을 사용하면 된다.

kubectl get pods --namespace default

default는 쿠버네티스를 설치하면 자동으로 사용하도록 설정되는 네임스페이스로, kubectl 명령어로 쿠버네티스 리소스를 사용할 때는 기본적으로 default 네임스페이스를 사용한다. 즉, --namespace 옵션을 명시하지 않으면 기본적으로 default 네임스페이스를 사용하며 이전까지 디플로이먼트나 서비스를 생성하고 삭제했던 작업은 모두 default 네임스페이스에서 수행된 것이다.

이번에는 kube-system이라는 네임스페이스의 파드를 확인해보자. 

kubectl get pods --namespace kube-system

kube-system 네임스페이스는 쿠버네티스 클러스터 구성에 필수적인 컴포넌트들과 설정값 등이 존재하는 네임스페이스이기 때문에 생성한 적 없는 파드가 여러 개 실행되고 있다. 

현재 파드로 예시를 들어 살펴보고 있는데, 당연하게도 레플리카셋, 서비스를 비롯한 다른 리소스들도 각 네임스페이스에 별도로 존재한다. 예를 들어 kube-system 네임스페이스에는 쿠버네티스의 파드, 서비스 등을 이름으로 찾을 수 있도록 하는 DNS 서버의 서비스가 미리 생성되어 있다.

kubectl get service -n kube-system

이처럼 네임스페이스는 쿠버네티스의 리소스를 논리적으로 묶을 수 있는 가상 클러스터처럼 사용할 수 있다. 

만약 쿠버네티스 클러스터를 여러 명이 동시에 사용해야 한다면 사용자마다 네임스페이스를 별도로 생성해 사용하도록 설정할 수도 있다. 또는 용도에 따라 네임스페이스를 여러 개 만듦으로써 특정 목적의 디플로이먼트, 서비스들은 특정 네임스페이스에서만 존재하도록 만들 수도 있다. 

네임스페이스와 라벨과의 차이점

그러면 라벨과 네임스페이스의 차이점은 무엇일까? 서비스와 파드를 매칭시키기 위해 사용했던 라벨 또한 리소스를 분류하고 구분하기 위한 방법중 하나이기 때문에 네임스페이스와 차이가 없어 보인다.

네임스페이스는 라벨보다 더욱 넓은 용도로 사용할 수 있다. 예를 들어 ResourceQuota라는 오브젝트를 이용해 특정 네임스페이스에서 생성되는 파드의 자원 사용량을 제한하거나, 애드미션 컨트롤러라는 기능을 이용해 특정 네임스페이스에 생성되는 파드에는 항상 사이드카 컨테이너를 붙이도록 설정할 수 있다. 지금 당장 이 모든 내용을 살펴볼 수는 없으니, '라벨보다 더 많은 용도로 사용할 수 있다'정도만 이해하고 넘어가기로 하자.

네임스페이스 사용하기

네임스페이스도 지금까지 사용했던 것처럼 YAML 파일에 정의해 생성할 수 있다.

apiVersion: v1
kind: Namespace
metadata:
  name: production

네임스페이스의 목록을 확인해 보면 production이라는 이름의 네임스페이스가 새롭게 생성된 것을 볼 수 있다.

그러면, 이제 생성한 네임스페이스에 리소스를 할당시켜 보자.

특정 네임스페이스에 리소스를 생성하는 방법은 매우 간단하다. 예를 들어, production 네임스페이스에 디플로이먼트와 서비스를 생성하려면 YAML 파일에서 metadata.namespace 항목을 아래와 같이 설정하면 된다.

apiVersion: apps/v1
kind: Deployment
metadata: 
  name: my-nginx-deployment
  namespace: production
spec:
  replicas: 3
  selector: 
    matchLabels:
      app: my-nginx
  template:
    metadata:
      name: my-nginx-pod
      labels:
        app: my-nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.10
        ports:
        - containerPort: 80

위의 YAML 파일을 생성하면 production이라는 이름의 네임스페이스에 디플로이먼트(레플리카셋, 파드)가 생성된다.

네임스페이스의 서비스에 접근하기

k8s 클러스터 내부에서는 서비스 이름을 통해 파드에 접근할 수 있다. 이는 정확히 말하자면 '같은 네임스페이스 내의 서비스'에 접근할 때에는 서비스 이름만으로 접근할 수 있다는 뜻이다. 

그렇지만, 다른 네임스페이스에 존재하는 서비스에는 서비스 이름만으로 접근할 수 없다. 대신 <서비스 이름>. <네임스페이스 이름>. svc처럼 서비스 이름 뒤에 네임스페이스 이름을 붙이면 다른 네임스페이스의 서비스에도 접근할 수 있다.

네임스페이스에 종속되는 쿠버네티스 오브젝트와 독립적인 오브젝트

네임스페이스를 사용하면 쿠버네티스 리소스를 사용 목적에 따라 논리적으로 격리할 수 있지만, 모든 리소스가 네임스페이스에 의해 구분되는 것은 아니다. 앞에서 살펴본 것과 같이 서비스, 레플리카셋, 디플로이먼트는 네임스페이스 단위로 구분할 수 있다. 예를 들어 A라는 네임스페이스에서 파드를 만들면 A 네임스페이스에서만 보이고, B 네임스페이스에서는 보이지 않을 것이다. 이런 경우를 쿠버네티스에서는 '오브젝트가 네임스페이스에 속한다'라고 표현한다. 네임스페이스에 속하는 오브젝트의 종류는 아래의 명령어로 확인할 수 있다.

kubectl api-resources --namespaced=true

이와 반대로 네임스페이스에 속하지 않는 쿠버네티스 오브젝트도 존재한다. 

클러스터 노드 또한 쿠버네티스의 오브젝트 중 하나이지만, 네임스페이스에 속하지 않는 대표적인 오브젝트 중 하나이기도 하다. 따라서 kubectl get nodes 명령어에 --namespace 옵션을 추가해도 의미가 없다. nodes는 쿠버네티스 클러스터에서 사용되는 저수준의 오브젝트이며, 네임스페이스에 의해 구분되지 않기 때문이다.

노드처럼 네임스페이스에 속하지 않는 오브젝트들은 보통 네임스페이스에서 관리되지 않아야 하는, 클러스터 전반에 걸쳐 사용되는 경우가 많다. 네임스페이스에 속하지 않는 오브젝트의 종류는 아래의 명령어로 확인할 수 있다.

kubectl api-resources --namespace=false

어떤 오브젝트가 네임스페이스에 속하고 그렇지 않은지 외울 필요는 전혀 없다. 앞으로 다룰 오브젝트는 대부분 네임스페이스에 속해 구분될 것이기 때문이다. 지금은 클러스터의 관리를 위한 저수준의 오브젝트들은 네임스페이스에 속하지 않을 수도 있다는 것만 알고 넘어가자.

Ref : 시작하세요! 도커/쿠버네티스

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함