Home > OS >  How to get kubernetes deployments labels when new pod is created/updated in client-go?
How to get kubernetes deployments labels when new pod is created/updated in client-go?

Time:04-24

Imagin the following deployment definition in kubernetes:

apiVersion: apps/v1
kind: Deployment
metadata:
 name: nginx-deployment
 labels:
  env: staging
spec:
...

I have two question in particular:

1). the label env: staging won't be available in created pods. how can I access this data programmatically in client-go?

2). when pod is created/updated, how can I found which deployment it belongs to?

CodePudding user response:

1). the label env: staging won't be available in created pods. how can I access this data programmatically in client-go?

You can get the Deployment using client-go. See the example Create, Update & Delete Deployment for operations on a Deployment.

2). when pod is created/updated, how can I found which deployment it belongs to?

When a Deployment is created, a ReplicaSet is created that manage the Pods.

See the ownerReferences field of a Pod to see what ReplicaSet manages it. This is described in How a ReplicaSet works

CodePudding user response:

hope you are enjoying your kubernetes journey !

In fact the label won't be available in created pods but you can add it to the manifest, in the pod section:

apiVersion: apps/v1
kind: Deployment
metadata:
  name:  nginx-deploy
  labels:
  #Here you have the deployment labels
    app: nginx                      
spec:
  selector:
    matchLabels:
    #Here you have the selector that indicates to the deployment 
    #(more exactly to the replicatsets of the deployment) 
    #which pod to track to check if the number of replicas is respected.
      app: nginx                    
...
  template:
    metadata:
      labels:
      #Here you have the POD labels that needs to match in the selector.matchlabels section
        app: nginx                  
    spec:
      containers:
      - name:  nginx-container
        image:  nginx:latest
...

you can check the pods' labels by typing:

❯ k get po --show-labels
NAME                            READY   STATUS    RESTARTS   AGE     LABELS
nginx-deploy-6bdc4445fd-5qlhg   1/1     Running   0          7m13s   app=nginx,pod-template-hash=6bdc4445fd
nginx-deploy-6bdc4445fd-pgkhb   1/1     Running   0          7m13s   app=nginx,pod-template-hash=6bdc4445fd
nginx-deploy-6bdc4445fd-xdz59   1/1     Running   0          7m13s   app=nginx,pod-template-hash=6bdc4445fd

you can get the deployments' labels by typing:

❯ k get deploy --show-labels
NAME           READY   UP-TO-DATE   AVAILABLE   AGE     LABELS
nginx-deploy   3/3     3            3           7m39s   app=nginx

you can add a custom column in your "kubectl get po" command to display the value of each "app" labels when getting the pods:

❯ k get pod -L app
NAME                            READY   STATUS    RESTARTS   AGE     APP
nginx-deploy-6bdc4445fd-5qlhg   1/1     Running   0          8m30s   nginx
nginx-deploy-6bdc4445fd-pgkhb   1/1     Running   0          8m30s   nginx
nginx-deploy-6bdc4445fd-xdz59   1/1     Running   0          8m30s   nginx

and you can use multiple -L :

❯ k get pod -L app -L test
NAME                            READY   STATUS    RESTARTS   AGE     APP     TEST
nginx-deploy-6bdc4445fd-5qlhg   1/1     Running   0          9m46s   nginx
nginx-deploy-6bdc4445fd-pgkhb   1/1     Running   0          9m46s   nginx
nginx-deploy-6bdc4445fd-xdz59   1/1     Running   0          9m46s   nginx

In general, the names of the pod begin by the name of their owner (deployment, replicaset, statefulset, job etc) When you use a deployment to create a pod, you can be sure that between the deployment and the pod there is a replicaset (The deployment only manages the differents version of the replicaset, while the replicaset only ENSURES that the current number of actual replicas is matching the demanded number of replicas in the manifes, with labels selector ! )

So you in fact, checks the ownerReference filed of a pod, by typing:

❯ kubectl get po -o custom-columns=NAME:'{.metadata.name}',OWNER:'{.metadata.ownerReferences[0].name}',OWNER_KIND:'{.metadata.ownerReferences[0].kind}'

NAME                            OWNER                     OWNER_KIND
nginx-deploy-6bdc4445fd-5qlhg   nginx-deploy-6bdc4445fd   ReplicaSet
nginx-deploy-6bdc4445fd-pgkhb   nginx-deploy-6bdc4445fd   ReplicaSet
nginx-deploy-6bdc4445fd-xdz59   nginx-deploy-6bdc4445fd   ReplicaSet

can do the same with replicasets to get their deployments owner:

❯ kubectl get rs -o custom-columns=NAME:'{.metadata.name}',OWNER:'{.metadata.ownerReferences[0].name}',OWNER_KIND:'{.metadata.ownerReferences[0].kind}'

NAME                      OWNER          OWNER_KIND
nginx-deploy-6bdc4445fd   nginx-deploy   Deployment

thats how you can quickly see withs kubectl who owns who

here is a little reading about owners and dependants: https://kubernetes.io/docs/concepts/overview/working-with-objects/owners-dependents/

hope this has helped you. bguess

  • Related