{"id":1213,"date":"2023-01-02T14:34:50","date_gmt":"2023-01-02T11:34:50","guid":{"rendered":"https:\/\/www.bandidor.info\/wp\/?p=1213"},"modified":"2023-01-02T22:46:15","modified_gmt":"2023-01-02T19:46:15","slug":"camunda-8-on-k0s-the-zero-friction-kubernetes","status":"publish","type":"post","link":"https:\/\/www.bandidor.info\/wp\/?p=1213","title":{"rendered":"Camunda 8 on k0s &#8211; the zero friction Kubernetes"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">What&#8217;s this all about?<\/h2>\n\n\n\n<p>The goal is to migrate the process automation project (see my previous article <a href=\"https:\/\/www.bandidor.info\/wp\/?p=1144\" title=\"Docker, Kubernetes, and Co. \u2013 part II\">Docker, Kubernetes, and Co. \u2013 part II<\/a>) to the new Camunda flagship &#8211; Camunda 8. I&#8217;ll skip k0s installation entirely; it&#8217;s already up and running on my local machine. For details, see <a href=\"https:\/\/docs.k0sproject.io\/\">https:\/\/docs.k0sproject.io\/<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Let&#8217;s get it running<\/h2>\n\n\n\n<p>Here is the documentation: <a href=\"https:\/\/docs.camunda.io\/docs\/self-managed\/about-self-managed\/\">https:\/\/docs.camunda.io\/docs\/self-managed\/about-self-managed\/<\/a>. Following the documentation, I&#8217;ll install Camunda 8 Helm chart and see if it works just out of the box.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">First caveat encountered &#8211; repository name already in use<\/h3>\n\n\n\n<p>Obviously, my fault; after I&#8217;d done some work with Camunda 7, I already had the respective repository in my Helm repository list, so I had to give it a different name &#8211; c8:<\/p>\n\n\n\n<p><code>helm repo add c8 https:\/\/helm.camunda.io<\/code><\/p>\n\n\n\n<p>Now my repository list looks like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>olegme@master-node:~$ helm repo list\nNAME                           \tURL                                                                         \nnfs-subdir-external-provisioner\thttps:\/\/kubernetes-sigs.github.io\/nfs-subdir-external-provisioner\/          \npostgres-operator-charts       \thttps:\/\/opensource.zalando.com\/postgres-op...   \npostgres-operator-ui-charts    \thttps:\/\/opensource.zalando.com\/postgres-op...\ncamunda                        \thttps:\/\/helm.camunda.cloud                                                  \nc8                             \thttps:\/\/helm.camunda.io    <\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Second caveat encountered &#8211; it takes time<\/h3>\n\n\n\n<p>Following the documentation from Camunda, I used the nice &#8211;atomic feature of Helm, but after several attempts realized that on my machine, it doesn&#8217;t finish on time and gets removed, so this is the command that worked at the end:<\/p>\n\n\n\n<p><code> helm install c8 --atomic --timeout 20m0s --debug c8\/camunda-platform -n c8<\/code><\/p>\n\n\n\n<p>The above command sets the timeout to 20 minutes and the namespace to c8. After that &#8211; happiness:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>NAME                                READY   STATUS    RESTARTS       AGE\nc8-identity-54c6559c86-b6m96        1\/1     Running   0              107m\nc8-keycloak-0                       1\/1     Running   0              107m\nc8-operate-846bdf577b-vqm86         1\/1     Running   1 (104m ago)   107m\nc8-optimize-745bc47ff6-85pxc        1\/1     Running   0              107m\nc8-postgresql-0                     1\/1     Running   1 (35m ago)    107m\nc8-tasklist-6bc5cc4c44-n864z        1\/1     Running   1 (104m ago)   107m\nc8-zeebe-0                          1\/1     Running   0              107m\nc8-zeebe-gateway-86885f7fcb-8ptqf   1\/1     Running   0              107m\nelasticsearch-master-0              1\/1     Running   0              107m<\/code><\/pre>\n\n\n\n<p>A critical message &#8211; the Helm chart does not control physical volumes and physical volume claims, so they have to be manually removed every time before re-deployment. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What&#8217;s next?<\/h2>\n\n\n\n<p>Accordingly to the documentation (and to the installation script&#8217;s lengthy output), now it&#8217;s time to run several <code>kubectl port-forward<\/code> commands to make the components of the installation accessible from the outside of our k0s Cloud. But I don&#8217;t like the idea, so &#8211; let&#8217;s get cracking!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Let&#8217;s customize the chart<\/h2>\n\n\n\n<p>The way to customize a help chart is simple; we pass an additional manifest file to the Helm install command, like here:<\/p>\n\n\n\n<p><code>helm install c8 c8\/camunda-platform -n c8 -f manifests\/values_c8_small.yaml<\/code><\/p>\n\n\n\n<p>Now comes the funny part: What do we put into this file? The first idea would be to reduce the amount of resources to allocate. It will help the deployment time and also eliminate possible deployment failures in case of resource shortage, like too weak local hardware.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Make it smaller<\/h3>\n\n\n\n<p>Two ideas here, let&#8217;s have fewer zeebe engines and let&#8217;s reduce our elasticsearch instance.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>zeebe:\n  clusterSize: 1\n  partitionCount: 1\n  replicationFactor: 1\n  pvcSize: 10Gi<\/code><\/pre>\n\n\n\n<p>Here we reduce the cluster size to just one zeebe instance.<\/p>\n\n\n\n<p>And the smaller elasticsearch instance:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  # Allocate smaller chunks of memory per pod.\n  resources:\n    requests:\n      cpu: \"100m\"\n      memory: \"512M\"\n    limits:\n      cpu: \"1000m\"\n      memory: \"512M\"\n\n  # Request smaller persistent volumes.\n  volumeClaimTemplate:\n    accessModes: &#91; \"ReadWriteOnce\" ]\n    storageClassName: \"nfs-client\"\n    resources:\n      requests:\n        storage: 15Gi<\/code><\/pre>\n\n\n\n<p>Please note that the complete resource file will be posted below.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Port forward, Ingres, load balancer&#8230; WTF?<\/h3>\n\n\n\n<p>When the helm deployment finishes, it will suggest using a number of <code>kubectl port-forward<\/code> commands to access your Camunda 8 installation. I didn&#8217;t like it and decided to look for a better solution. I played around using separate IP addresses for different PODs that need a connection to the outside world but dropped the idea as I found it too complicated. Finally, I decided to go with what is described here <a href=\"https:\/\/docs.camunda.io\/docs\/self-managed\/platform-deployment\/helm-kubernetes\/guides\/ingress-setup\/#separated-ingress-setup\" title=\"\">https:\/\/docs.camunda.io\/docs\/self-managed\/platform-deployment\/helm-kubernetes\/guides\/ingress-setup\/#separated-ingress-setup<\/a> as a Separated Ingress Setup.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ingress setup<\/h3>\n\n\n\n<p>There is one <strong>pre-condition<\/strong>, an ingress controller has to be already installed in our Kubernetes cluster. Then the necessary configuration will be applied automatically during the installation process of other components. Here is a link to learn more about an NGINX-based ingress controller: <a href=\"https:\/\/www.nginx.com\/products\/nginx-ingress-controller\/\" title=\"\">https:\/\/www.nginx.com\/products\/nginx-ingress-controller\/<\/a>. There are other implementations out there, but this is the simplest one.<\/p>\n\n\n\n<p>When everything is deployed, there will be a server (NGINX) listening on the external IP address of our cluster master-node, which will forward incoming connections to the respective PODs depending on the URL.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Cheating on the DNS resolution<\/h3>\n\n\n\n<p>To enable the above, the simplest way on my local <s>laptop<\/s> machine is to manipulate the DNS resolution to create a few DNS records pointing to the same IP address. Namely, the one of my master-node (controller). In my particular case, I decided to edit my <code>hosts<\/code> file located in <code>C:\\Windows\\System32\\drivers\\etc<\/code>. I added a few more records to it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>192.168.2.241 camunda-example \n192.168.2.241 identity.camunda-example\n192.168.2.241 keycloak.camunda-example\n192.168.2.241 operate.camunda-example\n192.168.2.241 optimize.camunda-example\n192.168.2.241 tasklist.camunda-example\n192.168.2.241 zeebe.camunda-example<\/code><\/pre>\n\n\n\n<p>192.168.2.241 is the IP address of my master-node (controller), and these hostnames can actually be anything; they just need to match the configuration in the helm chart used to deploy Camunda 8. BTW, a reboot is not required after the changes to <code>hosts file; they<\/code> will be picked up automatically by almost everything.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Almost there&#8230;<\/h3>\n\n\n\n<p>And, finally, the chart. The one we will be used to modify the default values. <\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: yaml; gutter: false; title: ; notranslate\" title=\"\">\nglobal:\n  identity:\n    auth:\n      publicIssuerUrl: &quot;http:\/\/keycloak.camunda-example\/auth\/realms\/camunda-platform&quot;\n      operate:\n        redirectUrl: &quot;http:\/\/operate.camunda-example&quot;\n      tasklist:\n        redirectUrl: &quot;http:\/\/tasklist.camunda-example&quot;\n      optimize:\n        redirectUrl: &quot;http:\/\/optimize.camunda-example&quot;\n\nidentity:\n  ingress:\n    enabled: true\n    className: nginx\n    host: &quot;identity.camunda-example&quot;\n  fullURL: &quot;http:\/\/identity.camunda-example&quot;\n  \n  keycloak:\n    ingress:\n      enabled: true\n      ingressClassName: nginx\n      hostname: &quot;keycloak.camunda-example&quot;  \n\noperate:\n  ingress:\n    enabled: true\n    className: nginx\n    host: &quot;operate.camunda-example&quot;\n\noptimize:\n  ingress:\n    enabled: true\n    className: nginx\n    host: &quot;optimize.camunda-example&quot;\n\ntasklist:\n  ingress:\n    enabled: true\n    className: nginx\n    host: &quot;tasklist.camunda-example&quot;\n\n# Reduce for Zeebe and Gateway the configured replicas and with that the required resources\n# to get it running locally\nzeebe:\n  clusterSize: 1\n  partitionCount: 1\n  replicationFactor: 1\n  pvcSize: 10Gi\n\nzeebe-gateway:\n  replicas: 1\n  ingress:\n    enabled: true\n    className: nginx\n    host: &quot;zeebe.camunda-example&quot;\n\n# Configure elastic search to make it running for local development\nelasticsearch:\n  replicas: 1\n  minimumMasterNodes: 1\n  # Allow no backup for single node setups\n  clusterHealthCheckParams: &quot;wait_for_status=yellow&amp;timeout=1s&quot;\n\n  # Allocate smaller chunks of memory per pod.\n  resources:\n    requests:\n      cpu: &quot;100m&quot;\n      memory: &quot;512M&quot;\n    limits:\n      cpu: &quot;1000m&quot;\n      memory: &quot;512M&quot;\n\n  # Request smaller persistent volumes.\n  volumeClaimTemplate:\n    accessModes: &#x5B; &quot;ReadWriteOnce&quot; ]\n    storageClassName: &quot;nfs-client&quot;\n    resources:\n      requests:\n        storage: 15Gi\n<\/pre><\/div>\n\n\n<p>What does it do? It configures the ingress controller to provide access to different PODs under different URLs. And this is it.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Access our new shiny Camunda cluster<\/h3>\n\n\n\n<p>This is easy. After we run <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>helm install c8 c8\/camunda-platform -n c8 -f manifests\/values_c8_small.ya<\/code>ml<\/code><\/pre>\n\n\n\n<p>and wait some <s>5<\/s> 10 minutes, we can see all PODs up and running:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>olegme@master-node:~$ kubectl get pods -n c8 -o=custom-columns='NAME:metadata.name,STATUS:.status.phase,IP:.status.podIP,NODE:.spec.nodeName'\nNAME                                STATUS    IP             NODE\nc8-identity-54c6559c86-b6m96        Running   10.244.2.25    slave-node2\nc8-keycloak-0                       Running   10.244.2.26    slave-node2\nc8-operate-846bdf577b-vqm86         Running   10.244.0.215   slave-node3\nc8-optimize-745bc47ff6-85pxc        Running   10.244.0.214   slave-node3\nc8-postgresql-0                     Running   10.244.1.36    slave-node1\nc8-tasklist-6bc5cc4c44-n864z        Running   10.244.3.20    slave-node4\nc8-zeebe-0                          Running   10.244.2.27    slave-node2\nc8-zeebe-gateway-86885f7fcb-8ptqf   Running   10.244.1.34    slave-node1\nelasticsearch-master-0              Running   10.244.1.35    slave-node1\n<\/code><\/pre>\n\n\n\n<p>Actually, the one which takes the longest time is Keycloack. It needs PostgreSQL, which takes time and, in some rare cases, fails to be installed properly. Still, I saw just one reason for failure &#8211; not properly discarding PVC and the respective volumes. <\/p>\n\n\n\n<p>And here is the respective ingress configuration:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>olegme@master-node:~$ kubectl get ing -n c8\nNAME               CLASS   HOSTS                      ADDRESS         PORTS   AGE\nc8-identity        nginx   identity.camunda-example   192.168.2.241   80      3h50m\nc8-keycloak        nginx   keycloak.camunda-example   192.168.2.241   80      3h50m\nc8-operate         nginx   operate.camunda-example    192.168.2.241   80      3h50m\nc8-optimize        nginx   optimize.camunda-example   192.168.2.241   80      3h50m\nc8-tasklist        nginx   tasklist.camunda-example   192.168.2.241   80      3h50m\nc8-zeebe-gateway   nginx   zeebe.camunda-example      192.168.2.241   80      3h50m\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Let&#8217;s use it&#8230;<\/h3>\n\n\n\n<p>Actually, we won&#8217;t be using it for real just yet; let&#8217;s leave it to the following article. Here we provide just some screenshots. As we kept the demo\/demo user on our helm chart, we can use it at the beginning.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Operate<\/h4>\n\n\n\n<p>Obviously, we go to <a href=\"http:\/\/operate.camunda-example\" title=\"\">http:\/\/operate.camunda-example<\/a><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2022\/12\/grafik.png\"><img loading=\"lazy\" decoding=\"async\" width=\"979\" height=\"677\" src=\"https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2022\/12\/grafik.png\" alt=\"\" class=\"wp-image-1271\" srcset=\"https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2022\/12\/grafik.png 979w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2022\/12\/grafik-300x207.png 300w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2022\/12\/grafik-768x531.png 768w\" sizes=\"auto, (max-width: 979px) 100vw, 979px\" \/><\/a><\/figure>\n<\/div>\n\n\n<h4 class=\"wp-block-heading\">Optimize<\/h4>\n\n\n\n<p>Similarly: <a href=\"http:\/\/optimize.camunda-example\">http:\/\/optimize.camunda-example<\/a>. Well, that&#8217;s boring&#8230;<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2022\/12\/grafik-3.png\"><img loading=\"lazy\" decoding=\"async\" width=\"981\" height=\"675\" src=\"https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2022\/12\/grafik-3.png\" alt=\"\" class=\"wp-image-1275\" srcset=\"https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2022\/12\/grafik-3.png 981w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2022\/12\/grafik-3-300x206.png 300w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2022\/12\/grafik-3-768x528.png 768w\" sizes=\"auto, (max-width: 981px) 100vw, 981px\" \/><\/a><\/figure>\n<\/div>\n\n\n<h4 class=\"wp-block-heading\">Identity<\/h4>\n\n\n\n<p>Same as before: <a href=\"http:\/\/identity.camunda-example\" title=\"\">http:\/\/identity.camunda-example<\/a><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2022\/12\/grafik-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"979\" height=\"345\" src=\"https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2022\/12\/grafik-1.png\" alt=\"\" class=\"wp-image-1272\" srcset=\"https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2022\/12\/grafik-1.png 979w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2022\/12\/grafik-1-300x106.png 300w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2022\/12\/grafik-1-768x271.png 768w\" sizes=\"auto, (max-width: 979px) 100vw, 979px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>Note an additional user I created just for fun. Still, it had to be created using the keycloack administrative UI. Camunda 8 Identity application cannot do it yet.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Keycloack admin UI<\/h4>\n\n\n\n<p>Accessible here: http:\/\/keycloak.camunda-example\/. Admin credentials are created automatically; the user name is admin, the password is random and must be retrieved from the keycloack POD environment variables. <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2022\/12\/grafik-2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"981\" height=\"677\" src=\"https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2022\/12\/grafik-2.png\" alt=\"\" class=\"wp-image-1273\" srcset=\"https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2022\/12\/grafik-2.png 981w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2022\/12\/grafik-2-300x207.png 300w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2022\/12\/grafik-2-768x530.png 768w\" sizes=\"auto, (max-width: 981px) 100vw, 981px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Some useful commands<\/h3>\n\n\n\n<p>Install chart:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>helm install c8 c8\/camunda-platform -n c8 -f manifests\/values_c8_small.yaml<\/code><\/pre>\n\n\n\n<p>Uninstall:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>helm uninstall c8  -n c8<\/code><\/pre>\n\n\n\n<p>Delete the respective Persistent Volume Claims that are not getting deleted automatically:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl delete pvc --all -n c8<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Discussion<\/h2>\n\n\n\n<p>We got it up and running; that&#8217;s it. Let&#8217;s proceed to the next part &#8211; make use of it. Here you go &#8211; <a href=\"https:\/\/www.bandidor.info\/wp\/?p=1277\" title=\"Make use of my local Camunda 8 cluster\">Make use of my local Camunda 8 cluster<\/a><\/p>\n\n\n\n<p>One last thing to note &#8211; we are doing all this in a local environment, which is not accessible from the outside of the local network. All used IPs are non-routable\/private IPs per RFC 1918, and that&#8217;s why I haven&#8217;t paid any attention to the security of my setup.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>What&#8217;s this all about? The goal is to migrate the process automation project (see my previous article Docker, Kubernetes, and Co. \u2013 part II) to the new Camunda flagship &#8211; Camunda 8. I&#8217;ll skip k0s installation entirely; it&#8217;s already up and running on my local machine. For details, see https:\/\/docs.k0sproject.io\/ Let&#8217;s get it running Here&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[43,34,55,39],"tags":[35],"class_list":["post-1213","post","type-post","status-publish","format-standard","hentry","category-bpmn","category-camunda","category-camunda-8","category-kubernetes","tag-camunda"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p2EszU-jz","_links":{"self":[{"href":"https:\/\/www.bandidor.info\/wp\/index.php?rest_route=\/wp\/v2\/posts\/1213","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bandidor.info\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bandidor.info\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bandidor.info\/wp\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bandidor.info\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1213"}],"version-history":[{"count":23,"href":"https:\/\/www.bandidor.info\/wp\/index.php?rest_route=\/wp\/v2\/posts\/1213\/revisions"}],"predecessor-version":[{"id":1313,"href":"https:\/\/www.bandidor.info\/wp\/index.php?rest_route=\/wp\/v2\/posts\/1213\/revisions\/1313"}],"wp:attachment":[{"href":"https:\/\/www.bandidor.info\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1213"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bandidor.info\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1213"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bandidor.info\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1213"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}