✔️ namespace란 ?!
Namespace란 쿠버네티스 클러스터 내의 논리적인 분리 단위이자 오브젝트를 묶는 하나의 가상 공간 또는 그룹이다.
하나의 클러스터 내에 개발/운영/테스트 환경이 있다면 비슷한 이름의 수많은 오브젝트들이 생길 것이고 운영자와 사용자는 관리와 사용 측면에서 어려움을 겪게 된다.
쿠버네티스에서는 namespace를 통해 운영환경을 논리적으로 분리하여 운영할 수 있다.
Namespace로 할 수 있는 것
- 사용자별로 네임스페이스 접근 권한을 다르게 운영할 수 있다.
- namespace 별로 리소스의 할당량을 지정할 수 있다. (ResourceQuota 사용)
- namespace 별로 리소스(Pod, Service)를 나눠서 관리할 수 있다.
주의해야할 점
namespace는 클러스터를 논리적으로 분리하는 것이지, 물리적으로 분리하는 것이 아니다 라는 것이다.
다른 namespace 간의 pod라도 통신은 가능하며 클러스터의 장애가 발생할 경우 모든 namespace가 타격을 입게되므로 namespace를 통한 fault-tolerance 확보는 불가하다.
isolation을 원한다면 클러스터 자체를 분리하는 것을 권장하고 있다.
✔️ namespace 목적
사용자별 네임스페이스 접근 권한
쿠버네티스 클러스터의 API나 namespace에 접근하기 위해 유효한 사용자 인증(authentication)을 거치게 할 수 있다.
사용자 인증 후 해당 사용자가 api또는 namespace에 권한이 있는지를 체크하고 검증된 사용자만이 api를 사용할 수 있다.
ABAC(Attribute-based access control)
속성 기반의 권한 관리로, 사용자/그룹/요청 경로/네임스페이스 등으로 권한을 설정
RBAC(Role-based access control)
역할 기반 관리로 사용자와 역할을 별개로 선언하고 사용자와 역할을 binding하여 권한을 부여하는 방식
namespace 별 리소스 할당량 지정
namespace를 통해 CPU/GPU 등의 리소스 할당량을 조정할 수 있다.
일반적으로 서비스의 운영 환경보다 개발과 신규 기능 및 수정 사항을 테스트 하기 위한 환경은 덜 powerful 해도 된다.
전체 리소스가 CPU 500G, GPU 100G인 상황을 가정했을 때 운영 환경에는 CPU 400, GPU 80을 테스트 환경에는 CPU 100 GPU 20을 할당해 주어진 환경에서 최적의 개발 및 운영 환경을 구축할 수 있다.
✔️ 기본 생성 namespace
- default : 다른 namespace가 없는 오브젝트를 위한 기본 namespace
- kube-system : 쿠버네티스 시스템에서 생성한 오브젝트를 위한 namespace
- kube-public : 모든 사용자(인증되지 않은 사용자를 포함)가 읽기 권한으로 접근할 수 있으며 이 namespace는 주로 전체 클러스터 중에 공개적으로 확인되어 읽을 수 있는 리소스를 위해 예약되어 있다.
✔️ namespace 사용 방법
namespace 생성
.yaml 파일을 사용하여 생성
apiVersion: v1
kind: Namespace
metadata:
name: test
spec:
limits:
- default:
cpu: 1
defaultRequest:
cpu: 0.5
type: Container
spec 섹션의 limits에서 리소스의 기본값과 상한값 등을 지정할 수 있다.
# kubectl apply 명령어를 통해 네임스페이스 생성
kubectl apply -f test-namespace.yaml
# kubectl create 명령어를 통해 네임스페이스 생성(.yaml 없이도 생성 가능)
kubectl create namespace test
namespace 리스트 조회
kubectl get ns
kubectl get namespace
기본 네임스페이스는 default이다.
namespace 내 리소스 조회
kubectl get all
kubectl get all -o wide
kubectl get all -o wide -n default # -n은 네임스페이스의 약자
kubectl get all -o wide -n [namespace명]
namespace 서비스 접근
culr hostname-svc-cluster.production.svc:8080
다른 네임스페이스면 서비스의 이름만으로는 접근할 수 없다. 하지만 [서비스명].[네임스페이스명].svc 처럼 서비스 이름 뒤에 네임스페이스 이름을 붙이면 다른 네임스페이스에도 접근할 수 있다.
직접 분배해서 사용 가능한 리소스 조회
kubectl api-resources
kubectl api-resources --namespaced=true
모든 리소스를 kubectl에서 줄여 쓸 수 있는 것이 아니라 정해진 리소스만 줄여서 사용할 수 있다.
가능한 리소스 목록과 정보는 NAMESPACED 항목을 참조하면 된다.
namespace에 kubernetes 오브젝트 생성
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
namespcae: test // --- namespace 지정
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
metadata 섹션에 namespace를 지정할 수 있다.
kubectl get pod -namespace test
namespace 옵션을 통해 해당 namespace의 쿠버네티스 오브젝트를 조회할 수 있다.
활성 namespace 변경 및 확인
kubectl config set-context --current --namespace=[namespace명]
ex) workns 네임스페이스로 변경하려면
kubectl config set-context --current --namespace=workns
# 활성화된 namespace 확인
kubectl config view | grep namespace
쿠버네티스에서 현재 사용중인(활성화된) 기본 네임스페이스를 변경할 수 있다.
namespace 삭제
kubectl delete namespace [이름]
해당 namespace와 쿠버네티스 오브젝트들이 삭제되고, 할당되었던 리소스들이 자동으로 해제된다.
🔗참고
'DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] Object - Volume이란 (2) (0) | 2022.03.28 |
---|---|
[Kubernetes] Object - Volume이란 (1) (0) | 2022.03.28 |
[Kubernetes] Service Discovery (0) | 2022.03.17 |
[Kubernetes] Object - Service (0) | 2022.03.17 |
[Kubernetes] Object 개념 (0) | 2022.03.17 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!