# Andika Ahmad Ramadhan -- Blog

Notes on running Kubernetes, autoscaling, and internal platforms.

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## pproxy: a forward proxy that load-balances a pool of upstream proxies

DevFeed: [pproxy: a forward proxy that load-balances a pool of upstream proxies](<https://devfeed.tech/articles/pproxy-a-forward-proxy-that-load-balances-a-pool-of-upstream-proxies-34032.md>)

Original publisher: [Read original article](<https://andikaahmad.com/blog/pproxy/>)

Published: 2026-06-22T00:00:00Z

Content type: article

Language: en

Sources: [Andika Ahmad Ramadhan -- Blog](<https://devfeed.tech/sources/andika-ahmad-ramadhan-blog.md>)

Topics: [proxy](<https://devfeed.tech/topics/proxy.md>), [client](<https://devfeed.tech/topics/client.md>), [health checks](<https://devfeed.tech/topics/health-checks.md>), [HTTP](<https://devfeed.tech/topics/http.md>)

Tags: [client](<https://devfeed.tech/tags/client.md>), [health](<https://devfeed.tech/tags/health.md>), [health-checks](<https://devfeed.tech/tags/health-checks.md>), [http](<https://devfeed.tech/tags/http.md>), [prometheus](<https://devfeed.tech/tags/prometheus.md>), [proxy](<https://devfeed.tech/tags/proxy.md>), [reload](<https://devfeed.tech/tags/reload.md>), [round-robin](<https://devfeed.tech/tags/round-robin.md>), [socks5](<https://devfeed.tech/tags/socks5.md>), [tls](<https://devfeed.tech/tags/tls.md>)

### AI overview

This article presents pproxy, a forward proxy that distributes client traffic across upstream proxies. It describes active health checks, round-robin selection, failover within requests, hot configuration reloads, per-user authentication, and Prometheus metrics.

### Source excerpt

pproxy is a forward proxy that load-balances client traffic across a pool of upstream proxies with active health checks and hot config reload, so switching proxy providers means editing one config file instead of every client.

## Moving Thanos from GCS to Huawei OBS, and fixing a multipart upload bug on the way

DevFeed: [Moving Thanos from GCS to Huawei OBS, and fixing a multipart upload bug on the way](<https://devfeed.tech/articles/moving-thanos-from-gcs-to-huawei-obs-and-fixing-a-multipart-upload-bug-on-the-way-34034.md>)

Original publisher: [Read original article](<https://andikaahmad.com/blog/thanos-objstore-huawei-obs/>)

Published: 2025-10-20T00:00:00Z

Content type: article

Language: en

Sources: [Andika Ahmad Ramadhan -- Blog](<https://devfeed.tech/sources/andika-ahmad-ramadhan-blog.md>)

Topics: [huawei](<https://devfeed.tech/topics/huawei.md>), [migration](<https://devfeed.tech/topics/migration.md>), [bug](<https://devfeed.tech/topics/bug.md>), [Cloud](<https://devfeed.tech/topics/cloud.md>), [Google Cloud Platform (GCP)](<https://devfeed.tech/topics/google-cloud.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [bug](<https://devfeed.tech/tags/bug.md>), [cloud](<https://devfeed.tech/tags/cloud.md>), [cloud-storage](<https://devfeed.tech/tags/cloud-storage.md>), [code](<https://devfeed.tech/tags/code.md>), [google](<https://devfeed.tech/tags/google.md>), [google-cloud](<https://devfeed.tech/tags/google-cloud.md>), [huawei](<https://devfeed.tech/tags/huawei.md>), [migration](<https://devfeed.tech/tags/migration.md>)

### AI overview

This article describes migrating Thanos object storage from Google Cloud Storage to Huawei Cloud OBS. The migration exposed two multipart upload bugs in the OBS provider: a zero-value part size and a content-length mismatch. A patch addressed both issues, although the upstream change was still under review when the article was written.

### Source excerpt

What broke when Thanos blocks started landing in Huawei Cloud OBS instead of Google Cloud Storage, and the objstore patch that fixed it.

## One Go API over every SCM: go-scm in the internal developer platform

DevFeed: [One Go API over every SCM: go-scm in the internal developer platform](<https://devfeed.tech/articles/one-go-api-over-every-scm-go-scm-in-the-internal-developer-platform-34028.md>)

Original publisher: [Read original article](<https://andikaahmad.com/blog/go-scm-multi-scm/>)

Published: 2025-08-10T00:00:00Z

Content type: article

Language: en

Sources: [Andika Ahmad Ramadhan -- Blog](<https://devfeed.tech/sources/andika-ahmad-ramadhan-blog.md>)

Topics: [internal developer platform](<https://devfeed.tech/topics/internal-developer-platform.md>), [bitbucket](<https://devfeed.tech/topics/bitbucket.md>), [Go Language](<https://devfeed.tech/topics/go-language.md>), [GitHub](<https://devfeed.tech/topics/github.md>), [API](<https://devfeed.tech/topics/api.md>)

Tags: [api](<https://devfeed.tech/tags/api.md>), [bitbucket](<https://devfeed.tech/tags/bitbucket.md>), [github](<https://devfeed.tech/tags/github.md>), [go](<https://devfeed.tech/tags/go.md>), [internal-developer-platform](<https://devfeed.tech/tags/internal-developer-platform.md>), [pull-requests](<https://devfeed.tech/tags/pull-requests.md>), [scm](<https://devfeed.tech/tags/scm.md>)

### AI overview

The article explains how an internal developer platform can support Bitbucket Server, Bitbucket Cloud, and GitHub through the jenkins-x/go-scm Go API. It describes production fixes for provider-specific webhook, identity, pull request, pagination, permission, branch, build-status, and validation behavior.

### Source excerpt

How the IDP supports Bitbucket Server, Bitbucket Cloud, and GitHub through jenkins-x/go-scm.

## One timezone for everything: k8tz and the Jakarta timestamp problem

DevFeed: [One timezone for everything: k8tz and the Jakarta timestamp problem](<https://devfeed.tech/articles/one-timezone-for-everything-k8tz-and-the-jakarta-timestamp-problem-34030.md>)

Original publisher: [Read original article](<https://andikaahmad.com/blog/k8tz-timezone-injection/>)

Published: 2024-11-20T00:00:00Z

Content type: article

Language: en

Sources: [Andika Ahmad Ramadhan -- Blog](<https://devfeed.tech/sources/andika-ahmad-ramadhan-blog.md>)

Topics: [Kubernetes admission controller](<https://devfeed.tech/topics/kubernetes-admission-controller.md>), [timezone](<https://devfeed.tech/topics/timezone.md>), [certificates](<https://devfeed.tech/topics/certificates.md>), [TLS (Transport Layer Security)](<https://devfeed.tech/topics/tls.md>), [elasticsearch](<https://devfeed.tech/topics/elasticsearch.md>)

Tags: [certificates](<https://devfeed.tech/tags/certificates.md>), [elasticsearch](<https://devfeed.tech/tags/elasticsearch.md>), [kubernetes-admission-controller](<https://devfeed.tech/tags/kubernetes-admission-controller.md>), [timezone](<https://devfeed.tech/tags/timezone.md>), [tls](<https://devfeed.tech/tags/tls.md>)

### AI overview

The article explains how k8tz applies Asia/Jakarta to Kubernetes pods through an admission controller, allowing public images such as Fluentd and Elasticsearch to use the platform timezone without image changes. It also describes three upstream patches for cert-manager support, certificate rotation without restarts, and configurable initContainer names.

### Source excerpt

How we used k8tz to force Asia/Jakarta onto public images like Fluentd and Elasticsearch, and the three patches I sent upstream.

## Cutting over-provisioning with KEDA: cron, external triggers, and a Selenium Grid queue

DevFeed: [Cutting over-provisioning with KEDA: cron, external triggers, and a Selenium Grid queue](<https://devfeed.tech/articles/cutting-over-provisioning-with-keda-cron-external-triggers-and-a-selenium-grid-queue-34031.md>)

Original publisher: [Read original article](<https://andikaahmad.com/blog/keda-autoscaling/>)

Published: 2024-09-04T00:00:00Z

Content type: article

Language: en

Sources: [Andika Ahmad Ramadhan -- Blog](<https://devfeed.tech/sources/andika-ahmad-ramadhan-blog.md>)

Topics: [autoscaling](<https://devfeed.tech/topics/autoscaling.md>), [Kubernetes](<https://devfeed.tech/topics/kubernetes.md>), [Selenium](<https://devfeed.tech/topics/selenium.md>), [Testing](<https://devfeed.tech/topics/testing.md>), [HashiCorp Vault](<https://devfeed.tech/topics/hashicorp-vault.md>), [migration](<https://devfeed.tech/topics/migration.md>), [Prometheus](<https://devfeed.tech/topics/prometheus.md>)

Tags: [autoscaling](<https://devfeed.tech/tags/autoscaling.md>), [cost](<https://devfeed.tech/tags/cost.md>), [hashicorp-vault](<https://devfeed.tech/tags/hashicorp-vault.md>), [kubernetes](<https://devfeed.tech/tags/kubernetes.md>), [migration](<https://devfeed.tech/tags/migration.md>), [prometheus](<https://devfeed.tech/tags/prometheus.md>), [selenium](<https://devfeed.tech/tags/selenium.md>), [testing](<https://devfeed.tech/tags/testing.md>)

### AI overview

An experience report on using KEDA cron and external scalers to reduce idle Kubernetes capacity. It describes scaling workloads by schedules, queue depth, and Prometheus queries, including a Selenium Grid whose browser nodes scale with queued test sessions. The article also discusses migration from VMs to Kubernetes and a Vault-related operator bug discovered in production.

### Source excerpt

How I used KEDA cron scalers, external triggers, and Selenium Grid queue scalers to stop paying for idle replicas in production.

## Running a k0s cluster with the GCP cloud controller for internal tooling

DevFeed: [Running a k0s cluster with the GCP cloud controller for internal tooling](<https://devfeed.tech/articles/running-a-k0s-cluster-with-the-gcp-cloud-controller-for-internal-tooling-34029.md>)

Original publisher: [Read original article](<https://andikaahmad.com/blog/k0s-gcp-cloud-controller/>)

Published: 2024-03-12T00:00:00Z

Content type: tutorial

Language: en

Sources: [Andika Ahmad Ramadhan -- Blog](<https://devfeed.tech/sources/andika-ahmad-ramadhan-blog.md>)

Topics: [Kubernetes](<https://devfeed.tech/topics/kubernetes.md>), [Cloud](<https://devfeed.tech/topics/cloud.md>), [Orchestration](<https://devfeed.tech/topics/orchestration.md>), [Tooling](<https://devfeed.tech/topics/tooling.md>)

Tags: [cloud](<https://devfeed.tech/tags/cloud.md>), [clusters](<https://devfeed.tech/tags/clusters.md>), [credentials](<https://devfeed.tech/tags/credentials.md>), [gcp](<https://devfeed.tech/tags/gcp.md>), [internal-tools](<https://devfeed.tech/tags/internal-tools.md>), [kubernetes](<https://devfeed.tech/tags/kubernetes.md>), [orchestration](<https://devfeed.tech/tags/orchestration.md>)

### AI overview

An account of building a k0s cluster for internal tooling on GCP and integrating the GCP cloud controller manager. It covers provider IDs, node reconciliation, credential scoping, load balancers, and the practical lessons learned while configuring the cluster.

### Source excerpt

Why I picked k0s for an internal utility cluster, and what wiring the GCP cloud controller manager into it actually involved.

## Operator-style Prometheus config segregation

DevFeed: [Operator-style Prometheus config segregation](<https://devfeed.tech/articles/operator-style-prometheus-config-segregation-34033.md>)

Original publisher: [Read original article](<https://andikaahmad.com/blog/prometheus-config-merger/>)

Published: 2023-01-15T00:00:00Z

Content type: tutorial

Language: en

Sources: [Andika Ahmad Ramadhan -- Blog](<https://devfeed.tech/sources/andika-ahmad-ramadhan-blog.md>)

Topics: [Prometheus](<https://devfeed.tech/topics/prometheus.md>), [Monitoring](<https://devfeed.tech/topics/monitoring.md>), [Kubernetes](<https://devfeed.tech/topics/kubernetes.md>), [Deployment](<https://devfeed.tech/topics/deployment.md>)

Tags: [combines](<https://devfeed.tech/tags/combines.md>), [config](<https://devfeed.tech/tags/config.md>), [files](<https://devfeed.tech/tags/files.md>), [kubernetes](<https://devfeed.tech/tags/kubernetes.md>), [prometheus](<https://devfeed.tech/tags/prometheus.md>), [reload](<https://devfeed.tech/tags/reload.md>), [server](<https://devfeed.tech/tags/server.md>), [sidecar](<https://devfeed.tech/tags/sidecar.md>)

### AI overview

This article introduces prometheus-config-merger, a tool that combines selected configuration fields from an existing Prometheus setup with configuration generated by prometheus-operator. It supports one-shot operation and watch-and-reload mode, including deployment as a Kubernetes sidecar.

### Source excerpt

prometheus-config-merger combines config files from your existing Prometheus server and prometheus-operator into one, so you get per-team config segregation without handing your Prometheus over to the operator.

## x-depulso: capturing packets in Go to feed an ML traffic classifier

DevFeed: [x-depulso: capturing packets in Go to feed an ML traffic classifier](<https://devfeed.tech/articles/x-depulso-capturing-packets-in-go-to-feed-an-ml-traffic-classifier-34035.md>)

Original publisher: [Read original article](<https://andikaahmad.com/blog/x-depulso/>)

Published: 2021-07-25T00:00:00Z

Content type: article

Language: en

Sources: [Andika Ahmad Ramadhan -- Blog](<https://devfeed.tech/sources/andika-ahmad-ramadhan-blog.md>)

Topics: [Go Language](<https://devfeed.tech/topics/go-language.md>), [Programming](<https://devfeed.tech/topics/programming.md>), [Network](<https://devfeed.tech/topics/network.md>), [Machine Learning & Artificial Intelligence](<https://devfeed.tech/topics/machine-learning-artificial-intelligence.md>), [Kafka](<https://devfeed.tech/topics/kafka.md>), [Java](<https://devfeed.tech/topics/java.md>)

Tags: [go](<https://devfeed.tech/tags/go.md>), [java](<https://devfeed.tech/tags/java.md>), [kafka](<https://devfeed.tech/tags/kafka.md>), [machine-learning](<https://devfeed.tech/tags/machine-learning.md>), [network](<https://devfeed.tech/tags/network.md>), [programming](<https://devfeed.tech/tags/programming.md>)

### AI overview

This article describes x-depulso, a small Go sensor built for a university final project. It captures packets from a network interface, rotates them into bounded pcap files, sends each file through the Java-based CICFlowMeter to produce flow statistics, and streams those results to Kafka for machine-learning traffic classification.

### Source excerpt

x-depulso is a small Go sensor that rotates packet captures off a network interface and runs each file through CICFlowMeter, turning raw traffic into flow statistics for a machine-learning classifier. Built for my university final project, and my first real Go system programming.

## Managing homelab DNS through an API with coredns-helper

DevFeed: [Managing homelab DNS through an API with coredns-helper](<https://devfeed.tech/articles/managing-homelab-dns-through-an-api-with-coredns-helper-34027.md>)

Original publisher: [Read original article](<https://andikaahmad.com/blog/coredns-helper/>)

Published: 2020-08-15T00:00:00Z

Content type: tutorial

Language: en

Sources: [Andika Ahmad Ramadhan -- Blog](<https://devfeed.tech/sources/andika-ahmad-ramadhan-blog.md>)

Topics: [Homelab](<https://devfeed.tech/topics/homelab.md>), [API](<https://devfeed.tech/topics/api.md>), [cURL](<https://devfeed.tech/topics/curl.md>), [SQLite](<https://devfeed.tech/topics/sqlite.md>), [Go](<https://devfeed.tech/topics/go.md>), [REST API](<https://devfeed.tech/topics/rest-api.md>), [HTTP](<https://devfeed.tech/topics/http.md>)

Tags: [api](<https://devfeed.tech/tags/api.md>), [containers](<https://devfeed.tech/tags/containers.md>), [curl](<https://devfeed.tech/tags/curl.md>), [go](<https://devfeed.tech/tags/go.md>), [homelab](<https://devfeed.tech/tags/homelab.md>), [http](<https://devfeed.tech/tags/http.md>), [rest-api](<https://devfeed.tech/tags/rest-api.md>), [server](<https://devfeed.tech/tags/server.md>), [sqlite](<https://devfeed.tech/tags/sqlite.md>)

### AI overview

This article describes coredns-helper, a small Go REST API that manages domains and records in the SQLite database used by CoreDNS. It replaces manual zone-file edits, serial updates, and reloads with API calls, allowing new DNS records to become resolvable immediately.

### Source excerpt

coredns-helper is a small Go API that manages domains and records in the SQLite database behind CoreDNS, so adding a name to my homelab DNS is a curl call instead of a zone file edit and a reload.