{"id":4335,"date":"2018-12-31T14:14:24","date_gmt":"2018-12-31T14:14:24","guid":{"rendered":"http:\/\/howk.de\/w1\/blog-introducing-kustomize-template-free-configuration-customization-for-kubernetes\/"},"modified":"2018-12-31T14:14:24","modified_gmt":"2018-12-31T14:14:24","slug":"blog-introducing-kustomize-template-free-configuration-customization-for-kubernetes","status":"publish","type":"post","link":"https:\/\/howk.de\/?p=4335","title":{"rendered":"Blog: Introducing kustomize; Template-free Configuration Customization for Kubernetes"},"content":{"rendered":"<p><strong>Authors:<\/strong> Jeff Regan (Google), Phil Wittrock (Google)<\/p>\n<p>If you run a Kubernetes environment, chances are you\u2019ve<br \/>\ncustomized a Kubernetes configuration \u2014 you&rsquo;ve copied<br \/>\nsome API object YAML files and edited them to suit<br \/>\nyour needs.<\/p>\n<p>But there are drawbacks to this approach \u2014 it can be<br \/>\nhard to go back to the source material and incorporate<br \/>\nany improvements that were made to it. Today Google is<br \/>\nannouncing <a href=\"https:\/\/github.com\/kubernetes-sigs\/kustomize\" target=\"_blank\"><strong>kustomize<\/strong><\/a>, a command-line tool<br \/>\ncontributed as a <a href=\"https:\/\/github.com\/kubernetes\/community\/blob\/master\/keps\/sig-cli\/0008-kustomize.md\" target=\"_blank\">subproject<\/a> of <a href=\"https:\/\/github.com\/kubernetes\/community\/tree\/master\/sig-cli\" target=\"_blank\">SIG-CLI<\/a>.  The tool<br \/>\nprovides a new, purely <em>declarative<\/em> approach to<br \/>\nconfiguration customization that adheres to and<br \/>\nleverages the familiar and carefully designed<br \/>\nKubernetes API.<\/p>\n<p>Here\u2019s a common scenario. Somewhere on the internet you<br \/>\nfind someone\u2019s Kubernetes configuration for a content<br \/>\nmanagement system.  It&rsquo;s a set of files containing YAML<br \/>\nspecifications of Kubernetes API objects. Then, in some<br \/>\ncorner of your own company you find a configuration for<br \/>\na database to back that CMS \u2014 a database you prefer<br \/>\nbecause you know it well.<\/p>\n<p>You want to use these together, somehow. Further, you<br \/>\nwant to customize the files so that your resource<br \/>\ninstances appear in the cluster with a label that<br \/>\ndistinguishes them from a colleague\u2019s resources who\u2019s<br \/>\ndoing the same thing in the same cluster.<br \/>\nYou also want to set appropriate values for CPU, memory<br \/>\nand replica count.<\/p>\n<p>Additionally, you\u2019ll want <em>multiple variants<\/em> of the<br \/>\nentire configuration: a small variant (in terms of<br \/>\ncomputing resources used) devoted to testing and<br \/>\nexperimentation, and a much larger variant devoted to<br \/>\nserving outside users in production. Likewise, other<br \/>\nteams will want their own variants.<\/p>\n<p>This raises all sorts of questions.  Do you copy your<br \/>\nconfiguration to multiple locations and edit them<br \/>\nindependently? What if you have dozens of development<br \/>\nteams who need slightly different variations of the<br \/>\nstack? How do you maintain and upgrade the aspects of<br \/>\nconfiguration that they share in common?  Workflows<br \/>\nusing <strong>kustomize<\/strong> provide answers to these questions.<\/p>\n<h2 id=\"customization-is-reuse\">Customization is reuse<\/h2>\n<p>Kubernetes configurations aren&rsquo;t code (being YAML<br \/>\nspecifications of API objects, they are more strictly<br \/>\nviewed as data), but configuration lifecycle has many<br \/>\nsimilarities to code lifecycle.<\/p>\n<p>You should keep configurations in version<br \/>\ncontrol. Configuration owners aren\u2019t necessarily the<br \/>\nsame set of people as configuration<br \/>\nusers. Configurations may be used as parts of a larger<br \/>\nwhole. Users will want to <em>reuse<\/em> configurations for<br \/>\ndifferent purposes.<\/p>\n<p>One approach to configuration reuse, as with code<br \/>\nreuse, is to simply copy it all and customize the<br \/>\ncopy. As with code, severing the connection to the<br \/>\nsource material makes it difficult to benefit from<br \/>\nongoing improvements to the source material. Taking<br \/>\nthis approach with many teams or environments, each<br \/>\nwith their own variants of a configuration, makes a<br \/>\nsimple upgrade intractable.<\/p>\n<p>Another approach to reuse is to express the source<br \/>\nmaterial as a parameterized template.  A tool processes<br \/>\nthe template\u2014executing any embedded scripting and<br \/>\nreplacing parameters with desired values\u2014to generate<br \/>\nthe configuration. Reuse comes from using different<br \/>\nsets of values with the same template. The challenge<br \/>\nhere is that the templates and value files are not<br \/>\nspecifications of Kubernetes API resources. They are,<br \/>\nnecessarily, a new thing, a new language, that wraps<br \/>\nthe Kubernetes API. And yes, they can be powerful, but<br \/>\nbring with them learning and tooling costs. Different<br \/>\nteams want different changes\u2014so almost every<br \/>\nspecification that you can include in a YAML file<br \/>\nbecomes a parameter that needs a value. As a result,<br \/>\nthe value sets get large, since all parameters (that<br \/>\ndon&rsquo;t have trusted defaults) must be specified for<br \/>\nreplacement. This defeats one of the goals of<br \/>\nreuse\u2014keeping the differences between the variants<br \/>\nsmall in size and easy to understand in the absence of<br \/>\na full resource declaration.<\/p>\n<h2 id=\"a-new-option-for-configuration-customization\">A new option for configuration customization<\/h2>\n<p>Compare that to <strong>kustomize<\/strong>, where the tool\u2019s<br \/>\nbehavior is determined by declarative specifications<br \/>\nexpressed in a file called <code>kustomization.yaml<\/code>.<\/p>\n<p>The <strong>kustomize<\/strong> program reads the file and the<br \/>\nKubernetes API resource files it references, then emits<br \/>\ncomplete resources to standard output. This text output<br \/>\ncan be further processed by other tools, or streamed<br \/>\ndirectly to <strong>kubectl<\/strong> for application to a cluster.<\/p>\n<p>For example, if a file called <code>kustomization.yaml<\/code><br \/>\ncontaining<\/p>\n<pre><code>   commonLabels:\n     app: hello\n   resources:\n   - deployment.yaml\n   - configMap.yaml\n   - service.yaml\n<\/code><\/pre>\n<p>is in the current working directory, along with<br \/>\nthe three resource files it mentions, then running<\/p>\n<pre><code>kustomize build\n<\/code><\/pre>\n<p>emits a YAML stream that includes the three given<br \/>\nresources, and adds a common label <code>app: hello<\/code> to<br \/>\neach resource.<\/p>\n<p>Similarly, you can use a <em>commonAnnotations<\/em> field to<br \/>\nadd an annotation to all resources, and a <em>namePrefix<\/em><br \/>\nfield to add a common prefix to all resource<br \/>\nnames. This trivial yet common customization is just<br \/>\nthe beginning.<\/p>\n<p>A more common use case is that you\u2019ll need multiple<br \/>\nvariants of a common set of resources, e.g., a<br \/>\n<em>development<\/em>, <em>staging<\/em> and <em>production<\/em> variant.<\/p>\n<p>For this purpose, <strong>kustomize<\/strong> supports the idea of an<br \/>\n<em>overlay<\/em> and a <em>base<\/em>. Both are represented by a<br \/>\nkustomization file. The base declares things that the<br \/>\nvariants share in common (both resources and a common<br \/>\ncustomization of those resources), and the overlays<br \/>\ndeclare the differences.<\/p>\n<p>Here\u2019s a file system layout to manage a <em>staging<\/em> and<br \/>\n<em>production<\/em> variant of a given cluster app:<\/p>\n<pre><code>   someapp\/\n   \u251c\u2500\u2500 base\/\n   \u2502   \u251c\u2500\u2500 kustomization.yaml\n   \u2502   \u251c\u2500\u2500 deployment.yaml\n   \u2502   \u251c\u2500\u2500 configMap.yaml\n   \u2502   \u2514\u2500\u2500 service.yaml\n   \u2514\u2500\u2500 overlays\/\n      \u251c\u2500\u2500 production\/\n      \u2502   \u2514\u2500\u2500 kustomization.yaml\n      \u2502   \u251c\u2500\u2500 replica_count.yaml\n      \u2514\u2500\u2500 staging\/\n          \u251c\u2500\u2500 kustomization.yaml\n          \u2514\u2500\u2500 cpu_count.yaml\n<\/code><\/pre>\n<p>The file <code>someapp\/base\/kustomization.yaml<\/code> specifies the<br \/>\ncommon resources and common customizations to those<br \/>\nresources (e.g., they all get some label, name prefix<br \/>\nand annotation).<\/p>\n<p>The contents of<br \/>\n<code>someapp\/overlays\/production\/kustomization.yaml<\/code> could<br \/>\nbe<\/p>\n<pre><code>   commonLabels:\n    env: production\n   bases:\n   - ..\/..\/base\n   patches:\n   - replica_count.yaml\n<\/code><\/pre>\n<p>This kustomization specifies a <em>patch<\/em> file<br \/>\n<code>replica_count.yaml<\/code>, which could be:<\/p>\n<pre><code>   apiVersion: apps\/v1\n   kind: Deployment\n   metadata:\n     name: the-deployment\n   spec:\n     replicas: 100\n<\/code><\/pre>\n<p>A patch is a partial resource declaration, in this case<br \/>\na patch of the deployment in<br \/>\n<code>someapp\/base\/deployment.yaml<\/code>, modifying only the<br \/>\n<em>replicas<\/em> count to handle production traffic.<\/p>\n<p>The patch, being a partial deployment spec, has a clear<br \/>\ncontext and purpose and can be validated even if it\u2019s<br \/>\nread in isolation from the remaining<br \/>\nconfiguration. It\u2019s not just a context free <em>{parameter<br \/>\nname, value}<\/em> tuple.<\/p>\n<p>To create the resources for the production variant, run<\/p>\n<pre><code>kustomize build someapp\/overlays\/production\n<\/code><\/pre>\n<p>The result is printed to stdout as a set of complete<br \/>\nresources, ready to be applied to a cluster.  A<br \/>\nsimilar command defines the staging environment.<\/p>\n<h2 id=\"in-summary\">In summary<\/h2>\n<p>With <strong>kustomize<\/strong>, you can manage an arbitrary number<br \/>\nof distinctly customized Kubernetes configurations<br \/>\nusing only Kubernetes API resource files. Every<br \/>\nartifact that <strong>kustomize<\/strong> uses is plain YAML and can<br \/>\nbe validated and processed as such.  kustomize encourages<br \/>\na fork\/modify\/rebase <a href=\"https:\/\/github.com\/kubernetes-sigs\/kustomize\/blob\/master\/docs\/workflows.md\" target=\"_blank\">workflow<\/a>.<\/p>\n<p>To get started, try the <a href=\"https:\/\/github.com\/kubernetes-sigs\/kustomize\/blob\/master\/examples\/helloWorld\" target=\"_blank\">hello world<\/a> example.<br \/>\nFor discussion and feedback, join the <a href=\"https:\/\/groups.google.com\/forum\/#!forum\/kustomize\" target=\"_blank\">mailing list<\/a> or<br \/>\n<a href=\"https:\/\/github.com\/kubernetes-sigs\/kustomize\/issues\/new\" target=\"_blank\">open an issue<\/a>.  Pull requests are welcome.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Authors: Jeff Regan (Google), Phil Wittrock (Google) If you run a Kubernetes environment, chances are you\u2019ve customized a Kubernetes configuration \u2014 you&rsquo;ve copied some API object YAML files and edited them to suit your needs. But there are drawbacks to this approach \u2014 it can be hard to go back to the source material and [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.9.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Blog: Introducing kustomize; Template-free Configuration Customization for Kubernetes - Howk IT-Dienstleistungen<\/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:\/\/howk.de\/?p=4335\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Blog: Introducing kustomize; Template-free Configuration Customization for Kubernetes - Howk IT-Dienstleistungen\" \/>\n<meta property=\"og:description\" content=\"Authors: Jeff Regan (Google), Phil Wittrock (Google) If you run a Kubernetes environment, chances are you\u2019ve customized a Kubernetes configuration \u2014 you&rsquo;ve copied some API object YAML files and edited them to suit your needs. But there are drawbacks to this approach \u2014 it can be hard to go back to the source material and [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/howk.de\/?p=4335\" \/>\n<meta property=\"og:site_name\" content=\"Howk IT-Dienstleistungen\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/howk.de\" \/>\n<meta property=\"article:published_time\" content=\"2018-12-31T14:14:24+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/howk.de\/?p=4335#article\",\"isPartOf\":{\"@id\":\"https:\/\/howk.de\/?p=4335\"},\"author\":{\"name\":\"admin\",\"@id\":\"https:\/\/howk.de\/#\/schema\/person\/b029bd02d4f35dce869ef54c81a100c5\"},\"headline\":\"Blog: Introducing kustomize; Template-free Configuration Customization for Kubernetes\",\"datePublished\":\"2018-12-31T14:14:24+00:00\",\"dateModified\":\"2018-12-31T14:14:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/howk.de\/?p=4335\"},\"wordCount\":1063,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/howk.de\/#organization\"},\"articleSection\":[\"Hi Tech\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/howk.de\/?p=4335#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/howk.de\/?p=4335\",\"url\":\"https:\/\/howk.de\/?p=4335\",\"name\":\"Blog: Introducing kustomize; Template-free Configuration Customization for Kubernetes - Howk IT-Dienstleistungen\",\"isPartOf\":{\"@id\":\"https:\/\/howk.de\/#website\"},\"datePublished\":\"2018-12-31T14:14:24+00:00\",\"dateModified\":\"2018-12-31T14:14:24+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/howk.de\/?p=4335#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/howk.de\/?p=4335\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/howk.de\/?p=4335#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/howk.de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog: Introducing kustomize; Template-free Configuration Customization for Kubernetes\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/howk.de\/#website\",\"url\":\"https:\/\/howk.de\/\",\"name\":\"Howk IT-Dienstleistungen\",\"description\":\"Howk IT Services - Howk IT-Dienstleistungen\",\"publisher\":{\"@id\":\"https:\/\/howk.de\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/howk.de\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/howk.de\/#organization\",\"name\":\"HowK\",\"url\":\"https:\/\/howk.de\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/howk.de\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/howk.de\/w1\/wp-content\/uploads\/2013\/12\/howk-logo.png\",\"contentUrl\":\"https:\/\/howk.de\/w1\/wp-content\/uploads\/2013\/12\/howk-logo.png\",\"width\":170,\"height\":170,\"caption\":\"HowK\"},\"image\":{\"@id\":\"https:\/\/howk.de\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/howk.de\",\"http:\/\/de.linkedin.com\/in\/howkde\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/howk.de\/#\/schema\/person\/b029bd02d4f35dce869ef54c81a100c5\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/howk.de\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/b5a20f4d07bca1b73f25cff58a1116c4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/b5a20f4d07bca1b73f25cff58a1116c4?s=96&d=mm&r=g\",\"caption\":\"admin\"},\"url\":\"https:\/\/howk.de\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Blog: Introducing kustomize; Template-free Configuration Customization for Kubernetes - Howk IT-Dienstleistungen","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:\/\/howk.de\/?p=4335","og_locale":"en_US","og_type":"article","og_title":"Blog: Introducing kustomize; Template-free Configuration Customization for Kubernetes - Howk IT-Dienstleistungen","og_description":"Authors: Jeff Regan (Google), Phil Wittrock (Google) If you run a Kubernetes environment, chances are you\u2019ve customized a Kubernetes configuration \u2014 you&rsquo;ve copied some API object YAML files and edited them to suit your needs. But there are drawbacks to this approach \u2014 it can be hard to go back to the source material and [&hellip;]","og_url":"https:\/\/howk.de\/?p=4335","og_site_name":"Howk IT-Dienstleistungen","article_publisher":"https:\/\/www.facebook.com\/howk.de","article_published_time":"2018-12-31T14:14:24+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"admin","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/howk.de\/?p=4335#article","isPartOf":{"@id":"https:\/\/howk.de\/?p=4335"},"author":{"name":"admin","@id":"https:\/\/howk.de\/#\/schema\/person\/b029bd02d4f35dce869ef54c81a100c5"},"headline":"Blog: Introducing kustomize; Template-free Configuration Customization for Kubernetes","datePublished":"2018-12-31T14:14:24+00:00","dateModified":"2018-12-31T14:14:24+00:00","mainEntityOfPage":{"@id":"https:\/\/howk.de\/?p=4335"},"wordCount":1063,"commentCount":0,"publisher":{"@id":"https:\/\/howk.de\/#organization"},"articleSection":["Hi Tech"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/howk.de\/?p=4335#respond"]}]},{"@type":"WebPage","@id":"https:\/\/howk.de\/?p=4335","url":"https:\/\/howk.de\/?p=4335","name":"Blog: Introducing kustomize; Template-free Configuration Customization for Kubernetes - Howk IT-Dienstleistungen","isPartOf":{"@id":"https:\/\/howk.de\/#website"},"datePublished":"2018-12-31T14:14:24+00:00","dateModified":"2018-12-31T14:14:24+00:00","breadcrumb":{"@id":"https:\/\/howk.de\/?p=4335#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/howk.de\/?p=4335"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/howk.de\/?p=4335#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/howk.de\/"},{"@type":"ListItem","position":2,"name":"Blog: Introducing kustomize; Template-free Configuration Customization for Kubernetes"}]},{"@type":"WebSite","@id":"https:\/\/howk.de\/#website","url":"https:\/\/howk.de\/","name":"Howk IT-Dienstleistungen","description":"Howk IT Services - Howk IT-Dienstleistungen","publisher":{"@id":"https:\/\/howk.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/howk.de\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/howk.de\/#organization","name":"HowK","url":"https:\/\/howk.de\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/howk.de\/#\/schema\/logo\/image\/","url":"https:\/\/howk.de\/w1\/wp-content\/uploads\/2013\/12\/howk-logo.png","contentUrl":"https:\/\/howk.de\/w1\/wp-content\/uploads\/2013\/12\/howk-logo.png","width":170,"height":170,"caption":"HowK"},"image":{"@id":"https:\/\/howk.de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/howk.de","http:\/\/de.linkedin.com\/in\/howkde"]},{"@type":"Person","@id":"https:\/\/howk.de\/#\/schema\/person\/b029bd02d4f35dce869ef54c81a100c5","name":"admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/howk.de\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/b5a20f4d07bca1b73f25cff58a1116c4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b5a20f4d07bca1b73f25cff58a1116c4?s=96&d=mm&r=g","caption":"admin"},"url":"https:\/\/howk.de\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/howk.de\/index.php?rest_route=\/wp\/v2\/posts\/4335"}],"collection":[{"href":"https:\/\/howk.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/howk.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/howk.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/howk.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4335"}],"version-history":[{"count":0,"href":"https:\/\/howk.de\/index.php?rest_route=\/wp\/v2\/posts\/4335\/revisions"}],"wp:attachment":[{"href":"https:\/\/howk.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4335"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/howk.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4335"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/howk.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4335"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}