{"id":9784,"date":"2022-02-01T18:06:38","date_gmt":"2022-02-01T12:36:38","guid":{"rendered":"https:\/\/opstree.com\/blog\/\/?p=9784"},"modified":"2022-02-08T15:55:33","modified_gmt":"2022-02-08T10:25:33","slug":"autoscaling-in-nomad-cluster","status":"publish","type":"post","link":"https:\/\/opstree.com\/blog\/2022\/02\/01\/autoscaling-in-nomad-cluster\/","title":{"rendered":"Autoscaling in Nomad Cluster"},"content":{"rendered":"\n<p>We are living in the microservice era, where we have a number of applications to support a business model. But our application success cannot be determined by the features only, it should have a scalable model as well. Otherwise, something like this would happen:-<\/p>\n\n\n\n<p class=\"has-text-align-center\"><img decoding=\"async\" width=\"462px;\" height=\"260px;\" src=\"https:\/\/lh3.googleusercontent.com\/36w5g-xJ8zTzNbuF9n10vKQcLEeydhYC6kQm5VkbAS78f9n1numiAaIbbEiDoPcMEJKpGMY7wWf8ToOT4Zkfx93edqtohOfiFjZ5h3fB-qjtZqsTZXUWs6hc6mhj4tiqB1LUAWv4PlQ\"><\/p>\n\n\n\n<p>When we generally talk about the scaling in the microservices, people think that applications that are running inside Kubernetes as containers. Since Kubernetes has its own method of autoscaling using the metrics-server, we don&#8217;t have to worry about the scaling of the applications inside it.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>But just like we discussed in our previous blog on <a rel=\"noreferrer noopener\" href=\"https:\/\/opstree.com\/blog\/\/2021\/05\/25\/running-non-containerized-microservices\/\" target=\"_blank\">Running non-containerized microservices<\/a>. It&#8217;s not always like this we are going to use Kubernetes as an orchestrator because there might be some scenarios where we have to use some different solutions. As we have mentioned in our previous blog, we were using Nomad to handle the windows IIS-based application with orchestrator features and we were successful to deploy those applications over the Nomad platform.<\/p>\n\n\n\n<p>Now there was another challenge that came across in front of us scaling of the applications, then we started to evaluate the scaling solutions for Nomad-based applications and we observed that Nomad has a very interesting way of handling the autoscaling.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"autoscaling-for-nomad-applications\">Autoscaling for Nomad applications<\/h2>\n\n\n\n<p>Nomad tasks can easily get scaled out and scaled in to handle the traffic accordingly. Nomad uses a plugin called <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/hashicorp\/nomad-autoscaler\" target=\"_blank\">nomad-autoscaler<\/a>. The Nomad Autoscaler currently supports horizontal, vertical application scaling. For autoscaling applications, Nomad provides a plugin interface through which we can connect multiple data stores for metrics. For example:- If our organization is using Prometheus for monitoring, we can easily integrate it with the Prometheus plugin and define the scaling policies using the PromQL expressions.<\/p>\n\n\n\n<p>Some of the available autoscaling plugins are:-<\/p>\n\n\n\n<ul><li>Datadog<\/li><li>Prometheus<\/li><li>DigitalOcean<\/li><li>Openstack<\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/www.datocms-assets.com\/2885\/1585166055-autoscaler.png\" alt=\"HashiCorp Nomad Autoscaling Tech Preview\" width=\"800\" \/><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"nomad-application-autoscaling-using-prometheus\">Nomad application autoscaling using Prometheus<\/h2>\n\n\n\n<p>In this example, we are going to see how we can integrate Nomad with Prometheus to autoscale the applications. As a first-level change, we have to update the Nomad server configuration so it can use Prometheus as a metrics store.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nomad {\n  address = \"http:\/\/172.16.1.101:4646\"\n}\ntelemetry {\n  prometheus_metrics = true\n  disable_hostname   = true\n}\napm \"prometheus\" {\n  driver = \"prometheus\"\n  config = {\n    address = \"http:\/\/prometheus.opstreelabs.in:9090\"\n  }\n}\nstrategy \"target-value\" {\n  driver = \"target-value\"\n}<\/code><\/pre>\n\n\n\n<p>Once we have provided the Prometheus as the metrics store inside the Nomad server configuration, as the next part of it now we have to define the scaling policies inside the nomad jobs. Scaling policies will always be defined on the job level.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>scaling {\n      min     = 1\n      max     = 4\n      enabled = true\n      policy {\n        evaluation_interval = \"2s\"\n        cooldown            = \"5s\"\n        check \"cpu_usage\" {\n          source = \"prometheus\"\n          query  = \"avg(nomad_client_allocs_cpu_total_percent{task='api'})\"\n          strategy \"target-value\" {\n            target = 50\n          }\n        }\n      }\n    }<\/code><\/pre>\n\n\n\n<p>After configuring the scaling policies, we can test the application scaling by putting some load using tools like- <a href=\"https:\/\/httpd.apache.org\/docs\/2.4\/programs\/ab.html\" target=\"_blank\" rel=\"noreferrer noopener\">apache benchmark<\/a>, <a href=\"https:\/\/github.com\/JoeDog\/siege\" target=\"_blank\" rel=\"noreferrer noopener\">siege<\/a>, etc.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"conclusion\">Conclusion<\/h2>\n\n\n\n<p>So just like we promised in the previous blog that in the coming blog on Nomad, we will discuss the autoscaling parameters. I hope you guys have enjoyed the reading but if you have any feedback or suggestions, please reach out to me. In the upcoming blog on Nomad, we will discuss the Consul configuration for Nomad-based applications.<\/p>\n\n\n\n<p><a href=\"https:\/\/www.opstree.com\/contact-us?utm_source=blog&amp;utm_medium=wordpress+&amp;utm_campaign=Autoscaling-in-Nomad-Cluster\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Opstree<\/strong> <\/a>is an End to End DevOps solution provider<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button is-style-fill\"><a class=\"wp-block-button__link\" href=\"https:\/\/www.opstree.com\/contact-us\" target=\"_blank\" rel=\"noreferrer noopener\">CONTACT US<\/a><\/div>\n<\/div>\n\n\n\n<p class=\"has-text-align-center\"><strong>Connect Us <\/strong><\/p>\n\n\n\n<ul class=\"wp-block-social-links aligncenter is-content-justification-right is-layout-flex wp-container-core-social-links-is-layout-1 wp-block-social-links-is-layout-flex\"><li class=\"wp-social-link wp-social-link-linkedin  wp-block-social-link\"><a href=\"https:\/\/www.linkedin.com\/company\/opstree-solutions\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">LinkedIn<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-youtube  wp-block-social-link\"><a href=\"https:\/\/www.youtube.com\/channel\/UCeLma6SpNYH7jjYKSBNSexw\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">YouTube<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-github  wp-block-social-link\"><a href=\"https:\/\/github.com\/OpsTree\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">GitHub<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-facebook  wp-block-social-link\"><a href=\"https:\/\/www.facebook.com\/opstree\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Facebook<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-medium  wp-block-social-link\"><a href=\"https:\/\/medium.com\/buildpiper\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M20.962,7.257l-5.457,8.867l-3.923-6.375l3.126-5.08c0.112-0.182,0.319-0.286,0.527-0.286c0.05,0,0.1,0.008,0.149,0.02 c0.039,0.01,0.078,0.023,0.114,0.041l5.43,2.715l0.006,0.003c0.004,0.002,0.007,0.006,0.011,0.008 C20.971,7.191,20.98,7.227,20.962,7.257z M9.86,8.592v5.783l5.14,2.57L9.86,8.592z M15.772,17.331l4.231,2.115 C20.554,19.721,21,19.529,21,19.016V8.835L15.772,17.331z M8.968,7.178L3.665,4.527C3.569,4.479,3.478,4.456,3.395,4.456 C3.163,4.456,3,4.636,3,4.938v11.45c0,0.306,0.224,0.669,0.498,0.806l4.671,2.335c0.12,0.06,0.234,0.088,0.337,0.088 c0.29,0,0.494-0.225,0.494-0.602V7.231C9,7.208,8.988,7.188,8.968,7.178z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Medium<\/span><\/a><\/li><\/ul>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>We are living in the microservice era, where we have a number of applications to support a business model. But our application success cannot be determined by the features only, it should have a scalable model as well. Otherwise, something like this would happen:- When we generally talk about the scaling in the microservices, people &hellip; <a href=\"https:\/\/opstree.com\/blog\/2022\/02\/01\/autoscaling-in-nomad-cluster\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Autoscaling in Nomad Cluster&#8221;<\/span><\/a><\/p>\n","protected":false},"author":89038429,"featured_media":29900,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[28070474],"tags":[44070,1804072,768739308,138063,448419,768739287],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2025\/11\/DevSecOps-1.jpg","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfDBOm-2xO","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/9784"}],"collection":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/users\/89038429"}],"replies":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/comments?post=9784"}],"version-history":[{"count":11,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/9784\/revisions"}],"predecessor-version":[{"id":9832,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/9784\/revisions\/9832"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media\/29900"}],"wp:attachment":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media?parent=9784"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/categories?post=9784"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/tags?post=9784"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}