필드 셀렉터

필드 셀렉터 (Field Selectors)

*필드 셀렉터(field selectors)*는 하나 이상의 리소스 필드 값에 따라 Kubernetes 객체를 선택하게 해 주는 도구예요. 필드 셀렉터 쿼리의 몇 가지 예시를 볼게요.

  • metadata.name=my-service
  • metadata.namespace!=default
  • status.phase=Pending

다음 kubectl 명령은 status.phase 필드 값이 Running인 모든 Pod를 선택해요.

kubectl get pods --field-selector status.phase=Running

참고:

필드 셀렉터는 본질적으로 리소스 필터예요. 기본적으로는 아무 셀렉터/필터도 적용되지 않아서, 지정한 유형의 모든 리소스가 선택돼요. 그래서 kubectl get podskubectl get pods --field-selector ""는 같은 동작을 해요.

지원하는 필드

지원하는 필드 셀렉터는 Kubernetes 리소스 유형에 따라 달라져요. 모든 리소스 유형은 metadata.namemetadata.namespace 필드를 지원해요. 지원하지 않는 필드 셀렉터를 쓰면 오류가 발생해요. 예를 들면요:

kubectl get ingress --field-selector foo.bar=baz
Error from server (BadRequest): Unable to find "ingresses" that match label selector "", field selector "foo.bar=baz": "foo.bar" is not a known field selector: only "metadata.name", "metadata.namespace"

지원하는 필드 목록

Kind Fields
Pod spec.nodeName spec.restartPolicy spec.schedulerName spec.serviceAccountName spec.hostNetwork status.phase status.podIP status.podIPs status.nominatedNodeName
Event involvedObject.kind involvedObject.namespace involvedObject.name involvedObject.uid involvedObject.apiVersion involvedObject.resourceVersion involvedObject.fieldPath reason reportingComponent source type
Secret type
Service spec.clusterIP spec.type
Namespace status.phase
ReplicaSet status.replicas
ReplicationController status.replicas
Job status.successful
Node spec.unschedulable
CertificateSigningRequest spec.signerName

커스텀 리소스의 필드

모든 커스텀 리소스 유형은 metadata.namemetadata.namespace 필드를 지원해요.

추가로, CustomResourceDefinitionspec.versions[*].selectableFields 필드는 커스텀 리소스에서 필드 셀렉터로 사용할 수 있는 다른 필드들을 선언해요. CustomResourceDefinition에서 필드 셀렉터를 어떻게 쓰는지에 대한 자세한 내용은 커스텀 리소스의 셀렉터 가능 필드를 참고하세요.

지원하는 연산자

필드 셀렉터에는 =, ==, != 연산자를 쓸 수 있어요 (===는 같은 뜻이에요). 예를 들어 다음 명령은 default 네임스페이스에 없는 모든 Kubernetes Service를 선택해요.

kubectl get services --all-namespaces --field-selector metadata.namespace!=default

셀렉터 연결

레이블 셀렉터 등과 마찬가지로, 필드 셀렉터는 쉼표로 구분된 목록으로 연결할 수 있어요. 다음 명령은 status.phaseRunning이 아니면서 spec.restartPolicy 필드가 Always인 모든 Pod를 선택해요.

kubectl get pods --field-selector=status.phase!=Running,spec.restartPolicy=Always

여러 리소스 유형

필드 셀렉터는 여러 리소스 유형에 걸쳐 쓸 수 있어요. 다음 명령은 default 네임스페이스에 없는 모든 StatefulSet과 Service를 선택해요.

kubectl get statefulsets,services --all-namespaces --field-selector metadata.namespace!=default