このセクションでは、Kubernetes クラスタ上の各リソースにラベル( labels )というメタデータを付与する方法について紹介します。

ラベルは各リソースを分別するための情報のようなものであり、ラベルをもとにして各リソースをグループ制御することができます。

サンプルのマニフェストファイルを新規作成し、以下コードを記述します。

[root@kube-master sample-label]# vi sample-pod.yaml 

sample-pod1 に ラベル label1 と label2 を付与し、sample-pod2 に ラベル label1 を付与するように metadata に labels を記述しています。

---
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod1
  labels:
    label1: group1
    label2: group2
spec:
  containers:
    - name: nginx-container
      image: nginx:1.13
---
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod2
  labels:
    label2: group2
spec:
  containers:
    - name: nginx-container
      image: nginx:1.13

Master サーバーから 作成したマニフェストを実行し、Kubernetes クラスタ上にリソースを作成します。

[root@kube-master sample-label]# kubectl apply -f sample-pod.yaml 
pod/sample-pod1 created
pod/sample-pod2 created
[root@kube-master sample-label]#

Master サーバーから Kubernetes クラスタ上のリソースを確認します。 sample-pod1 と sample-pod2 の Pod リソースが稼働していることが確認できます。

[root@kube-master sample-label]# kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
sample-pod1   1/1     Running   0          8s
sample-pod2   1/1     Running   0          8s
[root@kube-master sample-label]# 

Master サーバーから sample-pod1 の リソース詳細情報を確認します。Labels  の部分にマニフェストで記述した ラベルの情報が表示されていることが確認できます。

[root@kube-master sample-label]# kubectl describe pods sample-pod1
Name:               sample-pod1
Namespace:          default
Priority:           0
PriorityClassName:  <none>
Node:               kube-work2/192.168.25.102
Start Time:         Sun, 06 Jan 2019 20:35:49 +0900
Labels:             label1=group1
                    label2=group2
Annotations:        kubectl.kubernetes.io/last-applied-configuration:
                      {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"labels":{"label1":"group1","label2":"group2"},"name":"sample-pod1","namespac...
Status:             Running
IP:                 10.244.2.25
Containers:
  nginx-container:
    Container ID:   docker://e0f03fe75cff9270c4a284008242e57523b933e8c186c986edd64144c86c300a
    Image:          nginx:1.13
    Image ID:       docker-pullable://nginx@sha256:b1d09e9718890e6ebbbd2bc319ef1611559e30ce1b6f56b2e3b479d9da51dc35
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Sun, 06 Jan 2019 20:35:50 +0900
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-75dfq (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-75dfq:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-75dfq
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age   From                 Message
  ----    ------     ----  ----                 -------
  Normal  Scheduled  40s   default-scheduler    Successfully assigned default/sample-pod1 to kube-work2
  Normal  Pulled     40s   kubelet, kube-work2  Container image "nginx:1.13" already present on machine
  Normal  Created    40s   kubelet, kube-work2  Created container
  Normal  Started    39s   kubelet, kube-work2  Started container
[root@kube-master sample-label]#

Master サーバーから sample-pod2 の リソース詳細情報を確認します。Labels の部分にマニフェストで記述した ラベルの情報が表示されていることが確認できます。

[root@kube-master sample-label]# kubectl describe pods sample-pod2
Name:               sample-pod2
Namespace:          default
Priority:           0
PriorityClassName:  <none>
Node:               kube-work1/192.168.25.101
Start Time:         Sun, 06 Jan 2019 20:35:49 +0900
Labels:             label2=group2
Annotations:        kubectl.kubernetes.io/last-applied-configuration:
                      {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"labels":{"label2":"group2"},"name":"sample-pod2","namespace":"default"},"spe...
Status:             Running
IP:                 10.244.1.105
Containers:
  nginx-container:
    Container ID:   docker://7282a05e2fc9fd7a6eea3a9835bcaed6a8dc8b8287236e933e7c72284e7d79ac
    Image:          nginx:1.13
    Image ID:       docker-pullable://nginx@sha256:b1d09e9718890e6ebbbd2bc319ef1611559e30ce1b6f56b2e3b479d9da51dc35
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Sun, 06 Jan 2019 20:35:50 +0900
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-75dfq (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-75dfq:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-75dfq
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age   From                 Message
  ----    ------     ----  ----                 -------
  Normal  Scheduled  61s   default-scheduler    Successfully assigned default/sample-pod2 to kube-work1
  Normal  Pulled     61s   kubelet, kube-work1  Container image "nginx:1.13" already present on machine
  Normal  Created    61s   kubelet, kube-work1  Created container
  Normal  Started    60s   kubelet, kube-work1  Started container
[root@kube-master sample-label]# 

Master サーバーから Kubernetes クラスタ上の label1 ラベルが付与されているリソースを確認します。sample-pod1 だけが表示されます。

[root@kube-master sample-label]# kubectl get pods -l label1
NAME          READY   STATUS    RESTARTS   AGE
sample-pod1   1/1     Running   0          3m16s
[root@kube-master sample-label]# 

Master サーバーから Kubernetes クラスタ上の label1 と label2 ラベルが付与されているリソースを確認します。sample-pod1 だけが表示されます。

[root@kube-master sample-label]# kubectl get pods -l label1,label2
NAME          READY   STATUS    RESTARTS   AGE
sample-pod1   1/1     Running   0          3m25s
[root@kube-master sample-label]# 

Master サーバーから Kubernetes クラスタ上の label2 ラベルが付与されているリソースを確認します。sample-pod1 と sample-pod2 が表示されます。

[root@kube-master sample-label]# kubectl get pods -l label2
NAME          READY   STATUS    RESTARTS   AGE
sample-pod1   1/1     Running   0          3m32s
sample-pod2   1/1     Running   0          3m32s
[root@kube-master sample-label]# 

Master サーバーから Kubernetes クラスタ上の Pod リソースをラベルを使って削除します。

[root@kube-master sample-label]# kubectl delete pods -l label1,label2
pod "sample-pod1" deleted
[root@kube-master sample-label]# 

[root@kube-master sample-label]# kubectl delete pods -l label2
pod "sample-pod2" deleted
[root@kube-master sample-label]# 

Master サーバーから Kubernetes クラスタ上の Pod リソースが削除されていることを確認します。

[root@kube-master sample-label]# kubectl get pods
No resources found.
[root@kube-master sample-label]#