【k8s】Kubernetes ~ Label / Selector ~

◾️はじめに

Label / Selector / Node Selector について、
メモしていく

目次

【1】Label
 1)目的
 2)サンプル
 3)推奨ラベル (Recommended Labels)
 4)補足:Annotations
【2】Selector
 0)LabelとSelectorの関係
 1)Label Selector
 2)Node Selector
 3)Field Selector
【3】関連するkubectlコマンド
 1)ラベル確認 --show-labelsオプション
 2)ラベル追加 kubectl label
 3)ラベルでフィルタ -l / --selectorオプション

【1】Label

https://kubernetes.io/ja/docs/concepts/overview/working-with-objects/labels/

* Podなどのk8sオブジェクトに割り当てられたキーとバリューのペア
 => AWS で言うと、タグ(Tags)みたいな感じ?

1)目的

* k8sクラスタ上のオブジェクトをグループ化/一覧表示/操作する時に利用可能

2)サンプル

apiVersion: v1
kind: Pod
metadata:
  name: label-demo
  # ★ここ
  labels:
    environment: production
    app: nginx
    tier: frontend
    partition: customerA
    track: daily
    release: canary
    # cf. canary release ... 新しい機能を追加/バージョンアップしたときのリリース手法の一つ

https://wa3.i-3-i.info/word19671.html

* k8s では、推奨ラベルというのが、
 以下の公式ドキュメントが紹介されているので一読しておくといいかも

https://kubernetes.io/ja/docs/concepts/overview/working-with-objects/common-labels/

apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app.kubernetes.io/name: mysql
    app.kubernetes.io/instance: mysql-abcxzy
    app.kubernetes.io/version: "5.7.21"
    app.kubernetes.io/component: database
    app.kubernetes.io/part-of: wordpress
    app.kubernetes.io/managed-by: helm

4)補足:Annotations

* 識別用途でない任意のメタデータをオブジェクトに割り当てるための機能

https://kubernetes.io/ja/docs/concepts/overview/working-with-objects/annotations/

apiVersion: v1
kind: Pod
metadata:
  name: annotations-demo
  # ★
  annotations:
    imageregistry: "https://hub.docker.com/"
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80

【2】Selector

* Selectorを介して、k8sオブジェクトを識別できる

0)LabelとSelectorの関係

* SelectorでLabelを指定する
 => マニフェストファイル上で紐づけるPodなどのk8sオブジェクトを指定可能

1)Label Selector

* k8s オブジェクトをフィルタリングすることができる機能
 => ラベルセレクター を介して、
  クライアントとユーザーはk8s オブジェクトのセットを指定可能

* 指定の仕方は、以下の2通り。

[1] 等価ベース(equality-based / =)

キーが等が等しい、または等しくない場合の書き方

[2] 集合ベース(set-based / in)

* 複数キーのどれかに合致する場合などに in を使う

サンプル

selector:
  matchLabels:
    app: demo-app
  matchExpressions:
    - {key: ver, operator: In, values: [1, 2]}

2)Node Selector

* Podを特定のNodeへスケジューリングする仕組み

サンプル

apiVersion: v1
kind: Pod
metadata:
  name: node-selector
spec:
  containers:
  - name: nginx
    image: nginx:alpine
  # ★
  nodeSelector:
    environment: dev
  terminationGracePeriodSeconds: 0

3)Field Selector

* 1つかそれ以上のリソースフィールドの値を元にk8sリソースを選択するためのもの

https://kubernetes.io/ja/docs/concepts/overview/working-with-objects/field-selectors/

【3】関連するkubectlコマンド

https://kubernetes.io/ja/docs/tasks/configure-pod-container/assign-pods-nodes/

1)ラベル確認 --show-labelsオプション

# すべてのPod(またはラベル付けをサポートする他のKubernetesオブジェクト)
# のラベルのリストを表示します
$ kubectl get nodes --show-labels
NAME      STATUS    ROLES    AGE     VERSION        LABELS
worker0   Ready     <none>   1d      v1.13.0        ...,disktype=ssd,kubernetes.io/hostname=worker0

2)ラベル追加 kubectl label

# <your-node-name>は選択したノードの名前
kubectl label nodes <your-node-name> disktype=ssd

3)ラベルでフィルタ -l / --selectorオプション

kubectl get pods -l environment=dev

kubectl get node -l 'pool in (apl, ingress)'

kubectl get node -l 'tier notin (frontend, backend)'

https://kubernetes.io/ja/docs/concepts/overview/working-with-objects/labels/#api

参考文献

https://gadgeterkun.hatenablog.com/entry/20190716/1563228000

関連記事

Kubernetes ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2020/04/27/224624
KubernetesWindows / 環境構築編 ~
https://dk521123.hatenablog.com/entry/2020/05/01/000000
Kubernetes ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/05/04/013529
Kubernetes ~ kube-proxy ~
https://dk521123.hatenablog.com/entry/2025/03/22/111422
Kubernetes ~ Health check / Probe ~
https://dk521123.hatenablog.com/entry/2025/03/27/182147