{"id":35226,"date":"2019-10-31T22:03:05","date_gmt":"2019-10-31T19:03:05","guid":{"rendered":"https:\/\/prohoster.info\/blog\/gotovit-kubernetes-klaster-prosto-i-udobno-anonsiruem-addon-operator\/"},"modified":"2019-10-31T22:03:05","modified_gmt":"2019-10-31T19:03:05","slug":"gotovit-kubernetes-klaster-prosto-i-udobno-anonsiruem-addon-operator","status":"publish","type":"post","link":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/gotovit-kubernetes-klaster-prosto-i-udobno-anonsiruem-addon-operator","title":{"rendered":"Is setting up a Kubernetes cluster easy and convenient? Announcing the addon-operator","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Is setting up a Kubernetes cluster easy and convenient? Announcing the addon-operator\" src=\"\/wp-content\/uploads\/8df3959f765d5d1bc8d427d3258aacc4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nFollowing <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/447442\/\">shell-operator<\/a><\/noindex> we present its older brother \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/addon-operator\">addon-operator<\/a><\/noindex>. This is an Open Source project used to install the system components in a Kubernetes cluster, which can be collectively referred to as add-ons.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Why do we even need add-ons?<\/h2>\n<p>\nIt's no secret that Kubernetes is not a ready-made, all-in-one product, and building a 'mature' cluster requires various add-ons. The addon-operator helps install, configure, and keep these add-ons up to date.<\/p>\n<p>The need for additional components in the cluster is outlined in <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/449096\/\">presentation<\/a><\/noindex> colleagues <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/driusha\/\" class=\"user_link\">driusha<\/a><\/noindex>. In short, the current state of Kubernetes is such that for a simple installation just to play around, the out-of-the-box components may suffice. For development and testing, you can add Ingress, but for a full installation that can be called 'your production is ready', you need to add about a dozen different add-ons: something for monitoring, something for logs, not forgetting ingress and cert-manager, defining node groups, adding network policies, seasoning with sysctl settings and pod autoscaler...<\/p>\n<p><img decoding=\"async\" alt=\"Is setting up a Kubernetes cluster easy and convenient? Announcing the addon-operator\" src=\"\/wp-content\/uploads\/ab3bed8ee8b29d4e51905e45c908f078.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>What is the specificity of working with them?<\/h2>\n<p>\nAs practice shows, it's not just about installation. For comfortable operation with the cluster, add-ons need to be updated, disabled (removed from the cluster), and some things will need testing before being installed in the production cluster.<\/p>\n<p>So, maybe Ansible is enough here? Perhaps. But <b>full-fledged add-ons generally do not operate without configurations<\/b>. These settings may vary depending on the cluster option (aws, gce, azure, bare-metal, do, ...). Some settings cannot be predefined\u2014they need to be obtained from the cluster. And the cluster is not static: for some settings, it will be necessary to monitor changes. This is where Ansible falls short: a program is required that resides in the cluster, i.e., a Kubernetes Operator.<\/p>\n<p>Those who have tried it in practice <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/shell-operator\">shell-operator<\/a><\/noindex>, will say that the tasks of installing and updating add-ons and monitoring configurations can indeed be solved using <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/shell-operator\/blob\/master\/HOOKS.md\">. In general, Airflow hooks are the connection points to external services and libraries. For example,<\/a><\/noindex> for shell-operator. You can write a script that will perform a conditional <code>kubectl apply<\/code> and monitor, for instance, the ConfigMap where the settings are stored. This is essentially what is implemented in the addon-operator.<\/p>\n<h2>How is this organized in addon-operator?<\/h2>\n<p>\nWhen creating a new solution, we based it on the following principles:<\/p>\n<ul>\n<li> The add-on installer must support <b>templating and declarative configuration<\/b>. We don't create magical scripts that install add-ons. The Addon-operator uses Helm to install add-ons. To install, you need to create a chart and specify the values that will be used for configuration. <\/li>\n<li> Settings can <b>be generated during installation<\/b>, they can <b>be obtained from the cluster<\/b>, or <b>updates can be obtained<\/b>, by monitoring cluster resources. These operations can be implemented using hooks.<\/li>\n<li> Settings can <b>store in the cluster<\/b>. To store settings in the cluster, a ConfigMap\/addon-operator is created and the Addon-operator monitors changes to this ConfigMap. The Addon-operator provides hooks access to settings through simple agreements.<\/li>\n<li> <b>The add-on depends on the settings<\/b>. If the settings change, the Addon-operator deploys a Helm chart with new values. We call the combination of the Helm chart, its values, and hooks a module (see more below).<\/li>\n<li> <b>Staging<\/b>. There are no magical release scripts. The update mechanism is similar to that of a regular application \u2014 build the add-ons and the addon-operator into an image, tag it, and deploy.<\/li>\n<li> <b>Outcome control<\/b>. The Addon-operator can provide metrics for Prometheus.<\/li>\n<\/ul>\n<p><\/p>\n<h2>What is an add-on in the addon-operator?<\/h2>\n<p>\nAn add-on can be considered anything that adds new functions to the cluster. For example, the installation of Ingress is a great example of an add-on. This can be any operator or controller with its own CRD: prometheus-operator, cert-manager, kube-controller-manager, etc. Or something small that simplifies operations \u2014 for example, a secret copier that copies registry secrets to new namespaces, or a sysctl tuner that configures sysctl parameters on new nodes.<\/p>\n<p>To implement add-ons, the Addon-operator provides several concepts:<\/p>\n<ul>\n<li> <b>the Helm chart<\/b> used to install various software in the cluster \u2014 for example, Prometheus, Grafana, nginx-ingress. If a required component has a Helm chart, installing it with the Addon-operator will be very easy.<\/li>\n<li> <b>Values storage<\/b>. Helm charts usually have many different settings that can change over time. The Addon-operator supports storing these settings and can monitor their changes to reinstall the Helm chart with new values.<\/li>\n<li> <b>Hooks<\/b> \u2014 are executable files that the Addon-operator triggers by events and that access the values storage. A hook can monitor changes in the cluster and update the values in the values storage. That is, through hooks, you can perform discovery to gather values from the cluster at startup or on a schedule, or you can have continuous discovery, collecting values from the cluster based on changes in the cluster.<\/li>\n<li> <b>Module<\/b> \u2014 is a combination of the Helm chart, values storage, and hooks. Modules can be enabled or disabled. Disabling a module involves deleting all Helm chart releases. Modules can dynamically include themselves, for instance, if all necessary modules are enabled or if discovery in hooks has found the required parameters \u2014 this is done using a helper enabled script.<\/li>\n<li> <b>Global Hooks<\/b>. These are hooks \"by themselves,\" they are not included in modules and have access to the global values storage, the values of which are available to all hooks in the modules.<\/li>\n<\/ul>\n<p>\nHow do these parts work together? Let's look at a picture from the documentation:<\/p>\n<p><img decoding=\"async\" alt=\"Is setting up a Kubernetes cluster easy and convenient? Announcing the addon-operator\" src=\"\/wp-content\/uploads\/c9bb8e5ae78aa5df0d6c4fbf353e4236.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nThere are two operation scenarios:<\/p>\n<ol>\n<li> A global hook is triggered by an event \u2014 for example, when a resource changes in the cluster. This hook processes the changes and writes the new values into the global values storage. The Addon-operator notices that the global storage has changed and starts all modules. Each module uses its hooks to determine whether it needs to be enabled and updates its values storage. If the module is enabled, the Addon-operator triggers the installation of the Helm chart. The Helm chart then has access to values from both the module's storage and the global storage.<\/li>\n<li> The second scenario is simpler: a module hook is triggered by an event, changing values in the module's values storage. The Addon-operator notices this and runs the Helm chart with the updated values.<\/li>\n<\/ol>\n<p>\nAn addition can be implemented as a single hook, or as one Helm chart, or <b>even as several dependent modules.<\/b> \u2014 this depends on the complexity of the component being installed in the cluster and the required level of configuration flexibility. For example, in the repository (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/addon-operator\/tree\/master\/examples\">\/examples<\/a><\/noindex>) there is an addition sysctl-tuner, which is implemented both as a simple module with a hook and Helm chart, and with the use of values storage, allowing for settings to be added by editing the ConfigMap.<\/p>\n<h2>Delivery of updates<\/h2>\n<p>\nA few words about the organization of updates for the components installed by the Addon-operator.<\/p>\n<p>To run the Addon-operator in the cluster, you need to <b>build an image with add-ons<\/b> in the form of hook files and Helm charts, add the binary file <code>addon-operator<\/code> and everything necessary for hooks: <code>bash<\/code>, <code>kubectl<\/code>, <code>jq<\/code>, <code>python<\/code> etc. After that, this image can be deployed to the cluster like a regular application, and you're likely to want to establish some tagging scheme. If there are only a few clusters, the same approach used for applications may work: new release, new version, go through all clusters and update the image for the Pods. However, in the case of deploying to a significant number of clusters, the self-updating concept from the channel suits us better. <\/p>\n<p>Here's how we have it set up:<\/p>\n<ul>\n<li>A channel is essentially an identifier that can be anything (for example, dev\/stage\/ea\/stable).<\/li>\n<li>The name of the channel is the image tag. When updates need to be rolled out to the channel, a new image is built and tagged with the channel name.<\/li>\n<li>When a new image appears in the registry, the Addon-operator restarts and runs with the new image.<\/li>\n<\/ul>\n<p>\nThis is not best practice, as mentioned in <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/containers\/images\/#updating-images\">the Kubernetes documentation<\/a><\/noindex>. It is not recommended, but we are talking about <i>a regular application that lives in one cluster<\/i>. In the case of the Addon-operator, the application comprises multiple Deployments spread across clusters, and self-updating greatly helps and simplifies life. <\/p>\n<p>Channels also help with <b>testing<\/b>: if there is a helper cluster, it can be configured to use the channel <code>stage<\/code> and roll out updates to it before deploying to the channels <code>ea<\/code> and <code>stable<\/code>. If there is an error with the cluster on the channel, it can be switched to <code>ea<\/code> , while the issue with this cluster is being investigated. If the cluster is out of active support, it is switched to its 'frozen' channel \u2014 for example, <code>stable<\/code>freeze-2019-03-20 <code>In addition to updating hooks and Helm charts, it may also be necessary to<\/code>.<\/p>\n<p>update a third-party component <b>. For example, if you notice a bug in a conditional node-exporter and even figured out how to patch it. Then you open a PR and wait for the new release to go through all the clusters and increase the image version. To avoid waiting indefinitely, you might build your own node-exporter and switch to it until the PR is accepted.<\/b>For example, you noticed an error in the conditional node-exporter and even came up with a way to patch it. Next, you opened a PR and are waiting for a new release to update all clusters and increase the image version. To avoid waiting indefinitely, you can build your own node-exporter and switch to it until the PR is accepted.<\/p>\n<p>In general, this can be done without the Addon-operator, but with the Addon-operator, the module for installing node-exporter will be visible in one repository, the Dockerfile for building your image can be kept right there, and it becomes easier for all participants in the process to understand what is happening... And if there are multiple clusters, it becomes easier to test your PR as well as to deploy a new version!<\/p>\n<p>This organization of component updates works successfully for us, but any other suitable scheme can also be implemented\u2014after all, <b>in this case, the Addon-operator is a simple binary file.<\/b>.<\/p>\n<h2>Conclusion<\/h2>\n<p>\nThe principles implemented in the Addon-operator allow for a transparent process of creating, testing, installing, and updating add-ons in the cluster, similar to the processes of developing regular applications.<\/p>\n<p>Add-ons for the Addon-operator in the format of modules (Helm chart + hooks) can be made publicly available. We, Flant, plan to release our developments in the form of such add-ons during the summer. Join the development on GitHub (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/shell-operator\">shell-operator<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/addon-operator\"><b>addon-operator<\/b><\/a><\/noindex>), try to create your own add-on based on <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/addon-operator\/tree\/master\/examples\">examples<\/a><\/noindex> and <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/addon-operator\/blob\/master\/README.md\">the documentation<\/a><\/noindex>, and stay tuned for news on Habr and on our <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/c\/%D0%A4%D0%BB%D0%B0%D0%BD%D1%82\">the YouTube channel<\/a><\/noindex>!<\/p>\n<h2>P.S.<\/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\/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\/447442\/\">Introducing shell-operator: creating operators for Kubernetes has become even easier<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Source: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/455543\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u043b\u0435\u0434 \u0437\u0430 shell-operator \u043c\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0441\u0442\u0430\u0440\u0448\u0435\u0433\u043e \u0431\u0440\u0430\u0442\u0430 \u2014 addon-operator. \u042d\u0442\u043e Open Source-\u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Kubernetes \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u043e\u0431\u0449\u0438\u043c \u0441\u043b\u043e\u0432\u043e\u043c \u2014 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u0417\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f? \u041d\u0435 \u0441\u0435\u043a\u0440\u0435\u0442, \u0447\u0442\u043e Kubernetes \u044d\u0442\u043e \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u0432\u0441\u0451-\u0432-\u043e\u0434\u043d\u043e\u043c, \u0438 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u00ab\u0432\u0437\u0440\u043e\u0441\u043b\u043e\u0433\u043e\u00bb \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. Addon-operator \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0438 [&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-35226","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=\"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\/gotovit-kubernetes-klaster-prosto-i-udobno-anonsiruem-addon-operator\" \/>\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\udd47\u0413\u043e\u0442\u043e\u0432\u0438\u0442\u044c Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u0443\u0434\u043e\u0431\u043d\u043e? \u0410\u043d\u043e\u043d\u0441\u0438\u0440\u0443\u0435\u043c addon-operator | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/gotovit-kubernetes-klaster-prosto-i-udobno-anonsiruem-addon-operator\" \/>\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:03:05+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:03:05+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\udd47Is preparing a Kubernetes cluster easy and convenient? Announcing the addon-operator | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/gotovit-kubernetes-klaster-prosto-i-udobno-anonsiruem-addon-operator","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\udd47\u0413\u043e\u0442\u043e\u0432\u0438\u0442\u044c Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u0443\u0434\u043e\u0431\u043d\u043e? \u0410\u043d\u043e\u043d\u0441\u0438\u0440\u0443\u0435\u043c addon-operator | ProHoster","og:url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/gotovit-kubernetes-klaster-prosto-i-udobno-anonsiruem-addon-operator","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:03:05+00:00","article:modified_time":"2019-10-31T19:03:05+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35226","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 22:25:22","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:07:29","updated":"2026-01-21 22:25:22","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\/35226","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=35226"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/35226\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=35226"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=35226"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=35226"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}