{"id":37475,"date":"2019-10-31T22:17:51","date_gmt":"2019-10-31T19:17:51","guid":{"rendered":"https:\/\/prohoster.info\/blog\/instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-kubernetes\/"},"modified":"2019-10-31T22:17:51","modified_gmt":"2019-10-31T19:17:51","slug":"instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-kubernetes","status":"publish","type":"post","link":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-kubernetes","title":{"rendered":"Tools for application developers running in Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Tools for application developers running in Kubernetes\" src=\"\/wp-content\/uploads\/2019\/08\/ad1f46a3562dcefacaa1722ee1ce3387.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA modern approach to operations addresses many pressing business problems. Containers and orchestrators make it easy to scale projects of any complexity, simplify the release of new versions, and make them more reliable, but at the same time create additional challenges for developers. A programmer is primarily concerned with their code: architecture, quality, performance, elegance\u2014not with how it runs in Kubernetes or how to test and debug it after even minimal changes. Therefore, it\u2019s quite natural that tools for Kubernetes are actively developing to help solve issues even for the most 'archaic' developers, allowing them to focus on what truly matters.<\/p>\n<p>This overview provides a brief overview of some tools that simplify life for programmers whose code runs in the pods of a Kubernetes cluster.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Simple Helpers<\/h2>\n<p><\/p>\n<h3>Kubectl-debug<\/h3>\n<p><\/p>\n<ul>\n<li> Essence: <b>add your container to the Pod and see what is happening inside it<\/b>.<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/aylei\/kubectl-debug\">GitHub<\/a><\/noindex>.<\/li>\n<li> GH statistics: 715 stars, 54 commits, 9 contributors.<\/li>\n<li> Language: Go.<\/li>\n<li> License: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nThis plugin for kubectl allows you to create an additional container inside a specific pod that shares the process namespace with other containers. You can use it to debug the pod's operation: check network functionality, listen to network traffic, perform strace on the desired process, etc.<\/p>\n<p>You can also switch to the process container by executing <code>chroot \/proc\/PID\/root<\/code> \u2014 this is very convenient when you need to obtain a root shell in a container for which the manifest has set <code>securityContext.runAs<\/code>.<\/p>\n<p>The tool is simple and effective, making it useful for any developer. We wrote more about it in <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/436112\/\">a separate article<\/a><\/noindex>.<\/p>\n<h3>Telepresence<\/h3>\n<p><\/p>\n<ul>\n<li> Essence: <b>move the application to your computer. Develop and debug locally<\/b>.<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/www.telepresence.io\/\">Website<\/a><\/noindex>; <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/telepresenceio\/telepresence\">GitHub<\/a><\/noindex>.<\/li>\n<li> GH statistics: 2131 stars, 2712 commits, 33 contributors.<\/li>\n<li> Language: Python.<\/li>\n<li> License: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nThe idea behind this tool is to run a container with the application on the local user\u2019s computer while proxying all traffic from the cluster to it and back. This approach allows for local development simply by modifying files in your favorite IDE: changes will be available immediately.<\/p>\n<p>The advantages of local launch include ease of editing and immediate results, as well as the ability to debug applications in a familiar way. The downsides are the demands on connection speed, which become especially apparent when dealing with applications that have relatively high RPS and traffic. Additionally, Telepresence has issues with volume mounts on Windows, which can be a decisive limitation for developers accustomed to this OS.<\/p>\n<p>We have already shared our experience using Telepresence <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/446788\/\">here<\/a><\/noindex>.<\/p>\n<h3>Ksync<\/h3>\n<p><\/p>\n<ul>\n<li> Essence: <b>provides near-instantaneous code synchronization with the container in the cluster.<\/b>.<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/vapor-ware\/ksync\">GitHub<\/a><\/noindex>.<\/li>\n<li> Brief GH statistics: 555 stars, 362 commits, 11 contributors.<\/li>\n<li> Language: Go.<\/li>\n<li> License: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nThe utility allows you to synchronize the contents of a local directory with the container's directory running in the cluster. This tool is perfect for developers using scripting languages whose main challenge is delivering code to a running container. Ksync is designed to alleviate this headache.<\/p>\n<p>Upon a single initialization with the command <code>ksync init<\/code> a DaemonSet is created in the cluster, which is used to monitor the state of the filesystem of the selected container. On their local machine, the developer runs the command <code>ksync watch<\/code>, which monitors configurations and triggers <noindex><a rel=\"nofollow\" href=\"https:\/\/syncthing.net\/\">syncthing<\/a><\/noindex>, which performs the actual file synchronization with the cluster.<\/p>\n<p>The next step is to instruct ksync on what to synchronize with what. For example, the command:<\/p>\n<pre><code class=\"plaintext\">ksync create --name=myproject --namespace=test --selector=app=backend --container=php --reload=false \/home\/user\/myproject\/ \/var\/www\/myproject\/<\/code><\/pre>\n<p>\n\u2026 will create a watcher named <code>myproject<\/code>, which will search for a pod with the label <code>app=backend<\/code> and attempt to synchronize the local directory <code>\/home\/user\/myproject\/<\/code> with the directory <code>\/var\/www\/myproject\/<\/code> of the container named <code>php<\/code>.<\/p>\n<p>Problems and notes regarding ksync from our experience:<\/p>\n<ul>\n<li> The Kubernetes cluster nodes must use <code>overlay2<\/code> as the storage driver for Docker. No other utility will work.<\/li>\n<li> When using Windows as the client OS, there may be incorrect operation of the file system watcher. This bug has been noticed when working with large directories \u2014 with many nested files and folders. We have created <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/syncthing\/syncthing\/issues\/5832\">a corresponding issue<\/a><\/noindex> in the syncthing project, but there has been no progress on it so far (since early July).<\/li>\n<li> Use the file <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.syncthing.net\/users\/ignoring.html\"><code>.stignore<\/code><\/a><\/noindex> to specify paths or file patterns that should not be synchronized (for example, directories <code>app\/cache<\/code> and <code>.git<\/code>).<\/li>\n<li> By default, ksync will restart the container on every file change. This is convenient for Node.js, but completely unnecessary for PHP. It\u2019s better to disable opcache and use the flag <code>--reload=false<\/code>.<\/li>\n<li> The configuration can always be corrected in <code>$HOME\/.ksync\/ksync.yaml<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Squash<\/h3>\n<p><\/p>\n<ul>\n<li> Essence: <b>debug processes directly in the cluster<\/b>.<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/solo-io\/squash\">GitHub<\/a><\/noindex>.<\/li>\n<li> Brief GH statistics: 1154 stars, 279 commits, 23 contributors.<\/li>\n<li> Language: Go.<\/li>\n<li> License: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nThis tool is designed for debugging processes directly in pods. The utility is simple and allows you to choose the necessary debugger in interactive mode. <i>(see below)<\/i> and namespace + pod where intervention is needed. Currently, the following are supported:<\/p>\n<ul>\n<li> delve \u2014 for Go applications;<\/li>\n<li> GDB \u2014 via target remote + port forwarding;<\/li>\n<li> port forwarding JDWP for debugging Java applications.<\/li>\n<\/ul>\n<p>\nIDE support is currently only available in VScode (with the help of <noindex><a rel=\"nofollow\" href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=ilevine.squash\">extension<\/a><\/noindex>), however, plans for the current year (2019) include Eclipse and Intellij.<\/p>\n<p>For process debugging, Squash runs a privileged container on the cluster nodes, so you must first familiarize yourself with the capabilities of the <noindex><a rel=\"nofollow\" href=\"https:\/\/squash.solo.io\/secure_mode\/\">safe mode<\/a><\/noindex> to avoid security issues.<\/p>\n<h2>Comprehensive solutions<\/h2>\n<p>\nNow we move on to heavy artillery \u2014 more 'scalable' projects aimed at addressing many developer needs at once.<\/p>\n<p><i><b>NB<\/b>: This list certainly includes our Open Source utility <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/333682\/\"><b>werf<\/b><\/a><\/noindex> (formerly known as dapp). However, we have written and talked about it many times before, so we decided not to include it in the overview. For those interested in exploring its capabilities more closely, we recommend reading\/listening to the presentation \"<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">werf is our tool for CI\/CD in Kubernetes<\/a><\/noindex>\u00bb.<\/i><\/p>\n<h3>DevSpace<\/h3>\n<p><\/p>\n<ul>\n<li> Essence: <b>for those who want to start working with Kubernetes but do not wish to delve deep into its complexities.<\/b>.<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/devspace-cloud\/devspace\">GitHub<\/a><\/noindex>.<\/li>\n<li> Brief GH statistics: 630 stars, 1912 commits, 13 contributors.<\/li>\n<li> Language: Go.<\/li>\n<li> License: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nA solution from the same company providing managed Kubernetes clusters for team development. The utility was created for commercial clusters but works perfectly with any others.<\/p>\n<p>When you run the command <code>devspace init<\/code> in the project directory, you will be prompted (in interactive mode):<\/p>\n<ul>\n<li> to select a working Kubernetes cluster,<\/li>\n<li> to use an existing <code>Dockerfile<\/code> (or generate a new one) to create a container based on it,<\/li>\n<li> to choose a repository for storing container images, etc.<\/li>\n<\/ul>\n<p>\nAfter all these preparatory actions, you can start the development by executing the command <code>devspace dev<\/code>. It will build the container, upload it to the repository, deploy the application to the cluster, and initiate port forwarding and synchronization of the container with the local directory.<\/p>\n<p>Optionally, you will be prompted to access the container through the terminal. You shouldn't decline, as the container actually starts with a sleep command, and for real testing, the application needs to be started manually.<\/p>\n<p>Finally, the command <code>devspace deploy<\/code> deploys the application and its related infrastructure to the cluster, after which everything begins to function in production mode.<\/p>\n<p>All project configuration is stored in the file <code>devspace.yaml<\/code>. In addition to development environment settings, it also contains a description of the infrastructure, similar to standard Kubernetes manifests, but significantly simplified.<\/p>\n<p><img decoding=\"async\" alt=\"Tools for application developers running in Kubernetes\" src=\"\/wp-content\/uploads\/2019\/08\/7abbba3806facfb69ba4e3f9e0f18938.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Architecture and main stages of working with DevSpace<\/i><\/p>\n<p>Additionally, it's easy to add a predefined component (for example, a MySQL database) or a Helm chart to the project. Read more in <noindex><a rel=\"nofollow\" href=\"https:\/\/devspace.cloud\/docs\/\">the documentation<\/a><\/noindex> \u2014 it\u2019s not complicated.<\/p>\n<h3>Skaffold<\/h3>\n<p><\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/skaffold.dev\/\">Website<\/a><\/noindex>; <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/GoogleContainerTools\/skaffold\">GitHub<\/a><\/noindex>.<\/li>\n<li> Brief GH statistics: 7423 stars, 4173 commits, 136 contributors.<\/li>\n<li> Language: Go.<\/li>\n<li> License: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nThis utility from Google aims to cover all the needs of a developer whose code will run in a Kubernetes cluster in one way or another. Getting started with it is not as simple as with devspace: there is no interactivity, language detection, or auto-creation. <code>Dockerfile<\/code> you won\u2019t be offered here.<\/p>\n<p>However, if that doesn\u2019t scare you, here\u2019s what Skaffold allows you to do:<\/p>\n<ul>\n<li> Track changes in the source code.<\/li>\n<li> Synchronize it with the pod container if it does not require building.<\/li>\n<li> Build containers with code if the programming language is interpreted, or compile artifacts and package them into containers.<\/li>\n<li> Automatically verify the resulting images using <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/GoogleContainerTools\/container-structure-test\">container-structure-test<\/a><\/noindex>.<\/li>\n<li> Tag and upload images to Docker Registry.<\/li>\n<li> Deploy the application in the cluster using kubectl, Helm, or kustomize.<\/li>\n<li> Perform port forwarding.<\/li>\n<li> Debug applications written in Java, Node.js, Python.<\/li>\n<\/ul>\n<p>\nWorkflow in various variations is declaratively described in the file <code>skaffold.yaml<\/code>For the project, you can also define several profiles, which can partially or completely change the stages of build and deployment. For example, for development, specify a base image that is convenient for the developer, while for staging and production \u2014 a minimal one (+ use <code>securityContext<\/code> or override the cluster in which the application will be deployed).<\/p>\n<p>Docker container builds can be done locally or remotely: in <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/cloud-build\/\">Google Cloud Build<\/a><\/noindex> or in a cluster using <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/GoogleContainerTools\/kaniko\">Kaniko<\/a><\/noindex>. Bazel and Jib Maven\/Gradle are also supported. For tagging, Skaffold supports various strategies: by git commit hash, date\/time, sha256 checksum of the sources, etc.<\/p>\n<p>It is also worth noting the ability to test containers. The previously mentioned framework container-structure-test provides the following methods of verification:<\/p>\n<ul>\n<li> Executing commands in the context of the container while tracking exit statuses and checking the command's text output.<\/li>\n<li> Checking for the presence of files in the container and ensuring attributes match specified ones.<\/li>\n<li> Controlling the contents of files based on regular expressions.<\/li>\n<li> Verifying image metadata (<code>ENV<\/code>, <code>ENTRYPOINT<\/code>, <code>VOLUMES<\/code> etc.).<\/li>\n<li> Checking license compatibility.<\/li>\n<\/ul>\n<p>\nFile synchronization with the container is done in a less than optimal way: Skaffold simply creates an archive with the sources, copies it, and unpacks it in the container (tar must be installed). Therefore, if your main task is code synchronization, it\u2019s better to look at a specialized solution (ksync).<\/p>\n<p><img decoding=\"async\" alt=\"Tools for application developers running in Kubernetes\" src=\"\/wp-content\/uploads\/2019\/08\/a53647e9d3bf002c292dcae7a774e561.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Main stages of Skaffold's operation<\/i><\/p>\n<p>Overall, the tool does not allow for abstraction from Kubernetes manifests and lacks any interactivity, so it may seem complex to learn. But therein lies its advantage \u2014 greater freedom of action.<\/p>\n<h3>Garden<\/h3>\n<p><\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/garden.io\/\">Website<\/a><\/noindex>; <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/garden-io\/garden\">GitHub<\/a><\/noindex>.<\/li>\n<li> Brief GH statistics: 1063 stars, 1927 commits, 17 contributors.<\/li>\n<li> Language: TypeScript <i>(there are plans to break the project into several components, some of which will use Go, and also to create an SDK for building extensions in TypeScript\/JavaScript and Go)<\/i>.<\/li>\n<li> License: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nLike Skaffold, Garden aims to automate the processes of delivering application code to the K8s cluster. To do this, you first need to describe the project structure in a YAML file, then run the command <code>garden dev<\/code>. It will do all the magic:<\/p>\n<ul>\n<li> It will build containers with various parts of the project.<\/li>\n<li> It will run integration and unit tests if they have been specified.<\/li>\n<li> It will deploy all project components to the cluster.<\/li>\n<li> In case of code changes, it will rerun the entire pipeline.<\/li>\n<\/ul>\n<p>\nThis tool heavily focuses on collaborative use of a remote cluster by a development team. In this situation, if some stages of building and testing have already been completed, this significantly speeds up the entire process since Garden can utilize cached results.<\/p>\n<p>A project module can be a container, Maven container, Helm chart, or manifest for <code>kubectl apply<\/code> or even an OpenFaaS function. Any of the modules can be pulled from a remote Git repository. A module may define (or not define) services, tasks, and tests. Services and tasks can have dependencies, allowing the definition of the deployment sequence of a particular service, ordering the execution of jobs and tests.<\/p>\n<p>Garden provides users with a nice dashboard (currently in <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/garden-io\/garden\/tree\/master\/dashboard\">experimental state<\/a><\/noindex>), displaying the project graph: components, build sequence, task execution, testing, their relationships, and dependencies. You can view logs of all project components directly in the browser and check the HTTP output of any component (if an ingress resource is declared for it, of course).<\/p>\n<p><img decoding=\"async\" alt=\"Tools for application developers running in Kubernetes\" src=\"\/wp-content\/uploads\/2019\/08\/931b48a306fcce025e4dd8aa51d01552.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Garden dashboard<\/i><\/p>\n<p>This tool also features a hot-reload mode, which simply synchronizes script changes with the container in the cluster, greatly speeding up the application debugging process. Garden has a good <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.garden.io\/\">documentation<\/a><\/noindex> and decent <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/garden-io\/garden\/tree\/master\/examples\">set of examples<\/a><\/noindex>, allowing users to quickly get started and use it. By the way, we recently published <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/459586\/\">a translation of an article<\/a><\/noindex> by its authors.<\/p>\n<h2>Conclusion<\/h2>\n<p>\nOf course, this list does not exhaust the toolkit for developing and debugging applications in Kubernetes. There are still many very useful and practical utilities worthy of at least mentioning if not a separate article. Share what tools you use, what problems you have faced, and how you solved them!<\/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\/460351\/\">werf is our tool for CI\/CD in Kubernetes (overview and video report)<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/459586\/\">Garden v0.10.0: Your laptop doesn\u2019t need Kubernetes<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/446788\/\">Kubernetes tips &amp; tricks: on local development and Telepresence<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/436112\/\">The kubectl-debug plugin for debugging in Kubernetes pods.<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Source: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/462707\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u0440\u0435\u0448\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043d\u0430\u0441\u0443\u0449\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0431\u0438\u0437\u043d\u0435\u0441\u0430. \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0438 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043b\u0435\u0433\u043a\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043b\u044e\u0431\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0442 \u0440\u0435\u043b\u0438\u0437\u044b \u043d\u043e\u0432\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439, \u0434\u0435\u043b\u0430\u044e\u0442 \u0438\u0445 \u0431\u043e\u043b\u0435\u0435 \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u043c\u0438, \u043d\u043e \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430, \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0437\u0430\u0431\u043e\u0442\u0438\u0442 \u0435\u0433\u043e \u043a\u043e\u0434: \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430, \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c, \u2014 \u0430 \u043d\u0435 \u0442\u043e, \u043a\u0430\u043a \u043e\u043d \u043f\u043e\u0435\u0434\u0435\u0442 \u0432 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28120,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37475","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=\"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a.\" \/>\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\/instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-kubernetes\" \/>\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\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0445 \u0432 Kubernetes | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-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=\"2019-10-31T19:17:51+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:17:51+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\udd47 Tools for developers of applications running in Kubernetes | ProHoster","description":"A modern approach to.","canonical_url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-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\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0445 \u0432 Kubernetes | ProHoster","og:description":"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a.","og:url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-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":"2019-10-31T19:17:51+00:00","article:modified_time":"2019-10-31T19:17:51+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37475","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-23 18:00:22","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:26:27","updated":"2026-01-23 18:00: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\/37475","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=37475"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/37475\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media\/28120"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=37475"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=37475"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=37475"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}