{"id":97254,"date":"2020-10-17T02:42:32","date_gmt":"2020-10-17T00:42:32","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/prosti-openshift-my-nedostatochno-czenili-tebya-i-prinimali-kak-dolzhnoe"},"modified":"2020-10-17T02:42:32","modified_gmt":"2020-10-17T00:42:32","slug":"prosti-openshift-my-nedostatochno-czenili-tebya-i-prinimali-kak-dolzhnoe","status":"publish","type":"post","link":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/prosti-openshift-my-nedostatochno-czenili-tebya-i-prinimali-kak-dolzhnoe","title":{"rendered":"Sorry, OpenShift, we didn't appreciate you enough and took you for granted.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>This post was written because our employees had quite a few conversations with clients about application development on Kubernetes and the specifics of such development on OpenShift.<\/p>\n<p><img decoding=\"async\" alt=\"Sorry, OpenShift, we didn&#039;t appreciate you enough and took you for granted.\" src=\"\/wp-content\/uploads\/2020\/10\/ad447aeb80d3ae56ea4598cd959456de.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWe usually start with the thesis that Kubernetes is simply Kubernetes, while OpenShift is a Kubernetes platform, similar to Microsoft AKS or Amazon EKS. Each of these platforms has its own advantages tailored to specific target audiences. After this, the discussion usually shifts to comparing the strengths and weaknesses of specific platforms.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nOverall, we thought about writing this post with a conclusion like, \"Listen, it doesn\u2019t really matter where you run your code, on OpenShift or on AKS, EKS, some custom Kubernetes, or any Kubernetes,\" <i>(for brevity, let\u2019s call it KUK)<\/i> \u2014 it\u2019s really just as simple on both.<\/p>\n<p>Then we planned to take a simple 'Hello World' example and show what is common and what the differences are between KUK and Red Hat OpenShift Container Platform (hereafter referred to as OCP or simply OpenShift).<\/p>\n<p>However, as we were writing this post, we realized that we have become so accustomed to using OpenShift that we hardly recognize how it has grown and evolved into an amazing platform that has become much more than just a Kubernetes distribution. We tend to take the maturity and simplicity of OpenShift for granted, overlooking its greatness.<\/p>\n<p>In general, the time for active reflection has come, and now we will step-by-step compare the deployment of our 'Hello World' on KUK and OpenShift, doing so as objectively as possible (though, we may express some personal opinions on the subject). If you are interested in a purely subjective opinion on this matter, you can read it <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/swlh\/im-so-sorry-openshift-i-ve-taken-you-for-granted-f36fb47ea4d9\">here (EN)<\/a><\/noindex>. In this post, we will stick to the facts and only the facts.<\/p>\n<h3>Clusters<\/h3>\n<p>\nSo, for our 'Hello World', we need clusters. Let's immediately say 'no' to any public clouds to avoid paying for servers, registries, networks, data transfer, etc. Accordingly, we choose a simple single-node cluster on <noindex><a rel=\"nofollow\" href=\"https:\/\/minikube.sigs.k8s.io\/docs\/start\/\">Minikube<\/a><\/noindex> (for KUK) and <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/products\/codeready-containers\/overview\">Code Ready Containers<\/a><\/noindex> (for the OpenShift cluster). Both of these options are really simple to install, but will require quite a lot of resources on your laptop.<\/p>\n<p><img decoding=\"async\" alt=\"Sorry, OpenShift, we didn&#039;t appreciate you enough and took you for granted.\" src=\"\/wp-content\/uploads\/2020\/10\/01c748365253fc9e11e817876629ae7e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Building on KUK<\/h3>\n<p>\nSo, let's get started.<\/p>\n<h4>Step 1 - Let's build our container image<\/h4>\n<p>\nLet\u2019s start by deploying our 'Hello World' on minikube. For this, we will need:<\/p>\n<ol>\n<li>1. Installed Docker.<\/li>\n<li>2. Installed Git.<\/li>\n<li>3. Installed Maven (actually, this project uses the mvnw binary, so this is optional).<\/li>\n<li>4. The source code itself, i.e., a clone of the repository <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/gcolman\/quarkus-hello-world.git\">github.com\/gcolman\/quarkus-hello-world.git<\/a><\/noindex><\/li>\n<\/ol>\n<p>\nFirst, we need to create a Quarkus project. Don\u2019t worry if you\u2019ve never worked with the Quarkus.io site\u2014it\u2019s easy. Just select the components you want to use in your project (RestEasy, Hibernate, Amazon SQS, Camel, etc.), and then Quarkus will automatically set up the Maven archetype and deploy everything on GitHub without any input from you. That\u2019s literally just one click of the mouse\u2014and it\u2019s done. This is why we love Quarkus.<\/p>\n<p><img decoding=\"async\" alt=\"Sorry, OpenShift, we didn&#039;t appreciate you enough and took you for granted.\" src=\"\/wp-content\/uploads\/2020\/10\/39a62058d91f8443e77466d374d02d34.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>The simplest way to build our 'Hello World' into a container image is to use the quarkus-maven extension for Docker, which will handle all the necessary work. With Quarkus, this has become really easy: you add the container-image-docker extension and can create images using Maven commands.<\/p>\n<pre><code class=\"plaintext\">.\/mvnw quarkus:add-extension -Dextensions=\"container-image-docker\"\n<\/code><\/pre>\n<p>\nAnd finally, we build our image using Maven. As a result, our source code turns into a ready-to-run container image that can be executed in a container runtime environment.<\/p>\n<p><img decoding=\"async\" alt=\"Sorry, OpenShift, we didn&#039;t appreciate you enough and took you for granted.\" src=\"\/wp-content\/uploads\/2020\/10\/94b74cac6616896eb672a72302e70169.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<pre><code class=\"plaintext\">.\/mvnw -X clean package -Dquarkus.container-image.build=true\n<\/code><\/pre>\n<p>\nAnd that\u2019s it; now you can run the container with the command docker run, mapping our service to port 8080 for access.<\/p>\n<pre><code class=\"plaintext\">docker run -i --rm -p 8080:8080 gcolman\/quarkus-hello-world\n<\/code><\/pre>\n<p><img decoding=\"async\" alt=\"Sorry, OpenShift, we didn&#039;t appreciate you enough and took you for granted.\" src=\"\/wp-content\/uploads\/2020\/10\/4f46e13423d5027d85ebae2c98c926b8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Once the container instance has started, you just need to check with the curl command that our service is working:<\/p>\n<p><img decoding=\"async\" alt=\"Sorry, OpenShift, we didn&#039;t appreciate you enough and took you for granted.\" src=\"\/wp-content\/uploads\/2020\/10\/1c1462f52d6a487863c21f8f72a09d1f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>So, everything works, and it was really easy and straightforward.<\/p>\n<h4>Step 2 \u2013 pushing our container to the container image repository<\/h4>\n<p>\nSo far, our created image is stored locally in our local container repository. If we want to use this image in our K8s environment, we need to place it in another repository. Kubernetes doesn\u2019t have such functionalities, so we will use Docker Hub. Firstly, it\u2019s free, and secondly, (almost) everyone does it.<\/p>\n<p>It\u2019s also very simple; all you need is an account on Docker Hub.<\/p>\n<p>So, let\u2019s log into Docker Hub and push our image there.<\/p>\n<p><img decoding=\"async\" alt=\"Sorry, OpenShift, we didn&#039;t appreciate you enough and took you for granted.\" src=\"\/wp-content\/uploads\/2020\/10\/fb5d81ee15ca7594277c5a05da298fbd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4>Step 3 \u2013 starting Kubernetes<\/h4>\n<p>\nThere are many ways to build a Kubernetes configuration to run our 'Hello World', but we will use the simplest one because that\u2019s just who we are...<\/p>\n<p>First, let\u2019s start the minikube cluster:<\/p>\n<pre><code class=\"plaintext\">minikube start\n<\/code><\/pre>\n<p><\/p>\n<h4>Step 4 \u2013 Deploying our container image<\/h4>\n<p>\nNow we need to transform our code and container image into Kubernetes configurations. In other words, we require a pod and deployment definition pointing to our container image on Docker Hub. One of the simplest ways to accomplish this is by running the create deployment command, specifying our image:<\/p>\n<p><img decoding=\"async\" alt=\"Sorry, OpenShift, we didn&#039;t appreciate you enough and took you for granted.\" src=\"\/wp-content\/uploads\/2020\/10\/0bd984a5b414310daca039289dd35cd2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<pre><code class=\"plaintext\">kubectl create deployment hello-quarkus --image=gcolman\/quarkus-hello-world:1.0.0-SNAPSHOT\n<\/code><\/pre>\n<p>\nWith this command, we instructed Kubernetes to create a deployment configuration that should include the pod specification for our container image. This command will also apply this configuration to our Minikube cluster, creating a deployment that pulls our container image and launches a pod in the cluster.<\/p>\n<h4>Step 5 \u2013 Opening access to our service<\/h4>\n<p>\nNow that we have the container image deployed, it's time to consider how to configure external access to this Restful service, which is indeed programmed in our code.<\/p>\n<p>There are several ways to do this. For example, we can use the expose command to automatically create the necessary Kubernetes components, such as services and endpoints. Essentially, that\u2019s what we will do by executing the expose command for our deployment object:<\/p>\n<pre><code class=\"plaintext\">kubectl expose deployment hello-quarkus --type=NodePort --port=8080\n<\/code><\/pre>\n<p>\nLet's pause for a moment on the \u201c--type\u201d option of the expose command.<\/p>\n<p>When we perform expose and create the components necessary for running our service, we need, among other things, to ensure that external access can connect to the hello-quarkus service, which resides within our software-defined network. The parameter <b>type<\/b> allows us to create and connect things like load balancers to route traffic into this network.<\/p>\n<p>For example, specifying <b>--type=LoadBalancer<\/b>, we automatically initialize a load balancer in the public cloud to connect to our Kubernetes cluster. This is, of course, fantastic, but it\u2019s essential to understand that such a configuration will be tightly bound to a specific public cloud and will be more challenging to transfer between Kubernetes instances across different environments.<\/p>\n<p>In our example, <b>--type=NodePort<\/b>, meaning that the service call is made using the node's IP address and port number. This option allows not to use any public clouds but requires a number of additional steps. First, you need your own load balancer, so we will deploy an NGINX load balancer in our cluster.<\/p>\n<h4>Step 6 \u2013 Setting up the load balancer<\/h4>\n<p>\nMinikube has a number of platform-specific features that simplify the creation of necessary components for external access, such as ingress controllers. Minikube comes with an NGINX ingress controller, and all we need to do is enable and configure it.<\/p>\n<pre><code class=\"plaintext\">minikube addons enable ingress\n<\/code><\/pre>\n<p>\nNow, with just one command, we can create an NGINX ingress controller that will operate within our minikube cluster:<\/p>\n<pre><code class=\"plaintext\">ingress-nginx-controller-69ccf5d9d8-j5gs9 1\/1 Running 1 33m\n<\/code><\/pre>\n<p><\/p>\n<h4>Step 7 \u2013 Configuring ingress<\/h4>\n<p>\nNow we need to configure the NGINX ingress controller to accept requests for hello-quarkus.<\/p>\n<p><img decoding=\"async\" alt=\"Sorry, OpenShift, we didn&#039;t appreciate you enough and took you for granted.\" src=\"\/wp-content\/uploads\/2020\/10\/18183cb985436447cf15c501e4c6c3a3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><img decoding=\"async\" alt=\"Sorry, OpenShift, we didn&#039;t appreciate you enough and took you for granted.\" src=\"\/wp-content\/uploads\/2020\/10\/577f1e6218094b5ee23052d49869e838.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>And finally, we need to apply this configuration.<\/p>\n<p><img decoding=\"async\" alt=\"Sorry, OpenShift, we didn&#039;t appreciate you enough and took you for granted.\" src=\"\/wp-content\/uploads\/2020\/10\/c519d7763cd1c685063a6bbab6a813ea.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<pre><code class=\"plaintext\">kubectl apply -f ingress.yml\n<\/code><\/pre>\n<p><img decoding=\"async\" alt=\"Sorry, OpenShift, we didn&#039;t appreciate you enough and took you for granted.\" src=\"\/wp-content\/uploads\/2020\/10\/68fba4ef3d2762a97dc5be5de9e6b864.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Since we're doing all this on our computer, we simply add the IP address of our node to the \/etc\/hosts file to direct HTTP requests to our minikube on the NGINX load balancer.<\/p>\n<pre><code class=\"plaintext\">192.168.99.100 hello-quarkus.info\n<\/code><\/pre>\n<p>\nThat's it, now our minikube service is accessible from the outside through the NGINX ingress controller.<\/p>\n<p><img decoding=\"async\" alt=\"Sorry, OpenShift, we didn&#039;t appreciate you enough and took you for granted.\" src=\"\/wp-content\/uploads\/2020\/10\/a456f34d168d43e9236e4769722b7f5d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Well, that was easy, right? Or not quite?<\/h3>\n<p><img decoding=\"async\" alt=\"Sorry, OpenShift, we didn&#039;t appreciate you enough and took you for granted.\" src=\"\/wp-content\/uploads\/2020\/10\/237015dc06bb9d12eb4cd2944dc6df58.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Running on OpenShift (Code Ready Containers)<\/h3>\n<p>\nNow let's see how this is done on the Red Hat OpenShift Container Platform (OCP).<\/p>\n<p>As with minikube, we choose a single-node OpenShift cluster scheme in the form of Code Ready Containers (CRC). Previously, this was called minishift and was based on the OpenShift Origin project, and now it is CRC built on Red Hat's OpenShift Container Platform.<\/p>\n<p>Here we must say, 'OpenShift is wonderful!'<\/p>\n<p>Initially, we thought to write that development on OpenShift is no different from development on Kubernetes. And in essence, that's true. But while writing this post, we recalled how many extra steps are required when you don't have OpenShift, and that's why it is, as we repeat, wonderful. We love when everything is easy, and the way our example deploys and runs on OpenShift compared to minikube inspired us to write this post.<\/p>\n<p>Let's go through the process and see what we need to do.<\/p>\n<p>So, in the minikube example, we started with Docker\u2026 Wait, we no longer need Docker to be installed on the machine.<\/p>\n<p><b>And we don't need a local git.<br \/>\nAnd Maven is not needed either.<br \/>\nAnd there's no need to manually create a container image.<br \/>\nAnd there's no need to find a container image repository.<br \/>\nAnd there's no need to install an ingress controller.<br \/>\nAnd configuring ingress is also unnecessary.<\/b><\/p>\n<p>You got it, right? To deploy and run our application on OpenShift, none of the above is required. The process looks like this.<\/p>\n<h4>Step 1 \u2013 Start your OpenShift cluster<\/h4>\n<p>\nWe use Code Ready Containers from Red Hat, which is essentially the same as Minikube, but with a full single-node OpenShift cluster.<\/p>\n<pre><code class=\"plaintext\">crc start\n<\/code><\/pre>\n<p><\/p>\n<h4>Step 2 \u2013 Build and deploy the application in the OpenShift cluster<\/h4>\n<p>\nThis is where the simplicity and convenience of OpenShift shine. As with all Kubernetes distributions, we have many ways to launch an application in the cluster. And, as in the case of K8s, we deliberately choose the simplest option.<\/p>\n<p>OpenShift has always been built as a platform for creating and running container applications. Building containers has always been an integral part of this platform, so there are plenty of additional Kubernetes resources for related tasks.<\/p>\n<p>We will use OpenShift's Source to Image (S2I) process, which has several different methods to take our source code (or binary files) and turn it into a container image that runs in the OpenShift cluster.<\/p>\n<p>For this, we need two things:<\/p>\n<ul>\n<li>Our source code in a git repository<\/li>\n<li>A builder image on which the build will be executed.<\/li>\n<\/ul>\n<p>\nThere are many such images, supported both by Red Hat and at the community level, and we will use the OpenJDK image since I am building a Java application.<\/p>\n<p>Starting the S2I build can be done from both the OpenShift Developer graphical console and the command line. We will use the new-app command, specifying where to get the builder image and our source code.<\/p>\n<p><img decoding=\"async\" alt=\"Sorry, OpenShift, we didn&#039;t appreciate you enough and took you for granted.\" src=\"\/wp-content\/uploads\/2020\/10\/64b8091c6857999c94dd907ad12fa9ae.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<pre><code class=\"plaintext\">oc new-app registry.access.redhat.com\/ubi8\/openjdk-11:latest~https:\/\/github.com\/gcolman\/quarkus-hello-world.git\n<\/code><\/pre>\n<p>\nThat's it, our application is created. The S2I process has performed the following actions:<\/p>\n<ul>\n<li>Created a service build pod for all things related to building the application.<\/li>\n<li>Created an OpenShift Build config.<\/li>\n<li>Downloaded the builder image to the internal OpenShift docker registry.<\/li>\n<li>Cloned 'Hello World' into the local repository.<\/li>\n<li>I saw that there is a Maven POM, so I compiled the application using Maven.<\/li>\n<li>I created a new container image containing the compiled Java application and stored this image in the internal container registry.<\/li>\n<li>I created a Kubernetes Deployment with specifications for the pod, service, etc.<\/li>\n<li>I launched the deployment of the container image.<\/li>\n<li>I deleted the temporary build pod.<\/li>\n<\/ul>\n<p>\nThere is a lot in this list, but the main thing is that the entire build process occurs entirely within OpenShift, the internal Docker registry is inside OpenShift, and the build process creates all the Kubernetes components and runs them in the cluster.<\/p>\n<p>If you visually track the S2I launch in the console, you can see how the build pod is started during the build process.<\/p>\n<p><img decoding=\"async\" alt=\"Sorry, OpenShift, we didn&#039;t appreciate you enough and took you for granted.\" src=\"\/wp-content\/uploads\/2020\/10\/bd69c6e27813b1211a11e522f28f45b7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Now let's take a look at the logs of the builder pod: first of all, you can see how Maven does its job and downloads dependencies for building our Java application.<\/p>\n<p><img decoding=\"async\" alt=\"Sorry, OpenShift, we didn&#039;t appreciate you enough and took you for granted.\" src=\"\/wp-content\/uploads\/2020\/10\/326192f9f9373e451d601b77052d67d1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>After the Maven build is complete, the container image build is initiated, and then this built image is sent to the internal repository.<\/p>\n<p><img decoding=\"async\" alt=\"Sorry, OpenShift, we didn&#039;t appreciate you enough and took you for granted.\" src=\"\/wp-content\/uploads\/2020\/10\/c97da4c17a8e275d39104126d0f87048.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>That's it, the build process is complete. Now let's verify that the pods and services of our application have started in the cluster.<\/p>\n<pre><code class=\"plaintext\">oc get service\n<\/code><\/pre>\n<p><img decoding=\"async\" alt=\"Sorry, OpenShift, we didn&#039;t appreciate you enough and took you for granted.\" src=\"\/wp-content\/uploads\/2020\/10\/f16a098a096128073f305e0444061417.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>That's all. Only one command left. We just need to expose this service for external access.<\/p>\n<h4>Step 3 \u2013 expose the service for external access<\/h4>\n<p>\nAs with the KUK, our 'Hello World' also needs a router on the OpenShift platform to direct external traffic to the service inside the cluster. OpenShift simplifies this greatly. First, the HAProxy routing component is installed by default in the cluster (it can be changed to the same NGINX). Second, there are special resources that offer extensive configuration options, called Routes, which resemble Ingress objects in the good old Kubernetes (in fact, OpenShift's Routes significantly influenced the design of Ingress objects, which can now also be used in OpenShift), but for our 'Hello World', and in most other cases, the standard Route will suffice without additional configuration.<\/p>\n<p>To create a routable FQDN for 'Hello World' (yes, OpenShift has its own DNS for routing by service names), we simply perform expose for our service:<\/p>\n<p><img decoding=\"async\" alt=\"Sorry, OpenShift, we didn&#039;t appreciate you enough and took you for granted.\" src=\"\/wp-content\/uploads\/2020\/10\/d6b76943594aa71195ca9af500db6c10.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<pre><code class=\"plaintext\">oc expose service quarkus-hello-world\n<\/code><\/pre>\n<p>\nIf you look at the newly created Route, you can find the FQDN and other routing information:<\/p>\n<pre><code class=\"plaintext\">oc get route\n<\/code><\/pre>\n<p><img decoding=\"async\" alt=\"Sorry, OpenShift, we didn&#039;t appreciate you enough and took you for granted.\" src=\"\/wp-content\/uploads\/2020\/10\/dc59c36166605ef0a5a24b2b7ffa65b6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>And finally, we access our service from the browser:<\/p>\n<p><img decoding=\"async\" alt=\"Sorry, OpenShift, we didn&#039;t appreciate you enough and took you for granted.\" src=\"\/wp-content\/uploads\/2020\/10\/fccf6cae1746fa59df2ff8ffb6973666.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Well, that was really easy!<\/h3>\n<p>\nWe love Kubernetes and everything this technology allows us to do, as well as the simplicity and ease it brings. Kubernetes was designed to dramatically simplify the operation of distributed scalable containers, but today its simplicity is no longer enough for deploying applications. This is where OpenShift comes into play, keeping up with the times and offering Kubernetes primarily focused on developers. A tremendous amount of effort has gone into tailoring the OpenShift platform specifically for developers, including the creation of tools such as S2I, ODI, Developer Portal, OpenShift Operator Framework, integration with IDEs, Developer Catalogues, Helm integration, monitoring, and many more.<\/p>\n<p>We hope this article has been interesting and useful to you. Additional resources, materials, and other helpful items for development on the OpenShift platform can be found on the <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/\">Red Hat Developers<\/a><\/noindex>.<br \/>\n<br \/>Source: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/523568\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042d\u0442\u043e\u0442 \u043f\u043e\u0441\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u043d\u0430\u0448\u0438\u0445 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432 \u0431\u044b\u043b\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u043e\u0432 \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438 \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 Kubernetes \u0438 \u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0435 \u0442\u0430\u043a\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430 OpenShift. \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043c\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u0441 \u0442\u0435\u0437\u0438\u0441\u0430, \u0447\u0442\u043e Kubernetes \u2013 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e Kubernetes, \u0430 OpenShift \u2013 \u044d\u0442\u043e \u0443\u0436\u0435 Kubernetes-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430, \u043a\u0430\u043a Microsoft AKS \u0438\u043b\u0438 Amazon EKS. \u0423 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":97255,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-97254","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=\"\u042d\u0442\u043e\u0442 \u043f\u043e\u0441\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u043d\u0430\u0448\u0438\u0445 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432 \u0431\u044b\u043b\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u043e\u0432 \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438 \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 Kubernetes \u0438 \u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0435 \u0442\u0430\u043a\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430 OpenShift.\" \/>\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\/prosti-openshift-my-nedostatochno-czenili-tebya-i-prinimali-kak-dolzhnoe\" \/>\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\u041f\u0440\u043e\u0441\u0442\u0438, OpenShift, \u043c\u044b \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0446\u0435\u043d\u0438\u043b\u0438 \u0442\u0435\u0431\u044f \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b\u0438 \u043a\u0430\u043a \u0434\u043e\u043b\u0436\u043d\u043e\u0435 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042d\u0442\u043e\u0442 \u043f\u043e\u0441\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u043d\u0430\u0448\u0438\u0445 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432 \u0431\u044b\u043b\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u043e\u0432 \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438 \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 Kubernetes \u0438 \u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0435 \u0442\u0430\u043a\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430 OpenShift.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/prosti-openshift-my-nedostatochno-czenili-tebya-i-prinimali-kak-dolzhnoe\" \/>\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-10-17T00:42:32+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-10-17T00:42:32+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\udd47Sorry, OpenShift, we didn't appreciate you enough and took you for granted | ProHoster","description":"This post was written because our employees had quite a few conversations with clients about application development on Kubernetes and the specifics of such development on OpenShift.","canonical_url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/prosti-openshift-my-nedostatochno-czenili-tebya-i-prinimali-kak-dolzhnoe","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\u041f\u0440\u043e\u0441\u0442\u0438, OpenShift, \u043c\u044b \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0446\u0435\u043d\u0438\u043b\u0438 \u0442\u0435\u0431\u044f \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b\u0438 \u043a\u0430\u043a \u0434\u043e\u043b\u0436\u043d\u043e\u0435 | ProHoster","og:description":"\u042d\u0442\u043e\u0442 \u043f\u043e\u0441\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u043d\u0430\u0448\u0438\u0445 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432 \u0431\u044b\u043b\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u043e\u0432 \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438 \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 Kubernetes \u0438 \u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0435 \u0442\u0430\u043a\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430 OpenShift.","og:url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/prosti-openshift-my-nedostatochno-czenili-tebya-i-prinimali-kak-dolzhnoe","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-10-17T00:42:32+00:00","article:modified_time":"2020-10-17T00:42:32+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"97254","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 10:24:26","updated":"2022-09-30 14:35:33","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\/97254","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=97254"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/97254\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media\/97255"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=97254"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=97254"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=97254"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}