AndrewS
AndrewS

Reputation: 177

How to extract Kubernestes PODS mac addresses from annotations object

I am trying to extract the mac or ips addresses under metadata.annotations using either kubectl get po in json filter or using jq. other objects are easy to manipulate to get those values.

kubectl get po -o json -n multus|jq -r .items Under annotations, there is duplication CNI info but it is ok. I like to extract those MAC addresses using jq. it seems to be tricky on this one.

[
  {
    "apiVersion": "v1",
    "kind": "Pod",
    "metadata": {
      "annotations": {
        "k8s.v1.cni.cncf.io/network-status": "[{\n    \"name\": \"eps-cni\",\n    \"ips\": [\n        \"172.31.83.216\"\n    ],\n    \"default\": true,\n    \"dns\": {}\n},{\n    \"name\": \"ipvlan1-busybox1\",\n    \"interface\": \"net1\",\n    \"ips\": [\n        \"172.31.230.70\"\n    ],\n    \"mac\": \"0a:2d:40:c6:f8:ea\",\n    \"dns\": {}\n},{\n    \"name\": \"ipvlan2-busybox1\",\n    \"interface\": \"net2\",\n    \"ips\": [\n        \"172.31.232.70\"\n    ],\n    \"mac\": \"0a:52:8a:62:5d:f4\",\n    \"dns\": {}\n}]",
        "k8s.v1.cni.cncf.io/networks": "ipvlan1-busybox1, ipvlan2-busybox1",
        "k8s.v1.cni.cncf.io/networks-status": "[{\n    \"name\": \"eps-cni\",\n    \"ips\": [\n        \"172.31.83.216\"\n    ],\n    \"default\": true,\n    \"dns\": {}\n},{\n    \"name\": \"ipvlan1-busybox1\",\n    \"interface\": \"net1\",\n    \"ips\": [\n        \"172.31.230.70\"\n    ],\n    \"mac\": \"0a:2d:40:c6:f8:ea\",\n    \"dns\": {}\n},{\n    \"name\": \"ipvlan2-busybox1\",\n    \"interface\": \"net2\",\n    \"ips\": [\n        \"172.31.232.70\"\n    ],\n    \"mac\": \"0a:52:8a:62:5d:f4\",\n    \"dns\": {}\n}]",
        "kubernetes.io/psp": "eps.privileged"
      },
      "creationTimestamp": "2020-05-24T17:09:10Z",
      "generateName": "busybox1-f476958bd-",
      "labels": {
        "app": "busybox",
        "pod-template-hash": "f476958bd"
      },
      "name": "busybox1-f476958bd-hds4w",
      "namespace": "multus",
      "ownerReferences": [
        {
          "apiVersion": "apps/v1",
          "blockOwnerDeletion": true,
          "controller": true,
          "kind": "ReplicaSet",
          "name": "busybox1-f476958bd",
          "uid": "5daf9b52-e1b3-4df7-b5a1-028b48e7fcc0"
        }
      ],
      "resourceVersion": "965176",
      "selfLink": "/api/v1/namespaces/multus/pods/busybox1-f476958bd-hds4w",
      "uid": "0051b85d-9774-4f89-8658-f34065222bf0"
    },

for basic jq,

[root@ip-172-31-103-214 ~]# kubectl get po -o json -n multus|jq -r '.items[] | .spec.volumes'
[
  {
    "name": "test-busybox1-token-f6bdj",
    "secret": {
      "defaultMode": 420,
      "secretName": "test-busybox1-token-f6bdj"
    }
  }
]

I can switch the get pod to yaml format then using normal grep cmd.

kubectl get po -o yaml  -n multus|egrep 'mac'|sort -u
"mac": "0a:2d:40:c6:f8:ea",
"mac": "0a:52:8a:62:5d:f4",

Thanks

Upvotes: 0

Views: 982

Answers (3)

RobMac
RobMac

Reputation: 870

I just had to solve a similar problem, the solutions above do the job, however I needed to be able to identify the pod. I'm sharing the command used here:

kubectl get po -o json -A | jq -r '.items[] | {name: .metadata.name, mac: (.metadata.annotations["k8s.v1.cni.cncf.io/network-status"] // "[]" | fromjson | .[0].mac)}'

(note the output includes the pod's name)

Upvotes: 0

nischay goyal
nischay goyal

Reputation: 3480

Please try the below command and should get the expected output.

cat abc.json | jq -r  '.metadata.annotations."k8s.v1.cni.cncf.io/networks-status" | fromjson | .[].mac ' 

where abc.json is your son file.

Upvotes: 1

peak
peak

Reputation: 116957

Starting with the original JSON and using jq's -r command-line option, the following jq filter yields the output shown below:

.[]
| .metadata.annotations[]
| (fromjson? // empty)
| .[]
| select(has("mac"))
| {mac}

Output:

{"mac":"0a:2d:40:c6:f8:ea"}
{"mac":"0a:52:8a:62:5d:f4"}
{"mac":"0a:2d:40:c6:f8:ea"}
{"mac":"0a:52:8a:62:5d:f4"}

Upvotes: 2

Related Questions