labelは後から付与することもできる。
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