728x90
TL; DR
- selector는 라벨(label)을 기준으로 리소스를 그룹화 한다.
- selector.matchLabels는 Job, Deployment, Replica Set, Daemon Set만 지원한다.
- selector.matchExpression도 Job, Deployment, Replica Set, Daemon Set만 지원한다.
- Service 리소스의 selector는 matchLabels와 matchExpression을 사용하지 않는다.
- Service 리소스는 matchLabels와 matchExpression을 사용하지 않을뿐 매핑은 label의 값을 통해서 지원한다.
1. Deployment
우선 코드를 분석하기 전에 앞서 전체 코드를 먼저 확인하고 부분적으로 분석해보겠습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: practice-nginx-deployment
namespace: test
labels:
app.kubernetes.io/name: practice-nginx-deployment
app.kubernetes.io/environment: test
app.kubernetes.io/component: backend
app.kubernetes.io/part-of: practice-service
spec:
replicas: 3
selector:
matchLabels:
app.kubernetes.io/name: practice-nginx-label
template:
metadata:
name: practice-nginx-pod
labels:
app.kubernetes.io/name: practice-nginx-label
spec:
containers:
- name: practice-nginx-container
image: nginx
ports:
- containerPort: 80
protocol: TCP
위의 코드는 nginx 백엔드 서비스를 제공하는 간단한 Deployment입니다.
우선 맨 위에 name을 확인하겠습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: practice-nginx-deployment
namespace: test
- metadata의 name은 label과 다르게 유일(Unique)한 값입니다. (동일한 namespace에서 동일한 리소스를 사용한다는 가정 하에 유일합니다.)
- 따라서 아래와 같이 namespace와 name을 통해서 리소스를 식별할 수 있습니다.
# namespace를 명시하지 않으면 default 네임스페이스를 사용한다.
$ kubectl delete deploy practice-nginx-deployment Errr from server (NotFound): deployments.apps "practice-nginx-deployment" not found
$ kubectl delete deploy -n test practice-nginx-deployment
deployment.apps "practice-nginx-deployment" deleted
labels:
app.kubernetes.io/name: practice-nginx-deployment
app.kubernetes.io/environment: test
app.kubernetes.io/component: backend
app.kubernetes.io/part-of: practice-service
- labels는 name과 다르게 유일하지 않은 값입니다.
- labels를 통해 여러 가지 리소스를 그룹화할 수 있습니다.
- 예를 들어, test 환경을 가진 모든 리소스를 삭제하려면 리소스를 하나씩 삭제하거나 극단적으로는 모든 리소스를 삭제하는 방법이 있습니다. 이를 라벨링을 통해서 아래와 같이 간단하게 삭제가 가능합니다.
$ kubectl delete deployment -n test -l app.kubernetes.io/environment=test
deployment.apps "practice-nginx-deployment" deleted
spec:
replicas: 3
selector:
matchLabels:
app.kubernetes.io/name: practice-nginx-label
template:
metadata:
name: practice-nginx-pod
labels:
app.kubernetes.io/name: practice-nginx-label
이제 selector와 matchLabels를 볼 차례입니다.
matchLabels는 Job, Deployment, Replica Set, Daemon Set만 지원합니다. 위의 예제에선 selector.matchLabels를 통해서 파드의 labels와 매핑되며 이를 통해 레플리카셋의 개수를 조절합니다.
2. Service
selector:
app.kubernetes.io/name: practice-nginx-label
서비스의 selector는 위처럼 matchLabels를 사용하지 않지만 라벨을 통해 리소스와 매핑합니다.
서비스의 역할은 트래픽을 라우팅하는 것이고, 이 목적에 맞게 단순한 라벨 selector만으로 충분한 매칭이 가능합니다. matchLabels나 matchExpressions 같은 복잡한 매칭은 필요하지 않으므로 사용하지 않습니다.
결론
- 라벨(Label)은 리소스를 그룹화 하기 위해 사용됩니다.
- 서비스의 selector는 다른 selector와 마찬가지로 라벨을 통해 자원을 매핑(select)하지만 matchLabels나 matchExpression과 같은 표현식을 사용하지 않습니다.
출처
728x90
반응형