Skip to content

Repository files navigation

PHPA: Poor man's Horizontal Pod Autoscaler

PHPA takes metrics from our InfluxDB and Graphite and then scales a deployment based on those metrics.

Before building PHPA, we actually looked at Horizontal Pod Autoscaler but we found that it only scales based on CPU and Memory usage whereas our needs were different. We wanted to scale based on metrics present in our monitoring systems (Graphite and InfluxDB). After looking into custom metrics for HPA, we figured out that it was very complicated, was mostly tied to Prometheus, didn't have great support for Graphite, and also required knowledge of GoLang.

Also during the time, Knative was released. After looking into it, we figured out that it was still in alpha and required running multiple components, which would eventually result in operational complexity.

Hence, we decided to build PHPA.

Read more on how we built PHPA on our blog: Introducing PHPA: Our Kubernetes Horizontal Pod Autoscaler

Deployment

Service Account (One Time Setup)

  • Setup phpa-service-account using setup-access.yaml
  • Check for service account kubectl get serviceaccount phpa-service-account

Deploy

At Clarisights, we run PHPA as a Kubernetes deployment in same cluster as the deployment PHPA is auto-scaling. You can even run it as a Kubernetes CronJob.

  1. Build Docker image
docker build -t phpa:latest https://github.com/clarisights/phpa.git
  1. Push Docker image to your container registry
  2. Create config map from file with your PHPA config files
kubectl create configmap phpa-configs --from-file <configs_dir>/ --dry-run -o yaml
  1. Mount config map in your PHPA cronjob/deployment
  2. Deploy

Look in examples folder for example configs and deployment files.

Contributing

Clarisights uses GitHub to manage reviews of pull requests.

PHPA is written in Ruby. You need to install Ruby and Bundler - check Dockerfile for the instructions.

  1. Fork this repo
  2. Create a branch and add your features
  3. Send your Pull Requests and tag contributors for review

We use Rspec for testing.

Have questions or problems using PHPA?

  • Create an issue and tag contributors

Future Plans

Eventually, we would want to migrate PHPA to a Custom Kubernetes Controller and use Kubernetes CRD (CustomResourceDefinition) for PHPAConfig. Along with that having support for more metric server adaptors would be nice to have as well.

Other Info

About

[Poor man's Horizontal] Kubernetes Pod Autoscaler with InfluxDB and Graphite as metric source

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - electron0zero/phpa: [Poor man's Horizontal] Kubernetes Pod Autoscaler with InfluxDB and Graphite as metric source · GitHub
Skip to content

Repository files navigation

PHPA: Poor man's Horizontal Pod Autoscaler

PHPA takes metrics from our InfluxDB and Graphite and then scales a deployment based on those metrics.

Before building PHPA, we actually looked at Horizontal Pod Autoscaler but we found that it only scales based on CPU and Memory usage whereas our needs were different. We wanted to scale based on metrics present in our monitoring systems (Graphite and InfluxDB). After looking into custom metrics for HPA, we figured out that it was very complicated, was mostly tied to Prometheus, didn't have great support for Graphite, and also required knowledge of GoLang.

Also during the time, Knative was released. After looking into it, we figured out that it was still in alpha and required running multiple components, which would eventually result in operational complexity.

Hence, we decided to build PHPA.

Read more on how we built PHPA on our blog: Introducing PHPA: Our Kubernetes Horizontal Pod Autoscaler

Deployment

Service Account (One Time Setup)

  • Setup phpa-service-account using setup-access.yaml
  • Check for service account kubectl get serviceaccount phpa-service-account

Deploy

At Clarisights, we run PHPA as a Kubernetes deployment in same cluster as the deployment PHPA is auto-scaling. You can even run it as a Kubernetes CronJob.

  1. Build Docker image
docker build -t phpa:latest https://github.com/clarisights/phpa.git
  1. Push Docker image to your container registry
  2. Create config map from file with your PHPA config files
kubectl create configmap phpa-configs --from-file <configs_dir>/ --dry-run -o yaml
  1. Mount config map in your PHPA cronjob/deployment
  2. Deploy

Look in examples folder for example configs and deployment files.

Contributing

Clarisights uses GitHub to manage reviews of pull requests.

PHPA is written in Ruby. You need to install Ruby and Bundler - check Dockerfile for the instructions.

  1. Fork this repo
  2. Create a branch and add your features
  3. Send your Pull Requests and tag contributors for review

We use Rspec for testing.

Have questions or problems using PHPA?

  • Create an issue and tag contributors

Future Plans

Eventually, we would want to migrate PHPA to a Custom Kubernetes Controller and use Kubernetes CRD (CustomResourceDefinition) for PHPAConfig. Along with that having support for more metric server adaptors would be nice to have as well.

Other Info

About

[Poor man's Horizontal] Kubernetes Pod Autoscaler with InfluxDB and Graphite as metric source

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - electron0zero/phpa: [Poor man's Horizontal] Kubernetes Pod Autoscaler with InfluxDB and Graphite as metric source · GitHub
Skip to content

Repository files navigation

PHPA: Poor man's Horizontal Pod Autoscaler

PHPA takes metrics from our InfluxDB and Graphite and then scales a deployment based on those metrics.

Before building PHPA, we actually looked at Horizontal Pod Autoscaler but we found that it only scales based on CPU and Memory usage whereas our needs were different. We wanted to scale based on metrics present in our monitoring systems (Graphite and InfluxDB). After looking into custom metrics for HPA, we figured out that it was very complicated, was mostly tied to Prometheus, didn't have great support for Graphite, and also required knowledge of GoLang.

Also during the time, Knative was released. After looking into it, we figured out that it was still in alpha and required running multiple components, which would eventually result in operational complexity.

Hence, we decided to build PHPA.

Read more on how we built PHPA on our blog: Introducing PHPA: Our Kubernetes Horizontal Pod Autoscaler

Deployment

Service Account (One Time Setup)

  • Setup phpa-service-account using setup-access.yaml
  • Check for service account kubectl get serviceaccount phpa-service-account

Deploy

At Clarisights, we run PHPA as a Kubernetes deployment in same cluster as the deployment PHPA is auto-scaling. You can even run it as a Kubernetes CronJob.

  1. Build Docker image
docker build -t phpa:latest https://github.com/clarisights/phpa.git
  1. Push Docker image to your container registry
  2. Create config map from file with your PHPA config files
kubectl create configmap phpa-configs --from-file <configs_dir>/ --dry-run -o yaml
  1. Mount config map in your PHPA cronjob/deployment
  2. Deploy

Look in examples folder for example configs and deployment files.

Contributing

Clarisights uses GitHub to manage reviews of pull requests.

PHPA is written in Ruby. You need to install Ruby and Bundler - check Dockerfile for the instructions.

  1. Fork this repo
  2. Create a branch and add your features
  3. Send your Pull Requests and tag contributors for review

We use Rspec for testing.

Have questions or problems using PHPA?

  • Create an issue and tag contributors

Future Plans

Eventually, we would want to migrate PHPA to a Custom Kubernetes Controller and use Kubernetes CRD (CustomResourceDefinition) for PHPAConfig. Along with that having support for more metric server adaptors would be nice to have as well.

Other Info

About

[Poor man's Horizontal] Kubernetes Pod Autoscaler with InfluxDB and Graphite as metric source

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - electron0zero/phpa: [Poor man's Horizontal] Kubernetes Pod Autoscaler with InfluxDB and Graphite as metric source · GitHub
Skip to content

Repository files navigation

PHPA: Poor man's Horizontal Pod Autoscaler

PHPA takes metrics from our InfluxDB and Graphite and then scales a deployment based on those metrics.

Before building PHPA, we actually looked at Horizontal Pod Autoscaler but we found that it only scales based on CPU and Memory usage whereas our needs were different. We wanted to scale based on metrics present in our monitoring systems (Graphite and InfluxDB). After looking into custom metrics for HPA, we figured out that it was very complicated, was mostly tied to Prometheus, didn't have great support for Graphite, and also required knowledge of GoLang.

Also during the time, Knative was released. After looking into it, we figured out that it was still in alpha and required running multiple components, which would eventually result in operational complexity.

Hence, we decided to build PHPA.

Read more on how we built PHPA on our blog: Introducing PHPA: Our Kubernetes Horizontal Pod Autoscaler

Deployment

Service Account (One Time Setup)

  • Setup phpa-service-account using setup-access.yaml
  • Check for service account kubectl get serviceaccount phpa-service-account

Deploy

At Clarisights, we run PHPA as a Kubernetes deployment in same cluster as the deployment PHPA is auto-scaling. You can even run it as a Kubernetes CronJob.

  1. Build Docker image
docker build -t phpa:latest https://github.com/clarisights/phpa.git
  1. Push Docker image to your container registry
  2. Create config map from file with your PHPA config files
kubectl create configmap phpa-configs --from-file <configs_dir>/ --dry-run -o yaml
  1. Mount config map in your PHPA cronjob/deployment
  2. Deploy

Look in examples folder for example configs and deployment files.

Contributing

Clarisights uses GitHub to manage reviews of pull requests.

PHPA is written in Ruby. You need to install Ruby and Bundler - check Dockerfile for the instructions.

  1. Fork this repo
  2. Create a branch and add your features
  3. Send your Pull Requests and tag contributors for review

We use Rspec for testing.

Have questions or problems using PHPA?

  • Create an issue and tag contributors

Future Plans

Eventually, we would want to migrate PHPA to a Custom Kubernetes Controller and use Kubernetes CRD (CustomResourceDefinition) for PHPAConfig. Along with that having support for more metric server adaptors would be nice to have as well.

Other Info

About

[Poor man's Horizontal] Kubernetes Pod Autoscaler with InfluxDB and Graphite as metric source

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - electron0zero/phpa: [Poor man's Horizontal] Kubernetes Pod Autoscaler with InfluxDB and Graphite as metric source · GitHub
Skip to content

Repository files navigation

PHPA: Poor man's Horizontal Pod Autoscaler

PHPA takes metrics from our InfluxDB and Graphite and then scales a deployment based on those metrics.

Before building PHPA, we actually looked at Horizontal Pod Autoscaler but we found that it only scales based on CPU and Memory usage whereas our needs were different. We wanted to scale based on metrics present in our monitoring systems (Graphite and InfluxDB). After looking into custom metrics for HPA, we figured out that it was very complicated, was mostly tied to Prometheus, didn't have great support for Graphite, and also required knowledge of GoLang.

Also during the time, Knative was released. After looking into it, we figured out that it was still in alpha and required running multiple components, which would eventually result in operational complexity.

Hence, we decided to build PHPA.

Read more on how we built PHPA on our blog: Introducing PHPA: Our Kubernetes Horizontal Pod Autoscaler

Deployment

Service Account (One Time Setup)

  • Setup phpa-service-account using setup-access.yaml
  • Check for service account kubectl get serviceaccount phpa-service-account

Deploy

At Clarisights, we run PHPA as a Kubernetes deployment in same cluster as the deployment PHPA is auto-scaling. You can even run it as a Kubernetes CronJob.

  1. Build Docker image
docker build -t phpa:latest https://github.com/clarisights/phpa.git
  1. Push Docker image to your container registry
  2. Create config map from file with your PHPA config files
kubectl create configmap phpa-configs --from-file <configs_dir>/ --dry-run -o yaml
  1. Mount config map in your PHPA cronjob/deployment
  2. Deploy

Look in examples folder for example configs and deployment files.

Contributing

Clarisights uses GitHub to manage reviews of pull requests.

PHPA is written in Ruby. You need to install Ruby and Bundler - check Dockerfile for the instructions.

  1. Fork this repo
  2. Create a branch and add your features
  3. Send your Pull Requests and tag contributors for review

We use Rspec for testing.

Have questions or problems using PHPA?

  • Create an issue and tag contributors

Future Plans

Eventually, we would want to migrate PHPA to a Custom Kubernetes Controller and use Kubernetes CRD (CustomResourceDefinition) for PHPAConfig. Along with that having support for more metric server adaptors would be nice to have as well.

Other Info

About

[Poor man's Horizontal] Kubernetes Pod Autoscaler with InfluxDB and Graphite as metric source

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - electron0zero/phpa: [Poor man's Horizontal] Kubernetes Pod Autoscaler with InfluxDB and Graphite as metric source · GitHub
Skip to content

Repository files navigation

PHPA: Poor man's Horizontal Pod Autoscaler

PHPA takes metrics from our InfluxDB and Graphite and then scales a deployment based on those metrics.

Before building PHPA, we actually looked at Horizontal Pod Autoscaler but we found that it only scales based on CPU and Memory usage whereas our needs were different. We wanted to scale based on metrics present in our monitoring systems (Graphite and InfluxDB). After looking into custom metrics for HPA, we figured out that it was very complicated, was mostly tied to Prometheus, didn't have great support for Graphite, and also required knowledge of GoLang.

Also during the time, Knative was released. After looking into it, we figured out that it was still in alpha and required running multiple components, which would eventually result in operational complexity.

Hence, we decided to build PHPA.

Read more on how we built PHPA on our blog: Introducing PHPA: Our Kubernetes Horizontal Pod Autoscaler

Deployment

Service Account (One Time Setup)

  • Setup phpa-service-account using setup-access.yaml
  • Check for service account kubectl get serviceaccount phpa-service-account

Deploy

At Clarisights, we run PHPA as a Kubernetes deployment in same cluster as the deployment PHPA is auto-scaling. You can even run it as a Kubernetes CronJob.

  1. Build Docker image
docker build -t phpa:latest https://github.com/clarisights/phpa.git
  1. Push Docker image to your container registry
  2. Create config map from file with your PHPA config files
kubectl create configmap phpa-configs --from-file <configs_dir>/ --dry-run -o yaml
  1. Mount config map in your PHPA cronjob/deployment
  2. Deploy

Look in examples folder for example configs and deployment files.

Contributing

Clarisights uses GitHub to manage reviews of pull requests.

PHPA is written in Ruby. You need to install Ruby and Bundler - check Dockerfile for the instructions.

  1. Fork this repo
  2. Create a branch and add your features
  3. Send your Pull Requests and tag contributors for review

We use Rspec for testing.

Have questions or problems using PHPA?

  • Create an issue and tag contributors

Future Plans

Eventually, we would want to migrate PHPA to a Custom Kubernetes Controller and use Kubernetes CRD (CustomResourceDefinition) for PHPAConfig. Along with that having support for more metric server adaptors would be nice to have as well.

Other Info

About

[Poor man's Horizontal] Kubernetes Pod Autoscaler with InfluxDB and Graphite as metric source

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - electron0zero/phpa: [Poor man's Horizontal] Kubernetes Pod Autoscaler with InfluxDB and Graphite as metric source · GitHub
Skip to content

Repository files navigation

PHPA: Poor man's Horizontal Pod Autoscaler

PHPA takes metrics from our InfluxDB and Graphite and then scales a deployment based on those metrics.

Before building PHPA, we actually looked at Horizontal Pod Autoscaler but we found that it only scales based on CPU and Memory usage whereas our needs were different. We wanted to scale based on metrics present in our monitoring systems (Graphite and InfluxDB). After looking into custom metrics for HPA, we figured out that it was very complicated, was mostly tied to Prometheus, didn't have great support for Graphite, and also required knowledge of GoLang.

Also during the time, Knative was released. After looking into it, we figured out that it was still in alpha and required running multiple components, which would eventually result in operational complexity.

Hence, we decided to build PHPA.

Read more on how we built PHPA on our blog: Introducing PHPA: Our Kubernetes Horizontal Pod Autoscaler

Deployment

Service Account (One Time Setup)

  • Setup phpa-service-account using setup-access.yaml
  • Check for service account kubectl get serviceaccount phpa-service-account

Deploy

At Clarisights, we run PHPA as a Kubernetes deployment in same cluster as the deployment PHPA is auto-scaling. You can even run it as a Kubernetes CronJob.

  1. Build Docker image
docker build -t phpa:latest https://github.com/clarisights/phpa.git
  1. Push Docker image to your container registry
  2. Create config map from file with your PHPA config files
kubectl create configmap phpa-configs --from-file <configs_dir>/ --dry-run -o yaml
  1. Mount config map in your PHPA cronjob/deployment
  2. Deploy

Look in examples folder for example configs and deployment files.

Contributing

Clarisights uses GitHub to manage reviews of pull requests.

PHPA is written in Ruby. You need to install Ruby and Bundler - check Dockerfile for the instructions.

  1. Fork this repo
  2. Create a branch and add your features
  3. Send your Pull Requests and tag contributors for review

We use Rspec for testing.

Have questions or problems using PHPA?

  • Create an issue and tag contributors

Future Plans

Eventually, we would want to migrate PHPA to a Custom Kubernetes Controller and use Kubernetes CRD (CustomResourceDefinition) for PHPAConfig. Along with that having support for more metric server adaptors would be nice to have as well.

Other Info

About

[Poor man's Horizontal] Kubernetes Pod Autoscaler with InfluxDB and Graphite as metric source

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - electron0zero/phpa: [Poor man's Horizontal] Kubernetes Pod Autoscaler with InfluxDB and Graphite as metric source · GitHub
Skip to content

Repository files navigation

PHPA: Poor man's Horizontal Pod Autoscaler

PHPA takes metrics from our InfluxDB and Graphite and then scales a deployment based on those metrics.

Before building PHPA, we actually looked at Horizontal Pod Autoscaler but we found that it only scales based on CPU and Memory usage whereas our needs were different. We wanted to scale based on metrics present in our monitoring systems (Graphite and InfluxDB). After looking into custom metrics for HPA, we figured out that it was very complicated, was mostly tied to Prometheus, didn't have great support for Graphite, and also required knowledge of GoLang.

Also during the time, Knative was released. After looking into it, we figured out that it was still in alpha and required running multiple components, which would eventually result in operational complexity.

Hence, we decided to build PHPA.

Read more on how we built PHPA on our blog: Introducing PHPA: Our Kubernetes Horizontal Pod Autoscaler

Deployment

Service Account (One Time Setup)

  • Setup phpa-service-account using setup-access.yaml
  • Check for service account kubectl get serviceaccount phpa-service-account

Deploy

At Clarisights, we run PHPA as a Kubernetes deployment in same cluster as the deployment PHPA is auto-scaling. You can even run it as a Kubernetes CronJob.

  1. Build Docker image
docker build -t phpa:latest https://github.com/clarisights/phpa.git
  1. Push Docker image to your container registry
  2. Create config map from file with your PHPA config files
kubectl create configmap phpa-configs --from-file <configs_dir>/ --dry-run -o yaml
  1. Mount config map in your PHPA cronjob/deployment
  2. Deploy

Look in examples folder for example configs and deployment files.

Contributing

Clarisights uses GitHub to manage reviews of pull requests.

PHPA is written in Ruby. You need to install Ruby and Bundler - check Dockerfile for the instructions.

  1. Fork this repo
  2. Create a branch and add your features
  3. Send your Pull Requests and tag contributors for review

We use Rspec for testing.

Have questions or problems using PHPA?

  • Create an issue and tag contributors

Future Plans

Eventually, we would want to migrate PHPA to a Custom Kubernetes Controller and use Kubernetes CRD (CustomResourceDefinition) for PHPAConfig. Along with that having support for more metric server adaptors would be nice to have as well.

Other Info

About

[Poor man's Horizontal] Kubernetes Pod Autoscaler with InfluxDB and Graphite as metric source

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages