{"id":75425,"date":"2020-03-26T07:42:30","date_gmt":"2020-03-26T05:42:30","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/luchshie-10-hitrostej-i-sovetov-po-kubernetes"},"modified":"2020-03-26T07:42:30","modified_gmt":"2020-03-26T05:42:30","slug":"luchshie-10-hitrostej-i-sovetov-po-kubernetes","status":"publish","type":"post","link":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/luchshie-10-hitrostej-i-sovetov-po-kubernetes","title":{"rendered":"Top 10 Tips and Tricks for Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Top 10 Tips and Tricks for Kubernetes\" src=\"\/wp-content\/uploads\/2020\/03\/4e4a268e9cee6b8b10d283805227b5ac.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nThere is a lot of reference literature online, but sometimes the simplest advice becomes the most valuable. The team <noindex><a rel=\"nofollow\" href=\"https:\/\/mcs.mail.ru\/containers\/\">Kubernetes aaS from Mail.ru<\/a><\/noindex> translated <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/faun\/top-10-kubernetes-tips-and-tricks-d07d38700a70\">a collection of ten tips and tricks<\/a><\/noindex>, which the article's author compiled after a year of working with Kubernetes. The tips are not sorted by importance, but we believe everyone will find something useful.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>The Simplest Command for Working with Kubernetes<\/h2>\n<p>\nTo start with, perhaps the simplest and most useful action in working with Kubernetes is the following command that enables command autocompletion <code>kubectl<\/code> in the bash shell:<\/p>\n<pre><code class=\"bash\">echo \"source &gt; ~\/.bashrc\n<\/code><\/pre>\n<p>\nAutocompletion <code>kubectl<\/code> will be written to the .bashrc file and will automatically activate every time the shell is started. This speeds up typing long commands and parameters, such as <code>all-namespaces.<\/code>For more details, refer to the <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-kubectl\/#kubectl-autocompletion-0\">Kubernetes documentation on bash.<\/a><\/noindex>.<\/p>\n<h2>Default Memory and CPU Limits in Namespaces<\/h2>\n<p>\nIf an application is written incorrectly, for example, it opens a new connection to the database every second but never closes it, a memory leak occurs in the cluster. If no memory limit is set for the application during deployment, this can lead to node failure.<\/p>\n<p>To prevent this, Kubernetes allows you to set default limits for each namespace. They are specified in a yaml file for the specific namespace. Here\u2019s an example of such a file:<\/p>\n<pre><code class=\"go\">apiVersion: v1\nkind: LimitRange\nmetadata:\n  name: mem-limit-range\nspec:\n  limits:\n  - default:\n      memory: 512Mi\n    defaultRequest:\n      memory: 256Mi\n    type: Container\n<\/code><\/pre>\n<p>\nCreate such a yaml file and apply it to any namespace. For example, to the namespace <code>limit-example.<\/code>Now, for any container deployed in this namespace, a limit of 512Mi will apply unless another individual limit is set for that container.<\/p>\n<h2>Garbage Collection in Older Versions of Kubernetes<\/h2>\n<p>\nBy default, Kubelet starts garbage collection when <i>\/var\/lib\/docker<\/i> occupies 90% of available disk space. This is great; however, until Kubernetes version 1.7, there was no default limit on the number of used inode descriptors (inodes), which correspond to the number of files in the filesystem.<\/p>\n<p>Potentially, your container <i>\/var\/lib\/docker<\/i> may use only 50% of the disk space, but the inodes may run out, causing worker issues.<\/p>\n<p>In older versions of kubelet from 1.4 to 1.6, you will need to add the following flag:<\/p>\n<pre><code class=\"go\">--eviction-hard\n=memory.available&lt;100Mi,nodefs.available&lt;10%,nodefs.inodesFree&lt;5%\n<\/code><\/pre>\n<p>\nIn version 1.7 and later, this flag is set by default. However, earlier versions do not monitor the inode limit.<\/p>\n<h2>Minikube\u2026 a small but powerful local Kubernetes<\/h2>\n<p>\nMinikube is the easiest way to run a local Kubernetes cluster. It starts with a simple command:<\/p>\n<pre><code class=\"go\">minikube start\n<\/code><\/pre>\n<p>\nAs a result of this command, a real Kubernetes cluster runs on your computer.<\/p>\n<p><img decoding=\"async\" alt=\"Top 10 Tips and Tricks for Kubernetes\" src=\"\/wp-content\/uploads\/2020\/03\/a27a11ddb35992fbb2835851633eb9c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@sindhujacynixit\/what-is-the-kubernetes-cluster-de2a33e6572\"><i>Image source<\/i><\/a><\/noindex><\/p>\n<p>The trick is how to build an application and run it locally in this cluster. If no special instructions are given, the Docker image will be built on your computer, not in the cluster.<\/p>\n<p>To make Docker send the image to the local Kubernetes cluster, the following command is given to the docker-machine:<\/p>\n<pre><code class=\"go\">eval $(minikube docker-env)\n<\/code><\/pre>\n<p>\nNow we can build applications on the local Kubernetes cluster.<\/p>\n<h2>Don\u2019t give kubectl access to everyone<\/h2>\n<p>\nIt seems obvious, but if multiple teams use the same cluster for their applications (which is what Kubernetes was created for), you shouldn't just hand out access to everyone. <code>kubectl<\/code>It's better to separate teams by allocating each of them their own namespace and controlling access with RBAC policies.<\/p>\n<p>You can go through the trouble of specifying access rights, read, create, delete, and other operations for each pod. But the main thing is to limit access to secrets, allowing it only to administrators. This way, we delineate who can administer the cluster and who can simply deploy in it.<\/p>\n<h2>Manage pod budgets<\/h2>\n<p>\nHow to ensure there are no downtimes for applications in the Kubernetes cluster? PodDisruptionBudget and PodDisruptionBudget once again.<\/p>\n<p>Clusters are periodically updated, and nodes are drained. Nothing stands still; that is the reality. Each deployment with more than one instance should definitely include a PDB (PodDisruptionBudget). It is created in a simple yaml file that is applied to the cluster. The scope of a specific PDB is defined by label selectors.<\/p>\n<p><strong>Note:<\/strong> The PDB budget is only considered during a reversible budget violation (<noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/pods\/disruptions\/#voluntary-and-involuntary-disruptions\">voluntary disruption<\/a><\/noindex>). In situations like hardware failures, the PDB will not trigger.<\/p>\n<p><strong>Example of a PDB:<\/strong><\/p>\n<pre><code class=\"go\">apiVersion: policy\/v1beta1\nkind: PodDisruptionBudget\nmetadata:\n  name: app-a-pdb\nspec:\n  minAvailable: 2\n  selector:\n      matchLabels:\n        app: app-a\n<\/code><\/pre>\n<p>\nThe two main parameters are <code>matchLabels<\/code> and <code>minAvailable<\/code>The first parameter specifies which applications the budget applies to. For example, if I have deployments with labels <code>app: app-a<\/code> and <code>app: app-b<\/code>, then this PDB will only be applied to the first one.<\/p>\n<p>Parameter <code>minAvailable<\/code> is considered during the drain (cleanup) of the node. For example, in our case, during the drain, all instances are evicted <code>app: app-a<\/code>, except for two.<\/p>\n<p>This allows you to control how many instances of the application should be running at any given time.<\/p>\n<h2>Application health monitoring<\/h2>\n<p>\nSuch monitoring can be done in two ways: using Readiness or Liveness probes.<\/p>\n<p>The first probe (readiness) determines the container's readiness to accept traffic.<\/p>\n<p>The second (liveness) indicates whether the container is functioning correctly or needs to be restarted.<\/p>\n<p>The corresponding configurations are simply added to the yaml for deployment. Here you can specify timeouts, delay times, and the number of retries. More details can be found in <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/configure-pod-container\/configure-liveness-readiness-startup-probes\/\">the Kubernetes documentation.<\/a><\/noindex>.<\/p>\n<h2>Labels everywhere<\/h2>\n<p>\nLabels are one of the fundamental concepts in Kubernetes. They allow objects to freely associate with one another as well as create queries based on labels. In Kubernetes, you can even go to a client and observe events for specific labels.<\/p>\n<p>You can do almost anything with labels, but a good example would be creating multiple environments to run programs in a single cluster.<\/p>\n<p>Let's say you are using the same cluster for <code>dev<\/code> and <code>qa<\/code>. This means that you can have the application <code>app-a<\/code>, simultaneously running in both environments. <code>qa<\/code> and <code>dev<\/code>In this case, we can separately address the instance of the application in a specific environment by specifying the corresponding parameter <code>environment<\/code>. For example, <code>app: app-a<\/code> and <code>environment: dev<\/code> for one environment, and <code>app: app-a<\/code> and <code>environment: qa<\/code> for the second.<\/p>\n<p>This allows accessing both instances of the application, for instance, conducting testing simultaneously.<\/p>\n<h2>Get organized<\/h2>\n<p>\nKubernetes is a very powerful system, but any system can eventually get bogged down by a large number of processes. Kubelet runs all the processes and checks you've specified, as well as its own.<\/p>\n<p>Of course, one orphan service won't slow the system down, and Kubernetes is designed for scaling from the start. But when instead of one service a million appear, kubelet starts to choke.<\/p>\n<p>If for any reason you are deleting a deployment (container, image, anything), just make sure to perform a complete cleanup.<\/p>\n<h2>Meet Go<\/h2>\n<p>\nWe saved the best advice for last. Learn the Go programming language.<\/p>\n<p>Kubernetes is built in Go, all extensions are written in Go, and the client library client-go is officially supported.<\/p>\n<p>It can be used for various interesting things. For example, to extend the Kubernetes system to your liking. This allows you to use your own programs for data collection, application deployment, or simple container cleanup.<\/p>\n<p>Learning the Go programming language and mastering client-go is arguably the most important advice for new Kubernetes users.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/mcs.mail.ru\/\"><i>Translated with support from Mail.ru Cloud Solutions<\/i><\/a><\/noindex><\/p>\n<p><strong>What else to read<\/strong>:<\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/484344\/\">Three Levels of Auto-Scaling in Kubernetes and How to Effectively Use Them<\/a><\/noindex>.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/484334\/\">Kubernetes worker nodes: many small or few large<\/a><\/noindex>?<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/mcs.mail.ru\/blog\/25-poleznyh-instrumentov-kubernetes-razvertyvanie-i-upravlenie\">25 useful tools for deploying and managing Kubernetes<\/a><\/noindex>.<\/li>\n<\/ol>\n<p>Source: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/493772\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043c\u043d\u043e\u0433\u043e \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u043e\u0439 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b, \u043d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u0441\u0430\u043c\u044b\u043c\u0438 \u0446\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0441\u0430\u043c\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0441\u043e\u0432\u0435\u0442\u044b. \u041a\u043e\u043c\u0430\u043d\u0434\u0430 Kubernetes aaS \u043e\u0442 Mail.ru \u043f\u0435\u0440\u0435\u0432\u0435\u043b\u0430 \u043f\u043e\u0434\u0431\u043e\u0440\u043a\u0443 \u0438\u0437 \u0434\u0435\u0441\u044f\u0442\u0438 \u0445\u0438\u0442\u0440\u043e\u0441\u0442\u0435\u0439 \u0438 \u0441\u043e\u0432\u0435\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u0432\u0442\u043e\u0440 \u0441\u0442\u0430\u0442\u044c\u0438 \u0441\u043e\u0431\u0440\u0430\u043b\u0430 \u043f\u043e\u0441\u043b\u0435 \u0433\u043e\u0434\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Kubernetes. \u0421\u043e\u0432\u0435\u0442\u044b \u043d\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043f\u043e \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u0434\u0443\u043c\u0430\u0435\u043c, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u043d\u0430\u0439\u0434\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435 \u0434\u043b\u044f \u0441\u0435\u0431\u044f. \u0421\u0430\u043c\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 Kubernetes [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":75426,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-75425","post","type-post","status-publish","format-standard","has-post-thumbnail","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=\"\u0412 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043c\u043d\u043e\u0433\u043e \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u043e\u0439 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b, \u043d\u043e.\" \/>\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\/luchshie-10-hitrostej-i-sovetov-po-kubernetes\" \/>\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\u041b\u0443\u0447\u0448\u0438\u0435 10 \u0445\u0438\u0442\u0440\u043e\u0441\u0442\u0435\u0439 \u0438 \u0441\u043e\u0432\u0435\u0442\u043e\u0432 \u043f\u043e Kubernetes | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043c\u043d\u043e\u0433\u043e \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u043e\u0439 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b, \u043d\u043e.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/luchshie-10-hitrostej-i-sovetov-po-kubernetes\" \/>\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=\"2020-03-26T05:42:30+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-26T05:42:30+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\udd47The Top 10 Tricks and Tips for Kubernetes | ProHoster","description":"There is a lot of reference literature available online, but.","canonical_url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/luchshie-10-hitrostej-i-sovetov-po-kubernetes","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\u041b\u0443\u0447\u0448\u0438\u0435 10 \u0445\u0438\u0442\u0440\u043e\u0441\u0442\u0435\u0439 \u0438 \u0441\u043e\u0432\u0435\u0442\u043e\u0432 \u043f\u043e Kubernetes | ProHoster","og:description":"\u0412 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043c\u043d\u043e\u0433\u043e \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u043e\u0439 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b, \u043d\u043e.","og:url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/luchshie-10-hitrostej-i-sovetov-po-kubernetes","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":"2020-03-26T05:42:30+00:00","article:modified_time":"2020-03-26T05:42:30+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"75425","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":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 17:56:30","updated":"2022-10-01 20:34:03","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\/75425","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=75425"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/75425\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media\/75426"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=75425"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=75425"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=75425"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}