<p>In Kubernetes field selectors are limited to certain fields for each resource Kind. But almost every resource has field selector for name and namespace on metadata
If so why there's a need to have a separate label selector.</p>

<pre><code>labels:
{
  app: foo
}
</code></pre>

<p>Instead of querying <code>kubectl get pods -l app=foo</code>, why couldn't it be part of generic field selector like:<br/>
 <code>kubectl get pods --field-selector metadata.labels.app=foo</code> </p>

<p>Short answer: because etcd is not optimized for general purpose querying and so Kubernetes has to pick and choose what to index and what not to. This is why both labels and annotations exist despite seeming very similar, labels are indexed for searching on and annotations are not.</p>
