{"id":24357,"date":"2023-06-26T13:05:00","date_gmt":"2023-06-26T11:05:00","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=24357"},"modified":"2023-07-04T15:52:59","modified_gmt":"2023-07-04T13:52:59","slug":"admission_controller_kubernetes","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/admission_controller_kubernetes\/","title":{"rendered":"Using Admission Controller in Kubernetes"},"content":{"rendered":"\n<p>Undoubtedly, Kubernetes has become the standard for container orchestration, making it necessary to work with extensions that add a layer of security and modularity.<\/p>\n\n\n\n<p>So, what exactly are these extensions? According to the Kubernetes documentation, &#8220;An admission controller is a piece of code that intercepts requests to the Kubernetes API server prior to persistence of the object, but after the request is authenticated and authorized.&#8221;<\/p>\n\n\n\n<p>In essence, these extensions help us define and govern operations for our Kubernetes cluster. They act as a security checkpoint before object data from API requests is executed or stored into etcd.<\/p>\n\n\n\n<p>In this blog, I will show you how to install and configure these admission controllers. For your information, you can find the list of all functions of the admission controller for version 1.26 of Kubernetes in the <a href=\"https:\/\/kubernetes.io\/docs\/reference\/access-authn-authz\/admission-controllers\/#what-does-each-admission-controller-do\" target=\"_blank\" rel=\"noreferrer noopener\">official documentation.<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-deploy-status\">Deploy status<\/h2>\n\n\n\n<p>In this blog, I suggest testing two admission controllers, which are the ImagePolicyWebhook and the NodeRestriction, which will check and validate if a pod can be deployed or not. First, let&#8217;s test the deployment of an nginx pod with version 1.42.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nkubectl run nginx --image=nginx:1.14.2\nkubectl get pod --watch\n<\/pre><\/div>\n\n\n<pre class=\"wp-block-code\"><code>nabil@dbi-master01:~$ kubectl run nginx --image=nginx:1.14.2\npod\/nginx created\nnabil@dbi-master01:~$ kubectl get pod --watch\nNAME    READY   STATUS    RESTARTS   AGE\nnginx   1\/1     Running   0          13s<\/code><\/pre>\n\n\n\n<p>The pod is running, so we can delete it.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nkubectl delete pod nginx\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"h-check-the-configuration\">Check the configuration<\/h2>\n\n\n\n<p>Check the Kubernetes setup currently being used. This should show the&nbsp;<code>admissionregistration.k8s.io\/vi<\/code>&nbsp;API.:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nkubectl api-versions | grep admissionregistration\n<\/pre><\/div>\n\n\n<pre class=\"wp-block-code\"><code>nabil@dbi-master01:~$ kubectl api-versions | grep admissionregistration\nadmissionregistration.k8s.io\/v1<\/code><\/pre>\n\n\n\n<p>Dump the k8s cluster configuration to display the references to mutating webhooks and validating webhooks, but without image policy webhooks:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nkubectl cluster-info dump | grep -i imagepolicyWebhook\n<\/pre><\/div>\n\n\n<pre class=\"wp-block-code\"><code>nabil@dbi-master01:~$ kubectl cluster-info dump | grep -i imagepolicyWebhook\nnabil@dbi-master01:~$<\/code><\/pre>\n\n\n\n<p>Normally, the command should return nothing as you can see above.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-enable-controller\">Enable Controller<\/h2>\n\n\n\n<p>We will now activate the admission controller. Simply edit the kubernetes apiserver manfiest file , look for the <code>--enable-admission-plugins<\/code> flag in the configuration section of the kube-apiserver and add the ImagePolicyWebhook plugin at the end of the line to enable the webhook.<\/p>\n\n\n\n<p>With a high user privilege, edit the <code>\/etc\/kubernetes\/manifests\/kube-apiserver.yaml<\/code> file<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nnabil@dbi-master01:~$ sudo su -\n&#x5B;sudo] password for nabil:\nroot@dbi-master01:~# vi \/etc\/kubernetes\/manifests\/kube-apiserver.yaml\n<\/pre><\/div>\n\n\n<p>Navigate down to the spec&nbsp;code block to find the&nbsp;<code>--enable-admission-plugins<\/code>&nbsp;line (here, the 6th flag in the kube-apiserver spec).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>spec:\n  containers:\n  - command:\n    - kube-apiserver\n    - --admission-control-config-file=\/etc\/kubernetes\/admission-control\/admission-control.conf\n    - --advertise-address=*.*.*.*\n    - --allow-privileged=true\n    - --authorization-mode=Node,RBAC\n    - --client-ca-file=\/etc\/kubernetes\/pki\/ca.crt\n    - --enable-admission-plugins=NodeRestriction\n    - --enable-bootstrap-token-auth=true\n    - --etcd-cafile=\/etc\/kubernetes\/pki\/etcd\/ca.crt\n    - --etcd-certfile=\/etc\/kubernetes\/pki\/apiserver-etcd-client.crt\n    - --etcd-keyfile=\/etc\/kubernetes\/pki\/apiserver-etcd-client.key\n    - --etcd-servers=https:\/\/127.0.0.1:2379\n    - --kubelet-client-certificate=\/etc\/kubernetes\/pki\/apiserver-kubelet-client.crt\n    - --kubelet-client-key=\/etc\/kubernetes\/pki\/apiserver-kubelet-client.key\n    - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname\n    - --proxy-client-cert-file=\/etc\/kubernetes\/pki\/front-proxy-client.crt\n    - --proxy-client-key-file=\/etc\/kubernetes\/pki\/front-proxy-client.key\n    - --requestheader-allowed-names=front-proxy-client\n    - --requestheader-client-ca-file=\/etc\/kubernetes\/pki\/front-proxy-ca.crt\n    - --requestheader-extra-headers-prefix=X-Remote-Extra-\n    - --requestheader-group-headers=X-Remote-Group\n    - --requestheader-username-headers=X-Remote-User\n    - --secure-port=6443\n    - --service-account-issuer=https:\/\/kubernetes.default.svc.cluster.local\n    - --service-account-key-file=\/etc\/kubernetes\/pki\/sa.pub\n    - --service-account-signing-key-file=\/etc\/kubernetes\/pki\/sa.key\n    - --service-cluster-ip-range=10.*.*.*\/12\n    - --tls-cert-file=\/etc\/kubernetes\/pki\/apiserver.crt\n    - --tls-private-key-file=\/etc\/kubernetes\/pki\/apiserver.key<\/code><\/pre>\n\n\n\n<p>Add&nbsp;ImagePolicyWebhook&nbsp;at the end of the line to enable the webhook:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n--enable-admission-plugins=NodeRestriction,ImagePolicyWebhook\n<\/pre><\/div>\n\n\n<p>Save and exit. Then, check the status of the server:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nkubectl get nodes\n<\/pre><\/div>\n\n\n<p>The connection may be refused, as the cluster take few minutes to set up the configuration.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nabil@dbi-master01:~$ kubectl get nodes\nThe connection to the server 10.*.*.*:6443 was refused - did you specify the right host or port?<\/code><\/pre>\n\n\n\n<p>Keep cool! Wait and retry a couple of minutes later to the nodes UP and RUNNING (Ready state).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nabil@dbi-master01:~$ kubectl get nodes\nNAME          STATUS   ROLES           AGE   VERSION\nk8s-master01   Ready    control-plane   58m   v1.25.0\nk8s-worker01   Ready    &lt;none&gt;          57m   v1.25.0<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-test-the-setup\">Test the setup<\/h2>\n\n\n\n<p>Search again to see if the image policy webhook is enabled:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nkubectl cluster-info dump | grep ImagePolicyWebhook\n<\/pre><\/div>\n\n\n<pre class=\"wp-block-code\"><code>nabil@dbi-master01:~$ kubectl cluster-info dump | grep ImagePolicyWebhook\n                            \"--enable-admission-plugins=NodeRestriction,ImagePolicyWebhook\",\nI0704 13:21:57.710001       1 plugins.go:161] Loaded 12 validating admission controller(s) successfully in the following order: LimitRanger,ServiceAccount,ImagePolicyWebhook,PodSecurity,Priority,PersistentVolumeClaimResize,RuntimeClass,CertificateApproval,CertificateSigning,CertificateSubjectRestriction,ValidatingAdmissionWebhook,ResourceQuota.\nI0704 13:21:57.711659       1 plugins.go:161] Loaded 12 validating admission controller(s) successfully in the following order: LimitRanger,ServiceAccount,ImagePolicyWebhook,PodSecurity,Priority,PersistentVolumeClaimResize,RuntimeClass,CertificateApproval,CertificateSigning,CertificateSubjectRestriction,ValidatingAdmissionWebhook,ResourceQuota.\nI0704 13:21:58.647369       1 plugins.go:161] Loaded 12 validating admission controller(s) successfully in the following order: LimitRanger,ServiceAccount,ImagePolicyWebhook,PodSecurity,Priority,PersistentVolumeClaimResize,RuntimeClass,CertificateApproval,CertificateSigning,CertificateSubjectRestriction,ValidatingAdmissionWebhook,ResourceQuota.\nnabil@dbi-master01:~$<\/code><\/pre>\n\n\n\n<p>We can clearly see here that the command returns that the image policy webhook is enabled, unlike the previous paragraph where the command returned nothing<\/p>\n\n\n\n<p>Now, we will try to deploy a nginx image which contain some known  vulnerabilities:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nkubectl run nginx --image=1.14.2\n<\/pre><\/div>\n\n\n<pre class=\"wp-block-code\"><code>nabil@dbi-master01:~$ kubectl run nginx --image=1.14.2\nError from server (Forbidden): pods \"nginx\" is forbidden: image policy webhook backend denied one or more images: Image(s) contain serious vulnerabilities: &#091;1.14.2]\nnabil@dbi-master01:~$<\/code><\/pre>\n\n\n\n<p>This time, the deployment should be denied from being provisioned because of image vulnerabilities.<br>Now, try with a busybox image:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nkubectl run busybox --image=busybox:1.36.1\n<\/pre><\/div>\n\n\n<pre class=\"wp-block-code\"><code>nabil@dbi-master01:~$ kubectl run busybox --image=busybox:1.36.1\npod\/busybox created<\/code><\/pre>\n\n\n\n<p>The pod is created successfully, meaning the webhook works as intended.<\/p>\n\n\n\n<p>Good job, you have successfully activated and used an admission controller.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Undoubtedly, Kubernetes has become the standard for container orchestration, making it necessary to work with extensions that add a layer of security and modularity. So, what exactly are these extensions? According to the Kubernetes documentation, &#8220;An admission controller is a piece of code that intercepts requests to the Kubernetes API server prior to persistence of [&hellip;]<\/p>\n","protected":false},"author":40,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1320,1522],"tags":[3009],"type_dbi":[2943],"class_list":["post-24357","post","type-post","status-publish","format-standard","hentry","category-devops","category-kubernetes","tag-admission-controller","type-kubernetes"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Using Admission Controller in Kubernetes - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/admission_controller_kubernetes\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Using Admission Controller in Kubernetes\" \/>\n<meta property=\"og:description\" content=\"Undoubtedly, Kubernetes has become the standard for container orchestration, making it necessary to work with extensions that add a layer of security and modularity. So, what exactly are these extensions? According to the Kubernetes documentation, &#8220;An admission controller is a piece of code that intercepts requests to the Kubernetes API server prior to persistence of [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/admission_controller_kubernetes\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-26T11:05:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-07-04T13:52:59+00:00\" \/>\n<meta name=\"author\" content=\"Middleware Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Middleware Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/admission_controller_kubernetes\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/admission_controller_kubernetes\/\"},\"author\":{\"name\":\"Middleware Team\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1\"},\"headline\":\"Using Admission Controller in Kubernetes\",\"datePublished\":\"2023-06-26T11:05:00+00:00\",\"dateModified\":\"2023-07-04T13:52:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/admission_controller_kubernetes\/\"},\"wordCount\":466,\"commentCount\":1,\"keywords\":[\"Admission Controller\"],\"articleSection\":[\"DevOps\",\"Kubernetes\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/admission_controller_kubernetes\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/admission_controller_kubernetes\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/admission_controller_kubernetes\/\",\"name\":\"Using Admission Controller in Kubernetes - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2023-06-26T11:05:00+00:00\",\"dateModified\":\"2023-07-04T13:52:59+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/admission_controller_kubernetes\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/admission_controller_kubernetes\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/admission_controller_kubernetes\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Using Admission Controller in Kubernetes\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1\",\"name\":\"Middleware Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g\",\"caption\":\"Middleware Team\"},\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/middleware-team\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Using Admission Controller in Kubernetes - dbi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/admission_controller_kubernetes\/","og_locale":"en_US","og_type":"article","og_title":"Using Admission Controller in Kubernetes","og_description":"Undoubtedly, Kubernetes has become the standard for container orchestration, making it necessary to work with extensions that add a layer of security and modularity. So, what exactly are these extensions? According to the Kubernetes documentation, &#8220;An admission controller is a piece of code that intercepts requests to the Kubernetes API server prior to persistence of [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/admission_controller_kubernetes\/","og_site_name":"dbi Blog","article_published_time":"2023-06-26T11:05:00+00:00","article_modified_time":"2023-07-04T13:52:59+00:00","author":"Middleware Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Middleware Team","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/admission_controller_kubernetes\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/admission_controller_kubernetes\/"},"author":{"name":"Middleware Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1"},"headline":"Using Admission Controller in Kubernetes","datePublished":"2023-06-26T11:05:00+00:00","dateModified":"2023-07-04T13:52:59+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/admission_controller_kubernetes\/"},"wordCount":466,"commentCount":1,"keywords":["Admission Controller"],"articleSection":["DevOps","Kubernetes"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/admission_controller_kubernetes\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/admission_controller_kubernetes\/","url":"https:\/\/www.dbi-services.com\/blog\/admission_controller_kubernetes\/","name":"Using Admission Controller in Kubernetes - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2023-06-26T11:05:00+00:00","dateModified":"2023-07-04T13:52:59+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/admission_controller_kubernetes\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/admission_controller_kubernetes\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/admission_controller_kubernetes\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Using Admission Controller in Kubernetes"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1","name":"Middleware Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g","caption":"Middleware Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/middleware-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/24357","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/40"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=24357"}],"version-history":[{"count":16,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/24357\/revisions"}],"predecessor-version":[{"id":26552,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/24357\/revisions\/26552"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=24357"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=24357"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=24357"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=24357"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}