728x90
📌 Label & Selector
레이블 (Label)
- 레이블은 쿠버네티스 리소스에 부여되는 키-값 쌍으로, 리소스를 식별하고 분류하는 데 사용된다.
- 레이블은 사용자가 정의하며 리소스에 유연하게 메타데이터를 추가하는 데 유용하다.
- 예를 들어, "app: frontend"라는 레이블을 가진 파드는 애플리케이션의 프런트엔드 서비스임을 나타낼 수 있다.
- 레이블은 특정 리소스에 여러 개 할당할 수 있으며, 다양한 목적으로 사용할 수 있다.
셀렉터 (Selector)
- 셀렉터는 레이블을 사용하여 특정 리소스를 선택하는 데 사용된다.
- 리소스를 그룹화하고 쿼리를 만들 수 있으며 이는 특정 레이블과 일치하는 리소스를 선택하기 위한 것이다.
- 예를 들어 "app=frontend"라는 셀렉터를 사용하면 "app: frontend" 레이블을 가진 모든 파드를 선택할 수 있다.
- 이를 통해 파드를 그룹화하고 선택된 파드에 대해 일괄적인 작업을 수행하거나 다른 리소스와 연결할 수 있다.
📜 정리
- 레이블과 셀렉터의 조합은 쿠버네티스에서 리소스 간의 관계를 설정하고 관리하는 데 중요한 역할을 한다.
- 예를 들어 서비스 리소스는 셀렉터를 사용하여 특정 레이블을 가진 파드를 선택하고, 해당 파드로의 트래픽을 로드밸런싱한다.
- 이를 통해 애플리케이션의 파드를 동적으로 확장하거나 축소할 수 있다.
📌 예시
⌨️ ReplicaSet에서의 레이블과 셀렉터
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: my-replicaset
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: my-image
- my-replicaset이라는 이름의 레플리카셋을 생성하는 yml 파일이다.
- replicas: 3은 레플리카셋이 유지해야 할 파드의 개수를 3개로 지정함을 의미한다.
- selector.matchLabels를 통해 my-replicaset은 app: my-app 레이블을 가진 파드를 선택할 것임을 명시한다.
- template는 레플리카셋이 생성하는 파드의 템플릿을 정의한다.
- 여기에서는 metadata.labels를 통해 레플리카셋이 생성하는 파드에 app: my-app이라는 이름의 레이블을 부여한다.
⌨️ Deployment에서의 레이블과 셀렉터
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: my-image
- my-deployment이라는 이름의 디플로이먼트를 생성하는 yml 파일이다.
- replicas: 3은 디플로이먼트가 유지해야 할 파드의 개수를 3개로 지정함을 의미한다.
- selector.matchLabels를 통해 my-deployment는 app: my-app 레이블을 가진 파드를 선택할 것임을 명시한다.
- template은 디플로이먼트가 생성하는 파드의 템플릿을 정의한다.
- 여기에서는 metadata.labels를 통해 디플로이먼트가 생성하는 파드에 app: my-app이라는 이름의 레이블을 부여한다.
Service에서의 셀렉터
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
- my-service라는 이름의 서비스를 생성하는 yml 파일이다.
- selector를 통해 my-service는 app: my-app 레이블을 가진 파드를 선택할 것임을 명시한다.
- ports는 서비스가 노출할 포트를 정의한다.
- 여기에서는 80번 포트로 들어오는 요청을 8080번 포트로 전달한다.
가장 일반적인 경우인 디플로이먼트 & 서비스에서의 Label & Selector의 사용 예시를 살펴보자.
⌨️ 프론트엔드 Deployment & Service
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend-deployment
spec:
replicas: 3
selector:
matchLabels:
app: frontend
template:
metadata:
labels:
app: frontend
spec:
containers:
- name: frontend-container
image: frontend-image
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: frontend-service
spec:
selector:
app: frontend
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
- frontend-deployment라는 이름의 프론트엔드 디플로이먼트를 생성한다.
- replicas: 3은 프론트엔드 파드의 복제본 개수를 3개로 지정함을 의미한다.
- selector.matchLabels를 통해 frontend-deployment는 app: frontend라는 이름의 레이블을 가진 파드를 선택할 것임을 명시한다.
- template은 frontend-deployment가 생성하는 파드의 템플릿을 정의한다.
- 여기에서는 metadata.labels를 통해 frontend-deployment가 생성하는 파드에 app: frontend라는 이름의 레이블을 부여한다.
- frontend-container라는 이름의 컨테이너를 정의하고 frontend-image를 사용한다.
- 프론트엔드 파드의 80번 포트를 열어서 요청을 처리한다.
- frontend-service라는 이름의 서비스를 생성한다.
- selector를 통해 app: frontend 레이블을 가진 파드를 선택한다.
- 80번 포트로 들어오는 요청을 프론트엔드 파드의 80번 포트로 전달한다.
- type: LoadBalancer를 지정하여 로드 밸런서를 통해 외부로 서비스를 노출한다.
⌨️ 백엔드 Deployment & Service
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend-deployment
spec:
replicas: 2
selector:
matchLabels:
app: backend
template:
metadata:
labels:
app: backend
spec:
containers:
- name: backend-container
image: backend-image
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: backend-service
spec:
selector:
app: backend
ports:
- protocol: TCP
port: 8080
targetPort: 8080
- backend-deployment라는 이름의 백엔드 디플로이먼트를 생성한다.
- replicas: 2는 백엔드 파드의 복제본 개수를 2개로 지정함을 의미한다.
- selector.matchLabels를 통해 backend-deployment는 app: backend라는 이름의 레이블을 가진 파드를 선택할 것임을 명시한다.
- template은 backend-deployment가 생성하는 파드의 템플릿을 정의한다.
- 여기에서는 metadata.labels를 통해 backend-deployment가 생성하는 파드에 app: backend라는 이름의 레이블을 부여한다.
- backend-container라는 이름의 컨테이너를 정의하고, backend-image를 사용한다.
- 백엔드 파드의 8080번 포트를 열어서 요청을 처리한다.
- backend-service라는 이름의 서비스를 생성한다.
- selector를 통해 app: backend 레이블을 가진 파드를 선택한다.
- 8080번 포트로 들어오는 요청을 백엔드 파드의 8080번 포트로 전달한다.
🤔 matchLabels VS labels
matchLabels
- 이 필드는 ReplicaSet과 Pod를 선택하기 위해 사용된다.
- matchLabels에 지정된 라벨과 동일한 라벨을 가지고 있는 ReplicaSet과 Pod만이 Deployment에 의해 관리된다.
- 예를 들어 위의 YAML 파일에서 matchLabels는 [app: frontend] or [app: backend]로 지정되어 있다.
- 이는 Deployment가 app이라는 라벨의 값이 frontend or backend인 ReplicaSet과 Pod만을 선택하여 관리한다는 의미이다.
labels
- labels는 Pod 템플릿에서 사용된다.
- Pod에 라벨을 부여하는 역할을 한다.
- Deployment가 관리하는 Pod는 Pod 템플릿에 지정된 labels를 가지게 된다.
- 예를 들어 위의 YAML 파일에서 labels는 [app: frontend] or [app: backend]로 지정되어 있다.
- 이는 Deployment에 의해 생성되는 Pod가 "app" 라벨의 값으로 frontend or backend라는 이름을 가지게 된다는 의미이다.
📜 정리
- matchLabels는 Deployment의 selector를 지정하여 특정 ReplicaSet과 Pod를 선택하고 관리하는 데 사용되며, labels는 Deployment에 의해 생성되는 Pod에 라벨을 부여하는 데 사용된다.
- 이를 통해 Deployment는 특정한 라벨을 가진 ReplicaSet과 Pod만을 관리하고 제어할 수 있다.
참고
뤼튼
728x90
'[DevOps] > Kubernetes' 카테고리의 다른 글
| 쿠버네티스 Labels & Selector 간단 정리 (0) | 2023.11.10 |
|---|---|
| 쿠버네티스의 스케줄러 간단 정리 (0) | 2023.11.10 |
| ReplicationController와 ReplicaSet 간단 정리 (3) | 2023.10.25 |
| CKA 필승 노트 (0) | 2023.10.18 |
| kubernetes - Volumes (0) | 2023.07.30 |