안녕하세요,
오늘은 베스핀글로벌 DevOps실 구연수 님이 작성해 주신 ‘이 Pod 이 그 Pod? Namespace, Label, Selector’에 대해 알아보겠습니다. 🙂
Namespace
Kubernetes에서 생성해 온 Object들 – Pod, Deployment, Service들은 클러스터 내 Namespace 안에 구성된다.
Kube-System
- Kubernetes에 의해 자동 생성
- Kubernetes는 서비스의 네트워크 문제, DNS 서비스 등 자체 목적을 위해 Kube-System 네임 스페이스를 따로 만들어 Pod, Service 집합을 구성
Kube-public
- Kubernetes에 의해 자동 생성
- 모든 유저에 의해 만들어진 리소스들이 위치하는 곳
Namespace
- 소규모 프로젝트라면 default namespace로 충분하지만, 엔터프라이즈나 프로덕션 레벨에서 클러스터를 구성한다면 namespace를 고려해야 한다.
- 개별 Namespace를 구성하면?
- 각자의 정책을 가질 수 있다.
- 각자의 리소스 할당량을 제한할 수 있다.
- Namespace 별 접근 방법
- 같은 namespace 안에 있는 리소스들은 서로를 이름만으로 접근할 수 있다.
mysql.connect("db-service")
my-dev
라는 이름의 namespace 안에 있는 리소스를 부른다면 추가 정보를 더 입력한다.mysql.connect("db-service.my-dev.svc.cluster.local")
- 주소 상세 설명
cluster.local
: Kubernetes 클러스터의 default domainsvc
: sub domainmy-dev
: 지정 namespacedb-service
: 서비스 name
- 주소 상세 설명
Namespace를 지정한 Pod 생성
- 명령어로 생성
kubectl run nginx --image nginx --namespace=네임스페이스이름
- pod와 같이 yaml에 지정 Pod를 생성할 때 특정 namespace를 지정
# Pod with yaml
apiVersion:
kind:
metadata:
namespace: 네임스페이스이름 # 이곳에 지정
spec:
- namespace 단독 생성
- 명령어
kubectl create namespace 네임스페이스 이름
- yaml
apiVersion: v1
kind: Namespace
metadata:
namespace: 네임스페이스이름
spec:
default namespace를 바꾸고 싶다면?
kubectl config set-context $(kubectl config current-context) —namespace=디폴트로지정하고싶은namespace
namespace 상관없이 전체 pod 확인
kubectl get pods —all-namespaces
namespace에 자원할당 방법 – ResourceQuota
apiVersion: v1
kind: ResourceQuota
metadata:
name : desired-quota
namespace: 지정을원하는namespace
spec:
hard:
pods: "10"
requests.cpu: "4"
requests.memory: 5Gi
limits.cpu: "10"
limits.memory: 10Gi
Label & Selector
분류가 어떤 것이든 그 분류대로 객체를 그룹화할 수 있어야 하며, 목적에 따라 필터링할 수 있어야 한다.
Kubernetes에는 수 백 수 천 개까지 객체가 존재할 수 있다 (Pod, Service, Replica Set, Deployment etc…) 이 객체들을 필터링하고 카테고리 별로 객체를 조회할 필요가 있다.
Label
- 각 아이템마다 붙여진 속성
- 한 객체당 원하는 만큼의 label을 붙일 수 있다.
- Pod 설정 yaml 파일
apiVersion: v1
kind: Pod
metadata:
name: simple-webapp
labels:
키1: 밸류1
키2: 밸류2 # label은 원하는 만큼 작성 가능
spec:
containers:
- name: 컨테이너이름지정
image: 이미지
ports:
- containerPort: 8080
Selector
- label로 붙여진 속성들을 필터링
- 특정 label이 있는 pod 조회
kubectl get pods --selector 키=밸류
Kubernetes는 추가로 다른 객체끼리 연결할 때 label과 selector를 활용하기도 한다.
- ReplicaSet에서 Label과 Selector를 활용하는 사례
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name:
labels:
app: replicaSet_자체의_라벨
type:
spec:
template:
metadata:
name: Pod이름
labels:
app: Pod자체의label
type:
spec:
containers:
- name:
image:
replicas: 원하는개수
seletor:
matchLabels:
라벨키: 대상이_되는_pod라벨(replicaSet이_구분)
- replicaSet 객체 자체의 label
- 생성될 pod의 label
- 복제 대상인 pod를 확인하는 label 총 3가지가 활용되었으므로 혼동하지 않게 조심해야 한다.
Annotations
- 정보 전달 목적의 다른 세부 정보를 담는 속성
- (ex) 빌드 정보, 버전, 이름, 연락처, 이메일 등등
감사합니다.
Written by 구 연수 / Yeonsoo koo
Software Engineer