{"id":35594,"date":"2019-10-31T22:05:15","date_gmt":"2019-10-31T19:05:15","guid":{"rendered":"https:\/\/prohoster.info\/blog\/gitops-sravnenie-metodov-pull-i-push\/"},"modified":"2019-10-31T22:05:15","modified_gmt":"2019-10-31T19:05:15","slug":"gitops-sravnenie-metodov-pull-i-push","status":"publish","type":"post","link":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/gitops-sravnenie-metodov-pull-i-push","title":{"rendered":"GitOps: Comparison of Pull and Push Methods","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i><b>Note: translation.<\/b>: In the Kubernetes community, a trend known as GitOps is gaining prominent popularity, which we personally witnessed, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/454184\/\">during<\/a><\/noindex> KubeCon Europe 2019. This term was relatively recently <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-operations-by-pull-request\">coined<\/a><\/noindex> by the head of Weaveworks \u2014 Alexis Richardson \u2014 and refers to the application of familiar tools for developers (primarily Git, from which the name derives) to solve operational tasks. Specifically, it concerns managing Kubernetes through storing its configurations in Git and automatically deploying changes to the cluster. Matthias Jg discusses the two approaches to deployment in this article.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"GitOps: Comparison of Pull and Push Methods\" src=\"\/wp-content\/uploads\/2862627cedb4347679d0c14876a24869.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLast year <i>(in fact, this formally occurred in August 2017 \u2014 note from the translator)<\/i> A new approach to deploying applications in Kubernetes has emerged. It's called GitOps, based on the fundamental idea that version tracking of deployments is managed within a secure Git repository.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><b>The main advantages of this approach are as follows<\/b>:<\/p>\n<ol>\n<li> <b>Versioning of deployments and change history<\/b>. The entire cluster state is stored in the Git repository, and deployments are updated only through commits. Additionally, all changes can be tracked via the commit history.<\/li>\n<li> <b>Rollbacks using familiar Git commands<\/b>. Simple <code>git reset<\/code> allows for rolling back changes in deployments; previous states are always accessible.<\/li>\n<li> <b>Ready access control<\/b>. Typically, Git systems contain a lot of sensitive data, so most companies pay special attention to securing it. Consequently, this protection also applies to deployment operations.<\/li>\n<li> <b>Policies for deployments<\/b>. Most Git systems initially support policies for different branches \u2014 for example, only pull requests can update the master, and changes must be reviewed and accepted by another team member. Just like access control, the same policies apply to deployment updates.<\/li>\n<\/ol>\n<p>\nAs you can see, the GitOps method offers numerous advantages. Over the past year, two approaches have gained particular popularity. One is based on push, while the other is based on pull. Before we dive into them, let\u2019s first look at what typical Kubernetes deployments look like.<\/p>\n<h2>Deployment Methods<\/h2>\n<p>\nIn recent years, various methods and tools for deployments have been established in Kubernetes:<\/p>\n<ol>\n<li> <b>Based on native Kubernetes templates\/Kustomize<\/b>This is the simplest way to deploy applications in Kubernetes. The developer creates basic YAML files and applies them. To avoid repeatedly rewriting the same templates, Kustomize was developed (it turns Kubernetes templates into modules). <i><b>Note: translation.<\/b>: Kustomize has been integrated into kubectl since <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/445196\/\">the release of Kubernetes 1.14.<\/a><\/noindex>.<\/i><\/li>\n<li> <b>Helm Charts<\/b>. Helm charts allow creating sets of templates, init containers, sidecars, etc., which provide more flexible configuration options for deploying applications than the template-based approach. This method relies on templated YAML files. Helm fills these with various parameters and then sends them to Tiller \u2014 the cluster component that deploys them in the cluster and allows for updates and rollbacks. Importantly, Helm essentially just inserts the necessary values into the templates and applies them the same way as in the traditional approach. <i>(for more information on how it all works and how to use it, read our <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/423239\/\">Helm article<\/a><\/noindex> - translator's note)<\/i>. There is a wide variety of ready-made Helm charts covering a broad range of tasks.<\/li>\n<li> <b>Alternative Tools<\/b>. There are many alternative tools. What unites them is that they convert certain template files into understandable Kubernetes YAML files and then apply them.<\/li>\n<\/ol>\n<p>\nIn our work, we constantly use Helm charts for important tools (as much of it is pre-configured, which significantly simplifies life) and 'clean' Kubernetes YAML files for deploying our own applications.<\/p>\n<h2>Pull &amp; Push<\/h2>\n<p>\nIn one of my recent blog posts, I introduced a tool <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/weaveworks\/flux\">Weave Flux<\/a><\/noindex>, allowing templates to be committed to the Git repository and updating deployments after each commit or container push. My experience shows that this tool is one of the key elements in promoting the pull approach, so I will refer to it often. If you want to learn more about how to use it, here is <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@m.k.joerg\/gitops-weave-flux-in-detail-77ce36945646\">a link to the article<\/a><\/noindex>.<\/p>\n<p><i><b>NB!<\/b> All the benefits of using GitOps remain for both approaches.<\/i><\/p>\n<h2>Pull-based approach<\/h2>\n<p>\n<img decoding=\"async\" alt=\"GitOps: Comparison of Pull and Push Methods\" src=\"\/wp-content\/uploads\/4ed8e6de36bc37d0e747ff99027f8399.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nThe pull approach is based on the fact that all changes are applied from inside the cluster. Inside the cluster, there is an operator that regularly checks the associated Git repositories and Docker Registry. If there are any changes, the state of the cluster is updated from within. This process is generally considered quite safe, as no external client has administrator access to the cluster.<\/p>\n<p><b>Pros:<\/b><\/p>\n<ol>\n<li> No external client has the rights to make changes to the cluster; all updates are applied from within.<\/li>\n<li> Some tools also allow for synchronizing updates of Helm charts and linking them to the cluster.<\/li>\n<li> Docker Registry can be scanned for new versions. If a new image appears, the Git repository and deployment are updated to the new version.<\/li>\n<li> Pull tools can be distributed across different namespaces with different Git repositories and access rights. This allows for a multitenant model. For example, Team A can use Namespace A, Team B can use Namespace B, and the infrastructure team can use a global space.<\/li>\n<li> Typically, tools are quite lightweight.<\/li>\n<li> In conjunction with tools like the operator <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bitnami-labs\/sealed-secrets\">Bitnami Sealed Secrets<\/a><\/noindex>, secrets can be stored in an encrypted form in the Git repository and retrieved from within the cluster.<\/li>\n<li> There is no connection to CD pipelines, as deployments occur within the cluster.<\/li>\n<\/ol>\n<p>\n<b>Cons<\/b>:<\/p>\n<ol>\n<li> Managing deployment secrets from Helm charts is more complex than regular ones, as they first need to be generated in a format like sealed secrets, then decrypted by an internal operator, and only then do they become available for the pull tool. After that, a release can be launched in Helm with values already in the deployed secrets. The simplest way is to create a secret with all the Helm values used for the deployment, decrypt it, and commit it to Git.<\/li>\n<li> By applying the pull approach, you become tied to tools that operate on pulls. This limits the ability to configure the deployment process in the cluster. For example, working with Kustomize is complicated because it has to be executed before the final templates go to Git. I'm not saying you can't use separate tools, but they are harder to integrate into the deployment process.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Push-Based Approach<\/h2>\n<p>\n<img decoding=\"async\" alt=\"GitOps: Comparison of Pull and Push Methods\" src=\"\/wp-content\/uploads\/533fc0bd107c3338d323e908ae9e75ab.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn the push approach, an external system (mainly CD pipelines) triggers deployments in the cluster after a commit to the Git repository or upon successful completion of the preceding CI pipeline. In this method, the system has access to the cluster.<\/p>\n<p><b>Advantages<\/b>:<\/p>\n<ol>\n<li> Security is determined by the Git repository and the build pipeline.<\/li>\n<li> Deploying Helm charts is easier, with support for Helm plugins.<\/li>\n<li> Managing secrets is simpler, as secrets can be applied in pipelines and stored in Git in encrypted form (depending on user preferences).<\/li>\n<li> No binding to a specific tool, as any types can be used.<\/li>\n<li> Container version updates can be initiated by the build pipeline.<\/li>\n<\/ol>\n<p>\n<b>Cons<\/b>:<\/p>\n<ol>\n<li> Data for accessing the cluster resides within the build system.<\/li>\n<li> Updating container deployments is still easier to carry out with the pull process.<\/li>\n<li> Strong dependency on the CD system, as the pipelines we need may have originally been written for GitLab Runners, and then the team decides to switch to Azure DevOps or Jenkins... leading to the necessity of migrating a large number of build pipelines.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Conclusion: Push or Pull?<\/h2>\n<p>\nAs it often happens, each approach has its pros and cons. Some tasks are easier to accomplish with one method and harder with another. Initially, I deployed manually, but after coming across several articles about Weave Flux, I decided to implement GitOps processes for all projects. For basic templates, it turned out to be simple, but then I began to face difficulties with Helm charts. At that time, Weave Flux only offered a nascent version of the Helm Chart Operator, but even now some tasks are more complex due to the need to manually create secrets and apply them. You could argue that the pull approach is much more secure since the cluster credentials are not accessible outside of it, which significantly enhances security and justifies the extra effort.<\/p>\n<p>After some reflection, I came to the surprising conclusion that this is not the case. When it comes to components that require maximum protection, this list includes secret storage and CI\/CD systems, as well as Git repositories. The information within them is quite vulnerable and needs maximum protection. Moreover, if someone gains access to your Git repository and can push code there, they can deploy whatever they want (regardless of the approach taken, whether it\u2019s pull or push), and infiltrate the cluster systems. Thus, the most critical components requiring protection are the Git repository and CI\/CD systems, not the cluster credentials. If you have well-configured policies and security measures for such systems and cluster credentials are extracted in pipelines only as secrets, the additional security of the pull approach may not be as valuable as initially presumed.<\/p>\n<p>So, if the pull approach is more labor-intensive and does not provide a security advantage, wouldn't it be more logical to use only the push approach? However, someone might argue that with the push approach, you are too tied to the CD system, and perhaps it\u2019s better not to do this to facilitate migrations in the future.<\/p>\n<p>In my opinion (as always), it is best to use what best fits the specific case or to combine approaches. Personally, I use both approaches: Weave Flux for pull-based deployments, which mainly include our own services, and the push approach with Helm and plugins that simplify applying Helm charts to the cluster and allow for easy secret creation. I believe there will never be a single solution that fits all cases because there are always many nuances that depend on the specific application scenario. That said, I strongly recommend GitOps \u2014 it significantly simplifies life and enhances security.<\/p>\n<p>I hope my experience on this topic will help you determine which method suits your type of deployments better, and I would be glad to hear your opinion.<\/p>\n<h2>P.S. Note from the translator<\/h2>\n<p>\nOne downside of the pull model is the difficulty of committing rendered manifests to Git; however, there's no downside that the CD pipeline in the pull model lives separately from the deployment and essentially becomes a pipeline of the category <i>Continuous Apply<\/i>. Therefore, even more effort will be needed to gather the status from all deployments and provide access to logs\/status, ideally linked to the CD system.<\/p>\n<p>In this sense, the push model allows for some guarantees of rollout because the lifespan of the pipeline can be made equal to the lifespan of the rollout.<\/p>\n<p>We have tested both models and arrived at the same conclusions as the author of the article:<\/p>\n<ol>\n<li> The pull model is suitable for organizing updates of system components across a large number of clusters (see <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/455543\/\">the article on addon-operator<\/a><\/noindex>).<\/li>\n<li> The push model based on GitLab CI is well-suited for deploying applications using Helm charts. In this case, the deployment of applications within the pipelines is tracked using the tool <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">werf<\/a><\/noindex>. By the way, in the context of this project, we often heard the term \"GitOps\" when discussing the pressing issues of DevOps engineers at our booth at KubeCon Europe '19.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Our experience with data in the etcd Kubernetes cluster directly (without K8s API)<\/h2>\n<p>\nAlso read in our blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/441964\/\">Kubernetes tips &amp; tricks: shifting working resources in the cluster under Helm 2 management<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/434160\/\">Introducing the kubedog library for monitoring Kubernetes resources<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/449096\/\">Expanding and complementing Kubernetes (overview and presentation video)<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/436910\/\">Tips for Creating Custom Workflows in GitLab CI<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p class=\"for_users_only_msg\">Only registered users can participate in the survey. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Please log in<\/a><\/noindex>, please.<\/p>\n<h2 class=\"default-block__polling-title\">Do you use GitOps?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Yes, pull approach<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Yes, push<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Yes, pull + push<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Yes, something else<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    No<\/p>\n<\/li>\n<\/ul>\n<p>    30 users voted. 10 users abstained.<br \/>\n<br \/>Source: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/456754\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432.: \u0412 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435 Kubernetes \u044f\u0432\u043d\u0443\u044e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u0442\u0440\u0435\u043d\u0434 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c GitOps, \u0432 \u0447\u0451\u043c \u043c\u044b \u043b\u0438\u0447\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u043b\u0438\u0441\u044c, \u043f\u043e\u0441\u0435\u0442\u0438\u0432 KubeCon Europe 2019. \u042d\u0442\u043e\u0442 \u0442\u0435\u0440\u043c\u0438\u043d \u0431\u044b\u043b \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043d \u0433\u043b\u0430\u0432\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Weaveworks \u2014 Alexis Richardson \u2014 \u0438 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0445 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 (\u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u2014 Git, \u043e\u0442\u043a\u0443\u0434\u0430 \u0438 \u0441\u0430\u043c\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435) \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438. \u0412 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-35594","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u043c.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/gitops-sravnenie-metodov-pull-i-push\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47GitOps: \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 Pull \u0438 Push | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u043c.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/gitops-sravnenie-metodov-pull-i-push\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:05:15+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:05:15+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47GitOps: Comparison of Pull and Push Methods | ProHoster","description":"Example.","canonical_url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/gitops-sravnenie-metodov-pull-i-push","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"en_US","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47GitOps: \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 Pull \u0438 Push | ProHoster","og:description":"\u041f\u0440\u0438\u043c.","og:url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/gitops-sravnenie-metodov-pull-i-push","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:05:15+00:00","article:modified_time":"2019-10-31T19:05:15+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35594","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 23:54:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:05:10","updated":"2026-01-21 23:54:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/35594","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=35594"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/35594\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=35594"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=35594"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=35594"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}