{"id":62,"date":"2022-12-18T10:21:09","date_gmt":"2022-12-18T10:21:09","guid":{"rendered":"https:\/\/devopsopen.com\/?p=62"},"modified":"2023-11-21T18:15:09","modified_gmt":"2023-11-21T18:15:09","slug":"scheduling","status":"publish","type":"post","link":"https:\/\/devopsopen.com\/index.php\/2022\/12\/18\/scheduling\/","title":{"rendered":"Scheduling"},"content":{"rendered":"<h1>Scheduling<\/h1>\n<h4 id=\"Summary\">Summary<\/h4>\n<ul class=\"ez-toc-page-1 ez-toc-heading-level-2\">\n<li><a title=\"Labels and selectors\" href=\"#Labels and selectors\">\u00a0Labels and selectors<\/a><\/li>\n<li><a title=\"Resource limits\" href=\"#Resource limits\">\u00a0Resource limits<\/a><\/li>\n<li><a title=\"Manual Scheduling\" href=\"#Manual Scheduling\">\u00a0Manual Scheduling<\/a><\/li>\n<li><a title=\"Taints and toleration\" href=\"#Taints and toleration\">\u00a0Taints and toleration<\/a><\/li>\n<li><a title=\"Node Affinity and selectors\" href=\"#Node Affinity and selectors\">\u00a0Node Affinity and selectors<\/a><\/li>\n<li><a title=\"DaemonSets\" href=\"#DaemonSets\">\u00a0DaemonSets<\/a><\/li>\n<li><a title=\"Static Pods\" href=\"#Static Pods\">\u00a0Static Pods<\/a><\/li>\n<li><a title=\"Multiple Schedulers\" href=\"#Multiple Schedulers\">\u00a0Multiple Schedulers<\/a><\/li>\n<li><a title=\"Scheduler Events\" href=\"#Scheduler Events\">\u00a0Scheduler Events<\/a><\/li>\n<li><a title=\"Confuguration of Kubernetes scheduler\" href=\"#Confuguration of Kubernetes scheduler\">\u00a0Confuguration of Kubernetes scheduler<\/a><\/li>\n<\/ul>\n<h2 id=\"Labels and selectors\"><a title=\"Summary\" href=\"#Summary\">Labels and selectors<\/a><\/h2>\n<p>Labels and selectors help us to tag and select a group of objects. For example we can add a label to pod like class=app and a service can attach to this pod by selector.<\/p>\n<p>you can get objects of kubernetes by type (pod, service...) or by app like app1, 2 or by their fonctionality (frontend, db...)<\/p>\n<h2 id=\"Resource limits\"><a title=\"Summary\" href=\"#Summary\">Resource limits<\/a><\/h2>\n<p>to have a default ressources, you should create a LimitRange object :<\/p>\n<div class=\"ud-component--base-components--code-block\">\n<div>\n<p tabindex=\"0\"><code class=\"language-yaml\" data-lang=\"yaml\">apiVersion: v1<br \/>\nkind: LimitRange<br \/>\nmetadata:<br \/>\nname: mem-limit-range<br \/>\nspec:<br \/>\nlimits:<br \/>\n- default:<br \/>\nmemory: 512Mi (or cpu)<br \/>\ndefaultRequest:<br \/>\nmemory: 256Mi (or cpu)<br \/>\ntype: Container<\/code><\/p>\n<p>you can specific ressources onto the pod :<\/p>\n<pre tabindex=\"0\"><code class=\"language-yaml\" data-lang=\"yaml\">apiVersion: v1\nkind: Pod\nmetadata:\n  name: cpu-demo\n  namespace: cpu-example\nspec:\n  containers:\n  - name: cpu-demo-ctr\n    image: vish\/stress\n    resources:\n      limits:\n        cpu: \"1\"\n      requests:\n        cpu: \"0.5\"\n    args:\n    - -cpus\n    - \"2\"<\/code> args section means that the containers will run in the beginin with 2 cpu<code class=\"language-yaml\" data-lang=\"yaml\">\n<\/code><\/pre>\n<\/div>\n<\/div>\n<h2 id=\"Manual Scheduling\"><a title=\"Summary\" href=\"#Summary\">Manual Scheduling<\/a><\/h2>\n<p>You can schedule a pod mannualy by adding nodeName into the pod yaml desc<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-88\" src=\"https:\/\/devopsopen.com\/wp-content\/uploads\/2022\/12\/schedulemanual.png\" alt=\"\" width=\"276\" height=\"280\" srcset=\"https:\/\/devopsopen.com\/wp-content\/uploads\/2022\/12\/schedulemanual.png 360w, https:\/\/devopsopen.com\/wp-content\/uploads\/2022\/12\/schedulemanual-296x300.png 296w\" sizes=\"(max-width: 276px) 100vw, 276px\" \/><\/p>\n<h2 id=\"Taints and toleration\"><a title=\"Summary\" href=\"#Summary\">Taints and toleration<\/a><\/h2>\n<p>Tolerants are in pods and taints into nodes. thoses concept are used when you want a node to accepet some tolerences, but if you want a pod to accept certains nodes then we will talking about another concept called infinity or nodeSelectors.<\/p>\n<p>as we can see bellow, red pod can be affected<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-103\" src=\"https:\/\/devopsopen.com\/wp-content\/uploads\/2022\/12\/tainttolerationgarantee.png\" alt=\"\" width=\"415\" height=\"308\" srcset=\"https:\/\/devopsopen.com\/wp-content\/uploads\/2022\/12\/tainttolerationgarantee.png 647w, https:\/\/devopsopen.com\/wp-content\/uploads\/2022\/12\/tainttolerationgarantee-300x223.png 300w\" sizes=\"(max-width: 415px) 100vw, 415px\" \/><\/p>\n<p>Toleration and taints don't garantee that pods scheduled only onto those nodes. although apply tolerant a pod can scheduled onto another node.<br \/>\nfor more details : places a taint on node node1. The taint has key key1, value value1, and taint effect NoSchedule. This means that no pod will be able to schedule onto node1 unless it has a matching toleration.<\/p>\n<p>there is tree efects of taints : NoSchedule, PreferNoSchedule and Noexecute<\/p>\n<p>Taint tell only to node to accept certain tolerations. You can use command bellow to taint a node<\/p>\n<pre tabindex=\"0\"><code class=\"language-shell\" data-lang=\"shell\">kubectl taint nodes node1 app=nginx:NoSchedule<\/code><\/pre>\n<p>To remove the taint added by the command above, you can run:<\/p>\n<pre tabindex=\"0\"><code class=\"language-shell\" data-lang=\"shell\">kubectl taint nodes node1 app=nginx:NoSchedule-<\/code><\/pre>\n<ul>\n<li><strong>NoSchedule<\/strong>: if this taint is applied to a node that contains already some pod that doesn\u2019t tolerate this taint, they are not excluded from this node. But no more pods are scheduled on this node if it doesn\u2019t match all the taints of this node. This is a strong constraint.<\/li>\n<li aria-level=\"1\"><strong>PreferNoSchedule: <\/strong>Like the previous one, this taint may not allow pods to be scheduled on the node. But this time, if the pod tolerates one taint, it can be scheduled. This is a soft constraint.<\/li>\n<li aria-level=\"1\"><strong>NoExecute<\/strong>: This taint applies to a node excluding all actual running pods on it and doesn\u2019t allow scheduling if new pods don\u2019t tolerate all taint. This is a strong constraint.<\/li>\n<\/ul>\n<p>To let the pod tolerate a node, here is the yaml file. The command kube control is to indicate key word to use into your yaml file:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-91\" src=\"https:\/\/devopsopen.com\/wp-content\/uploads\/2022\/12\/tolerance.png\" alt=\"\" width=\"307\" height=\"326\" srcset=\"https:\/\/devopsopen.com\/wp-content\/uploads\/2022\/12\/tolerance.png 530w, https:\/\/devopsopen.com\/wp-content\/uploads\/2022\/12\/tolerance-282x300.png 282w\" sizes=\"(max-width: 307px) 100vw, 307px\" \/><\/p>\n<h2 id=\"Node Affinity and selectors\"><a title=\"Summary\" href=\"#Summary\">Node Affinity and selectors<\/a><\/h2>\n<p>A node can accept some type of pods with slectors, but if you want to add other constraints, you should apply another pattern because slectors have some limits. so affinity and nodeAffinity can give us more flexibility. Affinity concept don't garantee that a node can accept only a type of pods as we can see bellow:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-105\" src=\"https:\/\/devopsopen.com\/wp-content\/uploads\/2022\/12\/afinitynode.png\" alt=\"\" width=\"407\" height=\"304\" srcset=\"https:\/\/devopsopen.com\/wp-content\/uploads\/2022\/12\/afinitynode.png 639w, https:\/\/devopsopen.com\/wp-content\/uploads\/2022\/12\/afinitynode-300x224.png 300w\" sizes=\"(max-width: 407px) 100vw, 407px\" \/><\/p>\n<p>Example of node selectors :<\/p>\n<p>to label a node and then use selctors tools, here is the example bellow :<\/p>\n<p>kubectl label nodes &lt;node-name&gt; &lt;label-key&gt;=&lt;label-value&gt;<br \/>\nkubectl label nodes node-1 size=Large<\/p>\n<p>the selectors are in the pod :<\/p>\n<blockquote>\n<pre>apiVersion:\nkind : Pod\nmetadata:\n \u00a0name: myapp-pod\nspec:\n  containers:\n \u00a0- name: data-processor\n \u00a0\u00a0\u00a0image: data-processor\n\u00a0 nodeSelector\n \u00a0\u00a0\u00a0 size: Large<\/pre>\n<\/blockquote>\n<p>selectors vs affinity :<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-96\" src=\"https:\/\/devopsopen.com\/wp-content\/uploads\/2022\/12\/affinity.png\" alt=\"\" width=\"685\" height=\"316\" srcset=\"https:\/\/devopsopen.com\/wp-content\/uploads\/2022\/12\/affinity.png 902w, https:\/\/devopsopen.com\/wp-content\/uploads\/2022\/12\/affinity-300x138.png 300w, https:\/\/devopsopen.com\/wp-content\/uploads\/2022\/12\/affinity-768x354.png 768w\" sizes=\"(max-width: 685px) 100vw, 685px\" \/><\/p>\n<p>There is two type node affinity availabe :<\/p>\n<ul>\n<li><code>requiredDuringSchedulingIgnoredDuringExecution<\/code>: The scheduler can't schedule the Pod unless the rule is met. This functions like <code>nodeSelector<\/code>, but with a more expressive syntax.<\/li>\n<li><code>preferredDuringSchedulingIgnoredDuringExecution<\/code>: The scheduler tries to find a node that meets the rule. If a matching node is not available, the scheduler still schedules the Pod in any node<\/li>\n<\/ul>\n<p><code>IgnoredDuringExecution means when changing labels in nodes, we continue to execute pods<\/code><\/p>\n<p>One type node affinity planned :<\/p>\n<ul>\n<li><code>requiredDuringSchedulingRequiredDuringExecution : The scheduler can't schedule the Pod unless the rule is met and can't execute the pod unless rule is met.<br \/>\n<\/code><\/li>\n<\/ul>\n<p>Example of affinity in a pod bellow with rules applied.<\/p>\n<p>The node <em>must<\/em> have a label with the key <code>topology.kubernetes.io\/zone<\/code> and the value of that label <em>must<\/em> be either <code>antarctica-east1<\/code> or <code>antarctica-west1<\/code>.<\/p>\n<p>The node <em>preferably<\/em> has a label with the key <code>another-node-label-key<\/code> and the value <code>another-node-label-value<\/code>.<\/p>\n<div id=\"pods-pod-with-node-affinity-yaml\" class=\"includecode\">\n<div class=\"highlight\">\n<pre tabindex=\"0\"><code class=\"language-yaml\" data-lang=\"yaml\">apiVersion: v1\nkind: Pod\nmetadata:\n  name: with-node-affinity\nspec:\n  affinity:\n    nodeAffinity:\n      requiredDuringSchedulingIgnoredDuringExecution:\n        nodeSelectorTerms:\n        - matchExpressions:\n          - key: topology.kubernetes.io\/zone\n            operator: In\n            values:\n            - antarctica-east1\n            - antarctica-west1\n      preferredDuringSchedulingIgnoredDuringExecution:\n      - weight: 1\n        preference:\n          matchExpressions:\n          - key: another-node-label-key\n            operator: In\n            values:\n            - another-node-label-value\n  containers:\n  - name: with-node-affinity\n    image: registry.k8s.io\/pause:2.0\n\nfinnaly we can combine affinity and toleration concepts to affect specifics pods to specifics nodes\n\n<img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-107\" src=\"https:\/\/devopsopen.com\/wp-content\/uploads\/2022\/12\/taintsandtolereance.png\" alt=\"\" width=\"388\" height=\"201\" srcset=\"https:\/\/devopsopen.com\/wp-content\/uploads\/2022\/12\/taintsandtolereance.png 887w, https:\/\/devopsopen.com\/wp-content\/uploads\/2022\/12\/taintsandtolereance-300x156.png 300w, https:\/\/devopsopen.com\/wp-content\/uploads\/2022\/12\/taintsandtolereance-768x398.png 768w\" sizes=\"(max-width: 388px) 100vw, 388px\" \/>\n<\/code><\/pre>\n<\/div>\n<\/div>\n<h2 id=\"DaemonSets\"><a title=\"Summary\" href=\"#Summary\">DaemonSets<\/a><\/h2>\n<p>DaemonSet concept means that the copy of pody is alwayse present in evry node.<\/p>\n<p>uses case 1: monitoring, log viewer..<\/p>\n<p>usecase 2: kube-proxy is a case of daemonset<\/p>\n<p>usecase 3: networking and deployment of agents<\/p>\n<p>&nbsp;<\/p>\n<p>Yaml file<\/p>\n<pre tabindex=\"0\"><code class=\"language-yaml\" data-lang=\"yaml\">apiVersion: apps\/v1\nkind: DaemonSet\nmetadata:\n  name: fluentd-elasticsearch\n  namespace: kube-system\n  labels:\n    k8s-app: fluentd-logging\nspec:\n  selector:\n    matchLabels:\n      name: fluentd-elasticsearch\n  template:\n    metadata:\n      labels:\n        name: fluentd-elasticsearch\n    spec:\n      containers:\n      - name: fluentd-elasticsearch\n        image: quay.io\/fluentd_elasticsearch\/fluentd:v2.5.2\n        resources:\n          limits:\n            memory: 200Mi\n          requests:\n            cpu: 100m\n            memory: 200Mi\n<\/code><\/pre>\n<h2 id=\"Static Pods\"><a title=\"Summary\" href=\"#Summary\">Static Pods<\/a><\/h2>\n<p>We can create only pods and not other objects (services, daemonset...) into the node independantly to the controlplane or master. Only kublet and CRE(docker) can do it with a manifest in \/etc\/kubernetetes\/manifests path.<\/p>\n<p>This path we can find it in kubelet.service, attribut --pod-manifest-path or --config=kubconfig.yaml<\/p>\n<p>in kubconfig.yaml, the attribut is staticPodPath: \/etc.....<\/p>\n<p>if we want to check the creation of pod we should use 'docker ps' command<\/p>\n<p>use case : create apiserver.yaml, etcd.yaml ... so you can put files directrly into the path etc\/kuberenetes\/manifests<\/p>\n<p>or you can use this command :<\/p>\n<p><code>kubectl run --restart=Never --image=busybox static-busybox<br \/>\n--dry-run=client -o yaml --command -- sleep 1000 &gt;<br \/>\n\/etc\/kubernetes\/manifests\/static-busybox.yaml<\/code><\/p>\n<p>&nbsp;<\/p>\n<p>to fin path in wich pod is stored :<\/p>\n<pre><code class=\"hljs\">kubectl <span class=\"hljs-keyword\">get<\/span> pods <span class=\"hljs-comment\">--all-namespaces -o wide <\/span><\/code><\/pre>\n<pre><code class=\"hljs\">ssh nodename  or ssh xxxx.xxxx.xxxx.xxxx\n<\/code><\/pre>\n<pre><code class=\"hljs\">ps -ef |  <span class=\"hljs-keyword\">grep<\/span> <span class=\"hljs-regexp\">\/usr\/<\/span>bin\/kubelet <\/code>(very important command to find the path)<\/pre>\n<pre><code class=\"hljs\"><span class=\"hljs-keyword\">grep<\/span> -i staticpod <span class=\"hljs-regexp\">\/var\/<\/span>lib<span class=\"hljs-regexp\">\/kubelet\/<\/span>config.yaml\n<\/code> then delete yaml file into the result of path<\/pre>\n<h2 id=\"Multiple Schedulers\"><a title=\"Summary\" href=\"#Summary\">Multiple Schedulers<\/a><\/h2>\n<p>K8S is a flexible system, you can create other scheduler and run them in the same time. We use custom scheduler when we have some use case very complex or default conf not enouph.<\/p>\n<p>Deploy addtional scheduler as a service :<\/p>\n<blockquote><p>wget https:\/\/storage.googleapis.com\/kubernetes-release\/release\/v1.12.0\/bin\/linux\/amd64\/kube-scheduler<\/p>\n<p>in my-custom-scheduler.service:<\/p>\n<pre>ExecStart=\/usr\/local\/bin\/kube-scheduler \\\\\n--config=\/etc\/kubernetes\/config\/kube-scheduler.yaml \\\\\nkube-scheduler.service\n--scheduler-name= <strong>my-scheduler-config.yaml<\/strong><\/pre>\n<p>into <strong>my-scheduler-config.yaml<\/strong><\/p>\n<pre>apiVersion: kubescheduler.config.k8s.io\/v1kind: KubeSchedulerConfigurationprofiles:- schedulerName: my-scheduler<\/pre>\n<\/blockquote>\n<p>Deploy addtional scheduler as a pod with kubeadm:<\/p>\n<blockquote>\n<pre>my-custom-scheduler.yaml\napiVersion: v1\nkind: Pod\nmetadata:\nname: my-custom-scheduler\nnamespace: kube-system\nspec:\ncontainers:\n- command:\n- kube-scheduler\n- --address=127.0.0.1\n- --kubeconfig=\/etc\/kubernetes\/scheduler.conf\n- --leader-elect=true\nimage: k8s.gcr.io\/kube-scheduler-amd64:v1.1<\/pre>\n<p>the default pod is<\/p>\n<pre>etc\/kubernetes\/manifests\/kube-scheduler.yaml\n\napiVersion: v1\nkind: Pod\nmetadata:\nname: kube-scheduler\nnamespace: kube-system\nspec:\ncontainers:\n- command:\n- kube-scheduler\n- --address=127.0.0.1\n- --kubeconfig=\/etc\/kubernetes\/scheduler.conf\n- --leader-elect=true\nimage: k8s.gcr.io\/kube-scheduler-amd64:v1.11.3\nname: kube-scheduler<\/pre>\n<\/blockquote>\n<p>&nbsp;<\/p>\n<p>check custom scheduler :<\/p>\n<blockquote>\n<pre>kubectl get pods --namespace=kube-system\nNAME READY STATUS RESTARTS AGE\nkube-scheduler-master 1\/1 Running 0 1h\nmy-custom-scheduler 1\/1 Running 0 9s\nweave-net-4tfpt 2\/2 Running 1 1h<\/pre>\n<\/blockquote>\n<p>the definition of pod using costum scheduler is :<\/p>\n<blockquote>\n<pre>apiVersion: v1\nkind: Pod\nmetadata:\nname: nginx\nspec:\ncontainers:\n- image: nginx\nname: nginx\nschedulerName : my-custom-scheduler<\/pre>\n<\/blockquote>\n<h2 id=\"Scheduler Events\"><a title=\"Summary\" href=\"#Summary\">Scheduler Events<\/a><\/h2>\n<p>Check events of scheduling objects: Use the command bellow :<\/p>\n<blockquote>\n<pre>kubectl get events - o wide<\/pre>\n<\/blockquote>\n<p>Also to check logs :<\/p>\n<blockquote>\n<pre>kubectl logs my-custom-scheduler --name-space=kube-system<\/pre>\n<\/blockquote>\n<h2 id=\"Confuguration of Kubernetes scheduler\"><a title=\"Summary\" href=\"#Summary\">Confuguration of Kubernetes scheduler<\/a><\/h2>\n<p><a href=\"https:\/\/github.com\/kubernetes\/community\/blob\/master\/contributors\/devel\/sig-scheduling\/scheduling_code_hierarchy_overview.md\">https:\/\/github.com\/kubernetes\/community\/blob\/master\/contributors\/devel\/sig-scheduling\/scheduling_code_hierarchy_overview.md<\/a><\/p>\n<p><a href=\"https:\/\/kubernetes.io\/blog\/2017\/03\/advanced-scheduling-in-kubernetes\/\">https:\/\/kubernetes.io\/blog\/2017\/03\/advanced-scheduling-in-kubernetes\/<\/a><\/p>\n<p><a href=\"https:\/\/jvns.ca\/blog\/2017\/07\/27\/how-does-the-kubernetes-scheduler-work\/\">https:\/\/jvns.ca\/blog\/2017\/07\/27\/how-does-the-kubernetes-scheduler-work\/<\/a><\/p>\n<p><a href=\"https:\/\/stackoverflow.com\/questions\/28857993\/how-does-kubernetes-scheduler-work\">https:\/\/stackoverflow.com\/questions\/28857993\/how-does-kubernetes-scheduler-work<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Scheduling Summary \u00a0Labels and selectors \u00a0Resource limits \u00a0Manual Scheduling \u00a0Taints and toleration \u00a0Node Affinity and selectors \u00a0DaemonSets \u00a0Static Pods \u00a0Multiple Schedulers \u00a0Scheduler Events \u00a0Confuguration of Kubernetes scheduler Labels and selectors Labels and selectors help us to tag and select a group of objects. For example we can add a label to pod like class=app and a service can attach to this pod by selector. you can get objects of kubernetes by type (pod, service&#8230;) or by app like app1, 2 or by their fonctionality (frontend, db&#8230;) Resource limits to have a default ressources, you should create a LimitRange object :\u2026<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":""},"categories":[12],"tags":[],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":5}},"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"admin","author_link":"https:\/\/devopsopen.com\/index.php\/author\/admin_bak\/"},"uagb_comment_info":0,"uagb_excerpt":"Scheduling Summary \u00a0Labels and selectors \u00a0Resource limits \u00a0Manual Scheduling \u00a0Taints and toleration \u00a0Node Affinity and selectors \u00a0DaemonSets \u00a0Static Pods \u00a0Multiple Schedulers \u00a0Scheduler Events \u00a0Confuguration of Kubernetes scheduler Labels and selectors Labels and selectors help us to tag and select a group of objects. For example we can add a label to pod like class=app and&hellip;","_links":{"self":[{"href":"https:\/\/devopsopen.com\/index.php\/wp-json\/wp\/v2\/posts\/62"}],"collection":[{"href":"https:\/\/devopsopen.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devopsopen.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devopsopen.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devopsopen.com\/index.php\/wp-json\/wp\/v2\/comments?post=62"}],"version-history":[{"count":49,"href":"https:\/\/devopsopen.com\/index.php\/wp-json\/wp\/v2\/posts\/62\/revisions"}],"predecessor-version":[{"id":417,"href":"https:\/\/devopsopen.com\/index.php\/wp-json\/wp\/v2\/posts\/62\/revisions\/417"}],"wp:attachment":[{"href":"https:\/\/devopsopen.com\/index.php\/wp-json\/wp\/v2\/media?parent=62"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devopsopen.com\/index.php\/wp-json\/wp\/v2\/categories?post=62"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devopsopen.com\/index.php\/wp-json\/wp\/v2\/tags?post=62"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}