{"id":54053,"date":"2025-11-12T08:37:24","date_gmt":"2025-11-12T08:37:24","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=54053"},"modified":"2025-11-12T08:37:24","modified_gmt":"2025-11-12T08:37:24","slug":"kubernetes-tutorials-ingressgroup-on-eks-alb-ingress-a-practical-guide-to-one-alb-for-many-namespaces","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/kubernetes-tutorials-ingressgroup-on-eks-alb-ingress-a-practical-guide-to-one-alb-for-many-namespaces\/","title":{"rendered":"Kubernetes Tutorials: IngressGroup on EKS (ALB Ingress): A Practical Guide to One-ALB-for-Many-Namespaces"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">What is an IngressGroup (and why it matters)<\/h2>\n\n\n\n<p><strong>IngressGroup<\/strong> lets you <strong>share a single ALB<\/strong> across <strong>multiple Ingress objects<\/strong> (even across different namespaces). The controller <strong>merges all rules<\/strong> from Ingresses with the same <code>alb.ingress.kubernetes.io\/group.name<\/code> onto <strong>one ALB<\/strong>; you can also <strong>control rule priority<\/strong> with <code>alb.ingress.kubernetes.io\/group.order<\/code>. This reduces cost and operational sprawl while keeping teams free to manage their own Ingress manifests. (<a href=\"https:\/\/docs.aws.amazon.com\/ja_jp\/eks\/latest\/userguide\/alb-ingress.html?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">AWS Documentation<\/a>)<\/p>\n\n\n\n<p><strong>Key behaviors<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Share one ALB<\/strong> across many Ingresses (and namespaces) via <code>group.name<\/code>. (<a href=\"https:\/\/docs.aws.amazon.com\/ja_jp\/eks\/latest\/userguide\/alb-ingress.html?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">AWS Documentation<\/a>)<\/li>\n\n\n\n<li><strong>Rule evaluation order<\/strong> across the group is governed by <code>group.order<\/code> (lower numbers evaluated first; 1\u20131000). Unset = <code>0<\/code>. Each Ingress in a group must have a <strong>unique<\/strong> order if you set it. (<a href=\"https:\/\/aws.amazon.com\/blogs\/containers\/a-deeper-look-at-ingress-sharing-and-target-group-binding-in-aws-load-balancer-controller\/?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Amazon Web Services, Inc.<\/a>)<\/li>\n\n\n\n<li><strong>Most annotations apply only to the paths on that Ingress<\/strong>, not globally to the ALB. (<a href=\"https:\/\/docs.aws.amazon.com\/ja_jp\/eks\/latest\/userguide\/alb-ingress.html?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">AWS Documentation<\/a>)<\/li>\n\n\n\n<li><strong>Trust boundary warning:<\/strong> anyone who can create\/modify an Ingress with the same <code>group.name<\/code> can add\/override rules on \u201cyour\u201d ALB\u2014use only within a <strong>trusted RBAC boundary<\/strong>. (<a href=\"https:\/\/kubernetes-sigs.github.io\/aws-load-balancer-controller\/latest\/guide\/ingress\/annotations\/?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">kubernetes-sigs.github.io<\/a>)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">When to use IngressGroup<\/h2>\n\n\n\n<p>Use it when you want to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Reduce ALB count\/cost<\/strong> by hosting many apps, microservices, or environments on <strong>one ALB<\/strong>. (<a href=\"https:\/\/aws.amazon.com\/blogs\/containers\/a-deeper-look-at-ingress-sharing-and-target-group-binding-in-aws-load-balancer-controller\/?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Amazon Web Services, Inc.<\/a>)<\/li>\n\n\n\n<li><strong>Decentralize ownership:<\/strong> each team owns its own Ingress, but traffic still lands on a single ALB (great for platform teams). (<a href=\"https:\/\/aws.amazon.com\/blogs\/containers\/exposing-kubernetes-applications-part-2-aws-load-balancer-controller\/?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Amazon Web Services, Inc.<\/a>)<\/li>\n\n\n\n<li><strong>Route by host\/path across namespaces:<\/strong> e.g., <code>api.example.com\/vehicle<\/code> \u2192 <code>apps\/vehicle<\/code>, <code>ops.example.com\/metrics<\/code> \u2192 <code>ops\/metrics<\/code>. (<a href=\"https:\/\/medium.com\/%40philipdam8\/using-a-single-alb-ingress-across-multiple-kubernetes-namespaces-556df9b51f80?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Medium<\/a>)<\/li>\n\n\n\n<li><strong>Control match precedence<\/strong> (e.g., wildcard catch-alls after specific paths) with <code>group.order<\/code>. (<a href=\"https:\/\/aws.amazon.com\/blogs\/containers\/a-deeper-look-at-ingress-sharing-and-target-group-binding-in-aws-load-balancer-controller\/?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Amazon Web Services, Inc.<\/a>)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">When <em>not<\/em> to use IngressGroup<\/h2>\n\n\n\n<p>Avoid it if:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Multi-tenant untrusted RBAC:<\/strong> tenants could hijack or shadow rules on the shared ALB. (Trust boundary caveat.) (<a href=\"https:\/\/kubernetes-sigs.github.io\/aws-load-balancer-controller\/latest\/guide\/ingress\/annotations\/?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">kubernetes-sigs.github.io<\/a>)<\/li>\n\n\n\n<li><strong>Divergent ALB settings are required<\/strong> per app (e.g., different <strong>schemes<\/strong> <code>internet-facing<\/code> vs <code>internal<\/code>, incompatible <strong>listener ports<\/strong>, incompatible <strong>target types<\/strong>). A group shares one ALB\u2019s global properties. (<a href=\"https:\/\/docs.aws.amazon.com\/ja_jp\/eks\/latest\/userguide\/alb-ingress.html?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">AWS Documentation<\/a>)<\/li>\n\n\n\n<li><strong>Distinct security\/waf\/ops policies<\/strong> must apply per app at the <strong>edge<\/strong> (separate WAF ACLs, SGs, or lifecycle). Keep separate ALBs then. (<a href=\"https:\/\/aws.amazon.com\/blogs\/containers\/exposing-kubernetes-applications-part-2-aws-load-balancer-controller\/?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Amazon Web Services, Inc.<\/a>)<\/li>\n\n\n\n<li>You need <strong>fine-grained priority beyond group.order<\/strong> but can\u2019t coordinate unique orders; duplicates aren\u2019t allowed. (<a href=\"https:\/\/docs.aws.amazon.com\/eks\/latest\/userguide\/alb-ingress.html?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">AWS Documentation<\/a>)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Reference design: single ALB, multiple namespaces<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1) Shared ALB \u201cedge\u201d Ingress (optional)<\/h3>\n\n\n\n<p>You can start with <strong>no \u201cedge\u201d ingress<\/strong>\u2014the controller will still merge ALB rules. If you prefer a named ALB and shared listeners, create a tiny \u201canchor\u201d Ingress:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">apiVersion: networking.k8s.io\/v1\n<span class=\"hljs-attr\">kind<\/span>: Ingress\n<span class=\"hljs-attr\">metadata<\/span>:\n  name: shared-alb\n  <span class=\"hljs-attr\">namespace<\/span>: platform\n  <span class=\"hljs-attr\">annotations<\/span>:\n    kubernetes.io\/ingress.class: alb\n    alb.ingress.kubernetes.io\/load-balancer-name: prod-shared-alb\n    alb.ingress.kubernetes.io\/scheme: internet-facing\n    alb.ingress.kubernetes.io\/target-type: ip\n    alb.ingress.kubernetes.io\/listen-ports: <span class=\"hljs-string\">'&#91;{\"HTTPS\":443}]'<\/span>\n    alb.ingress.kubernetes.io\/group.name: prod-ing\n    alb.ingress.kubernetes.io\/group.order: <span class=\"hljs-string\">\"1\"<\/span>\n<span class=\"hljs-attr\">spec<\/span>:\n  tls:\n    - hosts: &#91; <span class=\"hljs-string\">\"api.example.com\"<\/span>, <span class=\"hljs-string\">\"ops.example.com\"<\/span> ]\n      <span class=\"hljs-attr\">secretName<\/span>: wildcard-example-tls\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Notes: <strong>One ALB<\/strong> will be created with the name above and <strong>HTTPS 443<\/strong> listener. Additional Ingresses in other namespaces join the <strong>same group<\/strong> and add rules to this ALB. (<a href=\"https:\/\/docs.aws.amazon.com\/ja_jp\/eks\/latest\/userguide\/alb-ingress.html?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">AWS Documentation<\/a>)<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">2) App team A (namespace <code>apps<\/code>): host+path routing<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">apiVersion: networking.k8s.io\/v1\nkind: Ingress\nmetadata:\n  name: vehicle-ing\n  namespace: apps\n  annotations:\n    kubernetes.io\/ingress.class: alb\n    alb.ingress.kubernetes.io\/group.name: prod-ing\n    alb.ingress.kubernetes.io\/group.order: \"10\"   # evaluated after \u201c1\u201d\n    alb.ingress.kubernetes.io\/healthcheck-path: \/healthz\nspec:\n  rules:\n  - host: api.example.com\n    http:\n      paths:\n      - path: \/vehicle\n        pathType: Prefix\n        backend:\n          service:\n            name: vehicle\n            port:\n              number: 8080\n      - path: \/legal\n        pathType: Prefix\n        backend:\n          service:\n            name: legal\n            port:\n              number: 8080\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">3) App team B (namespace <code>ops<\/code>): separate host<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">apiVersion: networking.k8s.io\/v1\nkind: Ingress\nmetadata:\n  name: ops-ing\n  namespace: ops\n  annotations:\n    kubernetes.io\/ingress.class: alb\n    alb.ingress.kubernetes.io\/group.name: prod-ing\n    alb.ingress.kubernetes.io\/group.order: \"20\"\nspec:\n  rules:\n  - host: ops.example.com\n    http:\n      paths:\n      - path: \/metrics\n        pathType: Prefix\n        backend:\n          service:\n            name: metrics\n            port:\n              number: 9090\n      - path: \/dash\n        pathType: Prefix\n        backend:\n          service:\n            name: grafana\n            port:\n              number: 3000\n<\/code><\/span><\/pre>\n\n\n<p><strong>What happens:<\/strong> the controller <strong>merges<\/strong> these Ingresses (different namespaces) under <strong>one ALB<\/strong>, installing rules in <strong>priority order<\/strong> (<code>1<\/code>, then <code>10<\/code>, then <code>20<\/code>). Lower order wins on conflicts and is evaluated first. (<a href=\"https:\/\/aws.amazon.com\/blogs\/containers\/a-deeper-look-at-ingress-sharing-and-target-group-binding-in-aws-load-balancer-controller\/?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Amazon Web Services, Inc.<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Rule ordering &amp; conflicts (gotchas)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Lower <code>group.order<\/code> = evaluated first<\/strong>. Default (unset) is <code>0<\/code>. Give each Ingress in a group a <strong>unique<\/strong> order to avoid surprises. (<a href=\"https:\/\/aws.amazon.com\/blogs\/containers\/a-deeper-look-at-ingress-sharing-and-target-group-binding-in-aws-load-balancer-controller\/?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Amazon Web Services, Inc.<\/a>)<\/li>\n\n\n\n<li>If two Ingresses define overlapping matches, the one with a <strong>lower order<\/strong> takes precedence. Wildcards (like <code>\/*<\/code>) should have <strong>higher<\/strong> order so they\u2019re evaluated <strong>later<\/strong>. (<a href=\"https:\/\/gitlab.com\/gitlab-org\/charts\/gitlab\/-\/issues\/2731?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">about.gitlab.com<\/a>)<\/li>\n\n\n\n<li>If you don\u2019t set <code>group.order<\/code>, the controller falls back to <strong>lexical namespace\/name<\/strong> ordering\u2014usually not what you want in prod. Set it explicitly. (<a href=\"https:\/\/aws.amazon.com\/blogs\/containers\/a-deeper-look-at-ingress-sharing-and-target-group-binding-in-aws-load-balancer-controller\/?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Amazon Web Services, Inc.<\/a>)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Cross-namespace &amp; per-ingress annotations<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Cross-namespace sharing is <strong>fully supported<\/strong>; keep each Ingress with the Service it fronts for clarity. (<a href=\"https:\/\/medium.com\/%40philipdam8\/using-a-single-alb-ingress-across-multiple-kubernetes-namespaces-556df9b51f80?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Medium<\/a>)<\/li>\n\n\n\n<li><strong>Most annotations<\/strong> (timeouts, health checks, stickiness, etc.) <strong>apply only to the paths on that Ingress<\/strong>, not the entire ALB. This is why different teams can tune behavior for their own routes while sharing the ALB. (<a href=\"https:\/\/docs.aws.amazon.com\/ja_jp\/eks\/latest\/userguide\/alb-ingress.html?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">AWS Documentation<\/a>)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Operational best practices<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Define the trust boundary<\/strong><br>Restrict who can set <code>group.name<\/code> to your shared value; treat it like a <strong>shared infrastructure resource<\/strong>. Consider admission controls or a centralized Helm chart to prevent accidental conflicts. (<a href=\"https:\/\/kubernetes-sigs.github.io\/aws-load-balancer-controller\/latest\/guide\/ingress\/annotations\/?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">kubernetes-sigs.github.io<\/a>)<\/li>\n\n\n\n<li><strong>Pin global ALB attributes once<\/strong><br>Listener ports (<code>listen-ports<\/code>), <code>scheme<\/code>, <code>target-type<\/code>, and base SSL policy should be aligned across the group. Keep a tiny \u201canchor\u201d Ingress to standardize them. (<a href=\"https:\/\/docs.aws.amazon.com\/ja_jp\/eks\/latest\/userguide\/alb-ingress.html?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">AWS Documentation<\/a>)<\/li>\n\n\n\n<li><strong>Always set <code>group.order<\/code><\/strong><br>Make a simple policy (e.g., <code>1<\/code> for anchor, <code>10\u201399<\/code> for app teams, <code>900+<\/code> for catch-alls). Document it. (<a href=\"https:\/\/aws.amazon.com\/blogs\/containers\/a-deeper-look-at-ingress-sharing-and-target-group-binding-in-aws-load-balancer-controller\/?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Amazon Web Services, Inc.<\/a>)<\/li>\n\n\n\n<li><strong>Certificates &amp; hostnames<\/strong><br>Use an <strong>ACM certificate<\/strong> covering all hosts (SANs or wildcard). If you terminate TLS on the ALB, put the cert on the shared ALB and keep TLS secrets consistent. (<a href=\"https:\/\/docs.aws.amazon.com\/ja_jp\/eks\/latest\/userguide\/alb-ingress.html?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">AWS Documentation<\/a>)<\/li>\n\n\n\n<li><strong>Health checks per path<\/strong><br>Each Ingress can set its own <code>alb.ingress.kubernetes.io\/healthcheck-*<\/code> on its paths\u2014great for heterogeneous backends. (<a href=\"https:\/\/docs.aws.amazon.com\/ja_jp\/eks\/latest\/userguide\/alb-ingress.html?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">AWS Documentation<\/a>)<\/li>\n\n\n\n<li><strong>ExternalDNS (optional)<\/strong><br>Multiple hostnames can map to the <strong>same ALB<\/strong>. Use ExternalDNS records (CNAME\/Alias) for each host. (Pattern often seen in multi-namespace single-ALB setups.) (<a href=\"https:\/\/stackoverflow.com\/questions\/69277420\/eks-ingress-with-single-alb-multiple-namespaces-and-external-dns?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Stack Overflow<\/a>)<\/li>\n\n\n\n<li><strong>Listener ports<\/strong><br>Ensure at least one Ingress (often the anchor) declares <code>listen-ports<\/code> for predictable listeners; some users hit quirks without it. (<a href=\"https:\/\/github.com\/kubernetes-sigs\/aws-load-balancer-controller\/issues\/3395?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">GitHub<\/a>)<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Migration recipe (from many ALBs \u2192 one ALB)<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Pick a <strong>group name<\/strong> (e.g., <code>prod-ing<\/code>) and create the <strong>anchor<\/strong> Ingress with desired <strong>scheme\/listeners\/target-type<\/strong>. (<a href=\"https:\/\/docs.aws.amazon.com\/ja_jp\/eks\/latest\/userguide\/alb-ingress.html?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">AWS Documentation<\/a>)<\/li>\n\n\n\n<li>Update each app\u2019s Ingress: add <code>group.name: prod-ing<\/code> and a unique <code>group.order<\/code>.<\/li>\n\n\n\n<li>Validate merged rules in the ALB console (hosts, paths, priorities).<\/li>\n\n\n\n<li>Flip DNS (if needed) to the shared ALB; remove old per-app ALBs.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Quick test plan<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>curl -I https:\/\/api.example.com\/vehicle\/healthz<\/code> \u2192 expect 200 from <code>apps\/vehicle<\/code>.<\/li>\n\n\n\n<li><code>curl -I https:\/\/ops.example.com\/metrics\/<\/code> \u2192 expect 200 from <code>ops\/metrics<\/code>.<\/li>\n\n\n\n<li>Temporarily add a catch-all Ingress with higher order (<code>900<\/code>) and confirm it <strong>doesn\u2019t<\/strong> shadow specific rules.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">FAQ<\/h2>\n\n\n\n<p><strong>Q: Can different namespaces use different health checks, timeouts, or stickiness?<\/strong><br>A: Yes\u2014set those annotations on each Ingress; they apply to that Ingress\u2019s paths only. (<a href=\"https:\/\/docs.aws.amazon.com\/ja_jp\/eks\/latest\/userguide\/alb-ingress.html?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">AWS Documentation<\/a>)<\/p>\n\n\n\n<p><strong>Q: Can I mix <code>internet-facing<\/code> and <code>internal<\/code> in the same group?<\/strong><br>A: No. Those are <strong>ALB-level attributes<\/strong>; split into separate groups\/ALBs. (<a href=\"https:\/\/docs.aws.amazon.com\/ja_jp\/eks\/latest\/userguide\/alb-ingress.html?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">AWS Documentation<\/a>)<\/p>\n\n\n\n<p><strong>Q: Who wins if two teams define the same host+path?<\/strong><br>A: The Ingress with the <strong>lower <code>group.order<\/code><\/strong> wins (evaluated first). Coordinate orders to avoid accidental overrides. (<a href=\"https:\/\/aws.amazon.com\/blogs\/containers\/a-deeper-look-at-ingress-sharing-and-target-group-binding-in-aws-load-balancer-controller\/?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Amazon Web Services, Inc.<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><\/h2>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>What is an IngressGroup (and why it matters) IngressGroup lets you share a single ALB across multiple Ingress objects (even across different namespaces). The controller merges all rules from Ingresses&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[11138],"tags":[],"class_list":["post-54053","post","type-post","status-publish","format-standard","hentry","category-best-tools"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/54053","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=54053"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/54053\/revisions"}],"predecessor-version":[{"id":54054,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/54053\/revisions\/54054"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=54053"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=54053"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=54053"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}