zaki work log

作業ログやら生活ログやらなんやら

(k8s / openshift) リソースにlabelを後から設定する

labelは後から付与することもできる。

zaki-hmkc.hatenablog.com

podに直接

基本はこんな感じ

[zaki@minikube ~]$ kubectl get pod --show-labels
NAME                       READY   STATUS    RESTARTS   AGE   LABELS
rsync-pod                  1/1     Running   3          28d   <none>
sockserv-db66b7df7-rtcv9   1/1     Running   1          17d   app=sockserv,pod-template-hash=db66b7df7

kubectl labelで追加する

[zaki@minikube ~]$ kubectl label pod rsync-pod app=rsync
pod/rsync-pod labeled
[zaki@minikube ~]$ kubectl get pod --show-labels
NAME                       READY   STATUS    RESTARTS   AGE   LABELS
rsync-pod                  1/1     Running   3          28d   app=rsync
sockserv-db66b7df7-rtcv9   1/1     Running   1          17d   app=sockserv,pod-template-hash=db66b7df7

追加する

[zaki@minikube ~]$ kubectl label pod rsync-pod state=normal
pod/rsync-pod labeled
[zaki@minikube ~]$ kubectl get pod -l app=rsync --show-labels
NAME        READY   STATUS    RESTARTS   AGE   LABELS
rsync-pod   1/1     Running   3          28d   app=rsync,state=normal

更新する

同じラベルは既にあるのでエラーになる

[zaki@minikube ~]$ kubectl label pod rsync-pod state=error
error: 'state' already has a value (normal), and --overwrite is false

メッセージの通り--overwriteすれば上書きされる

[zaki@minikube ~]$ kubectl label pod rsync-pod state=error --overwrite
pod/rsync-pod labeled
[zaki@minikube ~]$ kubectl get pod -l app=rsync --show-labels
NAME        READY   STATUS    RESTARTS   AGE   LABELS
rsync-pod   1/1     Running   3          28d   app=rsync,state=error

削除する

末尾にハイフンを付ければ削除できる。

[zaki@minikube ~]$ kubectl label pod rsync-pod state-
pod/rsync-pod labeled
[zaki@minikube ~]$ kubectl label pod rsync-pod state-
pod/rsync-pod labeled
[zaki@minikube ~]$ kubectl get pod -l app=rsync --show-labels
NAME        READY   STATUS    RESTARTS   AGE   LABELS
rsync-pod   1/1     Running   3          28d   app=rsync

deploymentなど

podに直接設定した場合、deleteすると

[zaki@minikube ~]$ kubectl label pod sockserv-db66b7df7-48ggp foo=bar
pod/sockserv-db66b7df7-48ggp labeled
[zaki@minikube ~]$ kubectl get pod sockserv-db66b7df7-48ggp --show-labels
NAME                       READY   STATUS    RESTARTS   AGE   LABELS
sockserv-db66b7df7-48ggp   1/1     Running   0          67s   app=sockserv,foo=bar,pod-template-hash=db66b7df7
[zaki@minikube ~]$ kubectl delete pod sockserv-db66b7df7-48ggp
pod "sockserv-db66b7df7-48ggp" deleted
[zaki@minikube ~]$ kubectl get pod -l app=sockserv --show-labels
NAME                       READY   STATUS    RESTARTS   AGE   LABELS
sockserv-db66b7df7-fqq8l   1/1     Running   0          53s   app=sockserv,pod-template-hash=db66b7df7

消えます

じゃあdeploymentに設定すると

[zaki@minikube ~]$ kubectl get deploy --show-labels
NAME       READY   UP-TO-DATE   AVAILABLE   AGE   LABELS
sockserv   1/1     1            1           42d   <none>
[zaki@minikube ~]$ kubectl label deploy sockserv food=curry
deployment.apps/sockserv labeled
[zaki@minikube ~]$ kubectl get deploy --show-labels
NAME       READY   UP-TO-DATE   AVAILABLE   AGE   LABELS
sockserv   1/1     1            1           42d   food=curry
[zaki@minikube ~]$ kubectl get pod -l app=sockserv --show-labels
NAME                       READY   STATUS    RESTARTS   AGE     LABELS
sockserv-db66b7df7-fqq8l   1/1     Running   0          2m24s   app=sockserv,pod-template-hash=db66b7df7

deployにlabel付与してもpodはそのまま

[zaki@minikube ~]$ kubectl delete pod -l app=sockserv
pod "sockserv-db66b7df7-fqq8l" deleted

削除してリフレッシュさせると

[zaki@minikube ~]$ kubectl get pod -l app=sockserv --show-labels
NAME                        READY   STATUS    RESTARTS   AGE   LABELS
sockserv-757795c7bc-ch2zk   1/1     Running   0          60s   app=sockserv,pod-template-hash=757795c7bc

特に変化なし。 あくまで対象リソース自体に付与されるだけで、そのリソースが生み出すリソース(deployからrsとか、rsからpodとか)は波及しない、ということ。

ではpodに自動設定するにはどうするかというと、deploymentの定義の

spec:
  template:
    metadata:
      labels:
        app: sockserv

ここ。

これを

spec:
  template:
    metadata:
      labels:
        app: sockserv
        food: curry

こんな感じにkubectl editなどで変更すれば

[zaki@minikube ~]$ kubectl get pod -l app=sockserv --show-labels
NAME                       READY   STATUS    RESTARTS   AGE   LABELS
sockserv-db66b7df7-5gt7x   1/1     Running   0          2m    app=sockserv,food=curry,pod-template-hash=db66b7df7

food=curryが付与された。

Workloads以外のリソース

もちろんpodだけでなく、serviceやconfigmapにも設定できる

[zaki@minikube ~]$ kubectl create cm config
configmap/config created
[zaki@minikube ~]$ kubectl get cm --show-labels
NAME     DATA   AGE   LABELS
config   0      3s    <none>
[zaki@minikube ~]$ kubectl label cm config menu=curry
configmap/config labeled
[zaki@minikube ~]$ kubectl get cm --show-labels
NAME     DATA   AGE   LABELS
config   0      19s   menu=curry