{"id":34825,"date":"2019-10-31T22:00:35","date_gmt":"2019-10-31T19:00:35","guid":{"rendered":"https:\/\/prohoster.info\/blog\/kak-soedinit-klastery-kubernetes-v-raznyh-data-tsentrah\/"},"modified":"2019-10-31T22:00:35","modified_gmt":"2019-10-31T19:00:35","slug":"kak-soedinit-klastery-kubernetes-v-raznyh-data-tsentrah","status":"publish","type":"post","link":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/kak-soedinit-klastery-kubernetes-v-raznyh-data-tsentrah","title":{"rendered":"How to connect Kubernetes clusters in different data centers","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"How to connect Kubernetes clusters in different data centers\" src=\"\/wp-content\/uploads\/2019\/06\/fa408b406e31840857bbbe13e1d7ee5a.JPG\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<strong>Welcome to the series of brief guides on Kubernetes.<\/strong> This is a regular column featuring the most interesting questions we receive online and during our training sessions, answered by a Kubernetes expert.<\/p>\n<p><\/p>\n<blockquote><p>Today's expert is Daniele Polencic (<noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/danielepolencic\">Daniele Polencic<\/a><\/noindex>). Daniele works as an instructor and software developer at <noindex><a rel=\"nofollow\" href=\"https:\/\/learnk8s.io\/\">Learnk8s<\/a><\/noindex>.<\/p><\/blockquote>\n<p>If you want to get an answer to your question in the next post, <noindex><a rel=\"nofollow\" href=\"http:\/\/hello@learnk8s.io\">contact us via email<\/a><\/noindex> or in <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/learnk8s\">Twitter: @learnk8s<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Missed the previous posts? <noindex><a rel=\"nofollow\" href=\"https:\/\/learnk8s.io\/visualise-dependencies-kubernetes\">You can find them here<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h3 id=\"kak-soedinit-klastery-kubernetes-v-raznyh-data-centrah\">How to connect Kubernetes clusters in different data centers?<\/h3>\n<p><\/p>\n<blockquote><p><strong>Summary<\/strong>: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes-sigs\/federation-v2\">Kubefed v2 is coming soon<\/a><\/noindex>, and I also recommend reading about <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bookingcom\/shipper\">Shipper<\/a><\/noindex> and <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/admiraltyio\/multicluster-scheduler\">the multi-cluster-scheduler project.<\/a><\/noindex>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Often, infrastructure is replicated and distributed across various regions, especially in controlled environments.<\/p><\/blockquote>\n<p><strong>If one region becomes unavailable, traffic is redirected to another to avoid outages.<\/strong><\/p>\n<p><\/p>\n<p>With Kubernetes, a similar strategy can be employed to distribute workloads across different regions.<\/p>\n<p><\/p>\n<p>You may have one or several clusters per team, region, environment, or a combination of these elements.<\/p>\n<p><\/p>\n<p>Your clusters can be hosted across various clouds and on-premises environments.<\/p>\n<p><\/p>\n<p><em>But how do you plan infrastructure for such geographic dispersion?<br \/>\nShould you create one large cluster across multiple cloud environments over a single network?<br \/>\nOr establish many small clusters and find a way to control and synchronize them?<\/em><\/p>\n<p><\/p>\n<h3 id=\"odin-rukovodyaschiy-klaster\">One guiding cluster<\/h3>\n<p><\/p>\n<p><em>Creating a single cluster over a single network is not that straightforward.<\/em><\/p>\n<p><\/p>\n<p>Imagine, you have an outage, and connectivity is lost between cluster segments.<\/p>\n<p><\/p>\n<p>If you have one master server, half of the resources won't be able to receive new commands because they can't connect to the master.<\/p>\n<p><\/p>\n<p>Meanwhile, you have old routing tables (<code>kube-proxy<\/code> can't load new ones) and no additional pods (kubelet can't request updates).<\/p>\n<p><\/p>\n<p>Worse yet, if Kubernetes can't see a node, it marks it as lost and redistributes the missing pods across existing nodes.<\/p>\n<p><\/p>\n<p><strong>As a result, you have twice as many pods.<\/strong><\/p>\n<p><\/p>\n<p>If you set up one master server for each region, there will be issues with the consensus algorithm in the etcd database.<em>Note: In fact, the etcd database does not necessarily have to be on the master servers. It can be run on a separate group of servers in one region. However, this results in a single point of failure for the cluster. But it's fast.<\/em>)<\/p>\n<p><\/p>\n<p>etcd uses <noindex><a rel=\"nofollow\" href=\"http:\/\/thesecretlivesofdata.com\/raft\/\">the Raft algorithm<\/a><\/noindex>, to agree on a value before writing it to disk.<br \/>\nThis means that a majority of instances must reach consensus before the state can be written to etcd.<\/p>\n<p><\/p>\n<p>If the latency between etcd instances sharply increases, as in the case of three etcd instances in different regions, it takes a lot of time to agree on a value and write it to disk.<br \/>\nThis is also reflected in Kubernetes controllers.<\/p>\n<p><\/p>\n<p>The controller manager takes longer to learn about a change and write the response to the database.<\/p>\n<p><\/p>\n<p>And since there is not just one controller, but several, <strong>it results in a chain reaction, causing the entire cluster to slow down significantly.<\/strong>.<\/p>\n<p><\/p>\n<p>etcd is so sensitive to latency that <noindex><a rel=\"nofollow\" href=\"https:\/\/coreos.com\/etcd\/docs\/latest\/faq.html#deployment\">the official documentation recommends using SSDs instead of regular hard drives.<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><strong>Currently, there are no good examples of a large network for a single cluster.<\/strong><\/p>\n<p><\/p>\n<p>Primarily, the developer community and the SIG-cluster group are trying to figure out how to orchestrate clusters in the same way that Kubernetes orchestrates containers.<\/p>\n<p><\/p>\n<h3 id=\"variant-1-federaciya-klasterov-s-kubefed\">Option 1: cluster federation with kubefed<\/h3>\n<p><\/p>\n<p>The official response from SIG-cluster is that <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes-sigs\/federation-v2\">kubefed2, the new version of the original client and kube federation operator,<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Attempted to manage a collection of clusters as a single object using the kube federation tool for the first time.<\/p>\n<p><\/p>\n<p>The beginning was promising, but ultimately kube federation never gained popularity because it did not support all resources.<\/p>\n<p><\/p>\n<p>It supported aggregated deployments and services, but did not support, for example, StatefulSets.<br \/>\nAdditionally, the federation configuration was passed as annotations and lacked flexibility.<\/p>\n<p><\/p>\n<p><em>Imagine how one could describe the distribution of replicas for each cluster in the federation using just annotations.<\/em><\/p>\n<p><\/p>\n<p><strong>It resulted in complete chaos.<\/strong><\/p>\n<p><\/p>\n<p>SIG-cluster did a lot of work after kubefed v1 and decided to approach the problem from a different angle.<\/p>\n<p><\/p>\n<p><strong>Instead of annotations, they decided to release a controller that is installed on the clusters. It can be configured using Custom Resource Definitions (CRD).<\/strong><\/p>\n<p><\/p>\n<p>For each resource that will be part of the federation, you have a custom CRD definition consisting of three sections:<\/p>\n<p><\/p>\n<ul>\n<li>a standard resource definition, such as a deployment;<\/li>\n<li>section <code>placement<\/code>, where you define how the resource will be distributed in the federation;<\/li>\n<li>section <code>override<\/code>, where you can override the weight and parameters from placement for a specific resource.<\/li>\n<\/ul>\n<p><\/p>\n<p>Here is an example of a federated deployment with placement and override sections.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: types.federation.k8s.io\/v1alpha1\nkind: FederatedDeployment\nmetadata:\n  name: test-deployment\n  namespace: test-namespace\nspec:\n  template:\n    metadata:\n      labels:\n        app: nginx\n    spec:\n      replicas: 3\n      selector:\n        matchLabels:\n          app: nginx\n      template:\n        metadata:\n          labels:\n            app: nginx\n        spec:\n          containers:\n            - image: nginx\n              name: nginx\n  placement:\n    clusterNames:\n      - cluster2\n      - cluster1\n  overrides:\n    - clusterName: cluster2\n      clusterOverrides:\n        - path: spec.replicas\n          value: 5<\/code><\/pre>\n<p><\/p>\n<p>As you can see, the deployment is distributed across two clusters: <code>cluster1<\/code> and <code>cluster2<\/code>.<\/p>\n<p><\/p>\n<p>The first cluster supplies three replicas, while the second one has a value of 5 set.<\/p>\n<p><\/p>\n<p>If you need more control over the number of replicas, kubefed2 provides a new object called ReplicaSchedulingPreference, where replicas can be distributed by weight:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: scheduling.federation.k8s.io\/v1alpha1\nkind: ReplicaSchedulingPreference\nmetadata:\n  name: test-deployment\n  namespace: test-ns\nspec:\n  targetKind: FederatedDeployment\n  totalReplicas: 9\n  clusters:\n    A:\n      weight: 1\n    B:\n      weight: 2<\/code><\/pre>\n<p><\/p>\n<p>The CRD structure and API are still not completely ready, and active work is underway in the official project repository.<\/p>\n<p><\/p>\n<p><strong>Keep an eye on kubefed2, but remember, it is not yet suitable for production environments.<\/strong><\/p>\n<p><\/p>\n<p>Learn more about kubefed2 from <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/blog\/2018\/12\/12\/kubernetes-federation-evolution\/\">the official article on kubefed2<\/a><\/noindex> in the Kubernetes blog and in the <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes-sigs\/federation-v2\">official kubefed project repository<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h3 id=\"variant-2-obedinenie-klasterov-v-stile-bookingcom\">Option 2: Cluster Federation in the Style of Booking.com<\/h3>\n<p><\/p>\n<p>Booking.com developers have not dealt with kubefed v2, but they came up with Shipper \u2014 an operator for deployment across multiple clusters, in different regions, and in various clouds.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bookingcom\/shipper\">Shipper<\/a><\/noindex> Somewhat similar to kubefed2.<\/p>\n<p><\/p>\n<p>Both tools allow you to configure a deployment strategy across multiple clusters (which clusters are used and how many replicas they have).<\/p>\n<p><\/p>\n<p>However, <strong>the goal of Shipper is to reduce the risk of deployment errors.<\/strong><\/p>\n<p><\/p>\n<p>In Shipper, you can define a series of steps that describe the splitting of replicas between the previous and current deployments and the volume of incoming traffic.<\/p>\n<p><\/p>\n<p>When you send a resource to a cluster, the Shipper controller gradually deploys this change across all federated clusters.<\/p>\n<p><\/p>\n<p><em>Moreover, Shipper is very limited.<\/em><\/p>\n<p><\/p>\n<p>For example, <strong>It takes Helm charts as input.<\/strong> and does not support vanilla resources.<br \/>\nIn general, Shipper works as follows.<\/p>\n<p><\/p>\n<p>Instead of the standard delivery, you need to create an application resource that includes a Helm chart:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: shipper.booking.com\/v1alpha1\nkind: Application\nmetadata:\n  name: super-server\nspec:\n  revisionHistoryLimit: 3\n  template:\n    chart:\n      name: nginx\n      repoUrl: https:\/\/storage.googleapis.com\/shipper-demo\n      version: 0.0.1\n    clusterRequirements:\n      regions:\n        - name: local\n    strategy:\n      steps:\n        - capacity:\n            contender: 1\n            incumbent: 100\n          name: staging\n          traffic:\n            contender: 0\n            incumbent: 100\n        - capacity:\n            contender: 100\n            incumbent: 0\n          name: full on\n          traffic:\n            contender: 100\n            incumbent: 0\n    values:\n      replicaCount: 3<\/code><\/pre>\n<p><\/p>\n<p><strong>Shipper is a good option for managing multiple clusters, but its close integration with Helm is a hindrance.<\/strong><\/p>\n<p><\/p>\n<p><em>What if we all switch from Helm to <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/blog\/2018\/05\/29\/introducing-kustomize-template-free-configuration-customization-for-kubernetes\/\">kustomize<\/a><\/noindex> or <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/deepmind\/kapitan\">kapitan<\/a><\/noindex>?<\/em><\/p>\n<p><\/p>\n<p>Learn more about Shipper and its philosophy in <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/booking-com-infrastructure\/introducing-shipper-daf9244e3882\">this official press release<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>If you want to dive into the code, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bookingcom\/shipper\">head to the official project repository<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h3 id=\"variant-3-magicheskoe-obedinenie-klasterov\">Option 3: \"magical\" cluster merging<\/h3>\n<p><\/p>\n<p>Kubefed v2 and Shipper work with cluster federation, providing clusters with new resources through custom resource definitions.<\/p>\n<p><\/p>\n<p><em>But what if you don\u2019t want to rewrite all deliveries, StatefulSets, DaemonSets, etc., for merging?<\/em><\/p>\n<p><\/p>\n<p><em>How to include an existing cluster in the federation without changing the YAML?<\/em><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/admiraltyio\/multicluster-scheduler\">multi-cluster-scheduler is a project by Admirality<\/a><\/noindex>, which deals with scheduling workloads in clusters.<\/p>\n<p><\/p>\n<p>But instead of creating a new way to interact with the cluster and wrapping resources in custom definitions, the multi-cluster-scheduler integrates into the standard Kubernetes lifecycle and intercepts all calls that create pods.<\/p>\n<p><\/p>\n<p><strong>Every created pod is immediately replaced with a placeholder.<\/strong><\/p>\n<p><\/p>\n<blockquote><p>multi-cluster-scheduler uses <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/reference\/access-authn-authz\/extensible-admission-controllers\/\">web-hooks to modify access<\/a><\/noindex>, to intercept the call and create an idle pod placeholder.<\/p><\/blockquote>\n<p>The original pod goes through another scheduling cycle, where a decision is made on placement after polling the entire federation.<\/p>\n<p><\/p>\n<p>Finally, the pod is delivered to the target cluster.<\/p>\n<p><\/p>\n<p>As a result, you have an extra pod that does nothing, just takes up space.<\/p>\n<p><\/p>\n<p>The advantage is that you didn\u2019t have to write new resources for merging deliveries.<\/p>\n<p><\/p>\n<p><strong>Every resource that creates a pod is automatically ready for merging.<\/strong><\/p>\n<p><\/p>\n<p>It's interesting how you suddenly have supplies distributed across several regions, and you didn't even notice. However, this is quite risky, as everything here relies on magic.<\/p>\n<p><\/p>\n<p>But while Shipper primarily tries to mitigate the effects of deliveries, the multi-cluster-scheduler performs more general tasks and may be better suited for batch jobs.<\/p>\n<p><\/p>\n<p>It lacks an advanced mechanism for gradual delivery.<\/p>\n<p><\/p>\n<p>You can learn more about the multi-cluster-scheduler on <noindex>the official repository page.<\/noindex>.<\/p>\n<p><\/p>\n<p>If you want to read about the multi-cluster-scheduler in action, Admiralty has an <noindex><a rel=\"nofollow\" href=\"https:\/\/admiralty.io\/blog\/running-argo-workflows-across-multiple-kubernetes-clusters\/\">interesting case study with Argo<\/a><\/noindex> \u2014 workflows, events, CI, and CD in Kubernetes.<\/p>\n<p><\/p>\n<h3 id=\"drugie-instrumenty-i-resheniya\">Other tools and solutions<\/h3>\n<p><\/p>\n<p>Connecting multiple clusters and managing them is a complex task; there is no universal solution.<\/p>\n<p><\/p>\n<p>If you wish to explore this topic further, here are some resources:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/submariner.io\/\">Submariner from Rancher<\/a><\/noindex> \u2014 a tool that connects overlay networks of different Kubernetes clusters.<\/li>\n<li>The Target retail chain uses <noindex><a rel=\"nofollow\" href=\"https:\/\/tech.target.com\/infrastructure\/2018\/06\/20\/enter-unimatrix.html\">Unimatrix in conjunction with Spinnaker to orchestrate deployments across multiple clusters.<\/a><\/noindex>.<\/li>\n<li>Try using IPV6 and <noindex><a rel=\"nofollow\" href=\"https:\/\/itnext.io\/kubernetes-multi-cluster-networking-made-simple-c8f26827813\">a single network across several regions.<\/a><\/noindex>.<\/li>\n<li>You can use a service mesh, for example, <noindex><a rel=\"nofollow\" href=\"https:\/\/istio.io\/docs\/setup\/kubernetes\/install\/multicluster\/\">Istio to connect multiple clusters.<\/a><\/noindex>.<\/li>\n<li>Cilium, a container network interface plugin, offers <noindex><a rel=\"nofollow\" href=\"https:\/\/cilium.io\/blog\/2019\/03\/12\/clustermesh\/\">a cluster mesh feature<\/a><\/noindex>, which allows several clusters to be combined.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"vot-i-vse-na-segodnya\">That's all for today.<\/h3>\n<p><\/p>\n<p><em>I tried not to write too much, but in my opinion, the article still turned out to be quite long. The other features of unRAID are quite simple to configure, especially since everything can be set up with a mouse.<\/em><\/p>\n<p><\/p>\n<p>If you know a more effective way to connect multiple clusters, <noindex><a rel=\"nofollow\" href=\"http:\/\/hello@learnk8s.io\">let us know.<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>We'll add your method to the links.<\/p>\n<p><\/p>\n<p>Special thanks to Chris Nesbitt-Smith (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/chrisns\">Chris Nesbitt-Smith<\/a><\/noindex>) and Vincent De Smet (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/so0k\">Vincent De Smet<\/a><\/noindex>) (reliability engineer at <noindex><a rel=\"nofollow\" href=\"https:\/\/swatmobile.io\/\">swatmobile.io<\/a><\/noindex>) for reading the article and sharing valuable information about how federation works.<\/p>\n<p>Source: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/454056\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u0435\u0440\u0438\u044e \u043a\u0440\u0430\u0442\u043a\u0438\u0445 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432 \u043f\u043e Kubernetes. \u042d\u0442\u043e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u043a\u043e\u043b\u043e\u043d\u043a\u0430 \u0441 \u0441\u0430\u043c\u044b\u043c\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u043d\u043b\u0430\u0439\u043d \u0438 \u043d\u0430 \u043d\u0430\u0448\u0438\u0445 \u0442\u0440\u0435\u043d\u0438\u043d\u0433\u0430\u0445. \u041e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u044d\u043a\u0441\u043f\u0435\u0440\u0442 \u043f\u043e Kubernetes. \u0421\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0442 \u2014 \u0414\u0430\u043d\u0438\u044d\u043b\u044c \u041f\u043e\u043b\u0435\u043d\u0447\u0438\u043a (Daniele Polencic). \u0414\u0430\u043d\u0438\u044d\u043b\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u043c \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u041f\u041e \u0432 Learnk8s. \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0441\u0432\u043e\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u043e\u0441\u0442\u0435, \u0441\u0432\u044f\u0436\u0438\u0442\u0435\u0441\u044c \u0441 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":26226,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-34825","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.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u0435\u0440\u0438\u044e.\" \/>\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\/kak-soedinit-klastery-kubernetes-v-raznyh-data-tsentrah\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\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\u041a\u0430\u043a \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u044b Kubernetes \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0430\u0445 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u0435\u0440\u0438\u044e.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/kak-soedinit-klastery-kubernetes-v-raznyh-data-tsentrah\" \/>\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:00:35+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:00:35+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\udd47How to Connect Kubernetes Clusters in Different Data Centers | ProHoster","description":"Welcome to the series.","canonical_url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/kak-soedinit-klastery-kubernetes-v-raznyh-data-tsentrah","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\u041a\u0430\u043a \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u044b Kubernetes \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0430\u0445 | ProHoster","og:description":"\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u0435\u0440\u0438\u044e.","og:url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/kak-soedinit-klastery-kubernetes-v-raznyh-data-tsentrah","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:00:35+00:00","article:modified_time":"2019-10-31T19:00:35+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"34825","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 20:45:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:14:06","updated":"2026-01-21 20:45: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\/34825","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=34825"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/34825\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media\/26226"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=34825"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=34825"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=34825"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}