If we had to fit every lesson from the three series (the three-tier Cloud VPS, Kubernetes for Website AI on Linode, and the operational incidents) onto a single page, we would choose an infrastructure maintenance checklist. Most incidents in Series 3 did not come from difficult technology, but from small tasks nobody did regularly: cron jobs pointing at removed machines, a database dying without an alert, cluster components installed once and then left alone. This final article has two parts: an infrastructure maintenance schedule by day, week, month and quarter, with how to check each task and the related article; and how to manage technical debt, including the most common kinds of debt and the order in which to pay them off.

1. Why infrastructure maintenance needs a checklist

Rereading the incident articles, three kinds of infrastructure maintenance failure keep repeating:

None of the three needs a new tool. They need an infrastructure maintenance schedule with an owner and verifiable outputs. Each row below has a concrete way to check it and a related article to reread when needed.

2. Daily infrastructure maintenance (10–15 minutes)

Daily infrastructure maintenance has a single goal: no incident lasts overnight without anyone knowing.

TaskHow to checkRelated article
Read the alert channel: machines down, disk, MySQL, RedisNo alert has been firing for more than 24 hours without an ownera minimum Prometheus alert set
Last night's backupsEvery backup job is green; file sizes have not dropped abnormally compared with the day beforedatabase backups with rclone, backing up the whole cluster
Cron jobs failing repeatedlyAny job that has failed 3 or more times in a rowJenkins as the control plane
Container restarts, OOMKilledkubectl get pods -A sorted by restart count; compare with yesterdayOOMKilled and 503
5xx, 429 and 499 rates per balancerThe nginx log dashboard on Lokishipping logs to Loki with Fluent Bit

3. Weekly infrastructure maintenance (1 hour)

Weekly infrastructure maintenance looks for things that are getting worse before they become incidents.

TaskHow to checkRelated article
Certificates about to expireopenssl x509 -checkend 2592000 on the balancers; kubectl get certificate,order -A to find ones that are not ReadySSL with Certbot, automatic HTTPS with cert-manager
Disks and logsWhich machines are above 80%; the largest /var/log; which error logs are growing fastthe bloated MySQL error.log
Top nginx and PHP-FPM errorsCount upstream timed out, no live upstreams, execution timed outreading no live upstreams errors, a PHP-FPM hang
WAF false positivesWhich rule blocks the most on a legitimate hosthandling a WAF false positive
Bots and crawlersThe User-Agents and IPs responsible for the most dynamic requestsrate limiting by User-Agent

4. Monthly infrastructure maintenance (half a day)

Time to verify the things you still believe are true: backups can be restored, and nothing points at removed machines anymore.

TaskHow to checkRelated article
Test-restore a backupImport a dump into a temporary database, open the site, record the restore timepipelines with database rollback
Review references to removed machinesgrep the machine name in Jenkins job configs, Grafana rules, Prometheus targets, /etc/hostszombie cron jobs
Kubernetes cleanupReleased PVs, PVCs no pod uses, old CertificateRequests and Orders, stuck ACME solver podsPersistentVolumes and StorageClasses
Requests versus usagekubectl top pods -A compared with requests; sites off by more than 2xKubernetes right-sizing
Compare configuration across machines with the same roleWhich balancer lacks WAF, fail2ban or Fluent Bit; which minion lacks set_real_ip_fromrevisiting the Cloud VPS model
Operating system patchesPackages needing updates, machines needing a kernel reboot; schedule by group, never reboot the whole fleet at oncecloud images and cloud-init

5. Quarterly infrastructure maintenance (1–2 days)

Quarterly infrastructure maintenance is for the big tasks that need a maintenance window and a rollback plan.

TaskHow to checkRelated article
Upgrade cluster componentsCompare the versions of the ingress/gateway, cert-manager, metrics-server and kube-prometheus-stack with supported releases; try them on a test cluster firstthe Gateway API pilot and rollback, NGINX Gateway Fabric
Alerting drillStop an exporter on a test machine in a controlled way, measure the time until a message arrivestesting rules with promtool
Rotate secrets and review permissionsCI tokens, kubeconfigs, database passwords; ClusterRoleBindings for ServiceAccounts that no longer exista kubeconfig committed by mistake
Review open portsScan from outside the network: data services (3306, 6379, NFS) and admin pages only listen on the networks they needNginx security
End-of-support versionsPHP, MySQL, the operating system, charts; draw up a roadmap for each group of sitesPHP 7.4 end of life

6. Managing technical debt: the infrastructure maintenance that was postponed

Technical debt is the infrastructure maintenance work you know is needed but have postponed. It can only be managed once it is written down. Each entry in the debt register should have: a description, the risk if it is not paid, how to verify it has been paid, an owner and a deadline. Security-related entries are recorded only in summary in the shared register, with the details kept in a private channel.

The most common kinds of debt, and how to detect them:

GroupExamplesHow to detect
Data lossNo binlog, no replica; multipart failures when backing up large files; JENKINS_HOME and NFS without backupsTest restores; list every place that holds data and compare it with the backup schedule
Not knowing when things breakNo Alertmanager; no mysqld_exporter; Loki without a persistent volumeDrills: stop a component and see whether a message arrives
Disks about to fill upTest clone databases, old dumps, unrotated logsdf -h, du -sh /var/lib/mysql/*, predict_linear rules
Inconsistent securityOne balancer has WAF, another does not; sensitive data in ConfigMaps instead of Secrets; LOG_LEVEL=debug in production; cluster-admin rights left dangling for deleted ServiceAccountsCompare configuration across machines with the same role; kubectl get clusterrolebinding -o wide
Single points of failureA single-replica ingress controller; single-replica websites without a PodDisruptionBudget; leftover shared PHP-FPM poolsDrill a node recycle and count the interrupted sites
Old versionsCluster components still at the first revision since install; images pulled from an old registry that only run thanks to the node cache (see the announcement of the move to registry.k8s.io)helm list -A; list images by registry
Junk and costReleased volumes still billed; hundreds of old CertificateRequests; CRDs from tools tried and abandoned; a placeholder pod PriorityClass with the wrong value (see PriorityClass and placeholder pods: reserving capacity in a cluster)kubectl get pv,certificaterequest,crd on a schedule
Operations outside GitJenkins jobs that do not load their definition from Git; hand-edited mysqld.cnfTry to answer: "when was this configuration last changed, and by whom?"

7. The order in which to pay off infrastructure maintenance debt

  1. Data loss first: backups for every place that holds data, fix failing backups, test restores. Without backups, nothing else matters.
  2. Know when things break: up == 0, disk and MySQL alerts, Alertmanager and drills. This is usually the cheapest item on the list.
  3. Disks about to fill up: clean up clone databases, old dumps and unrotated logs. A full disk is an incident on a timer.
  4. Security: narrow the open ports, move sensitive configuration into Secrets, remove dangling permissions, make WAF and fail2ban consistent.
  5. Upgrades: a roadmap for the ingress controller, cert-manager, metrics-server, and end-of-support MySQL and PHP.
  6. Cleanup and cost optimization: Released volumes, CRDs, CertificateRequests, right-sizing.

This order puts irreversible risks (data loss, data exposure) ahead of risks that can be fixed later (slowness, cost). Review the debt register in the monthly infrastructure maintenance session: overdue entries are either done right away or given a clear reason for the delay and a new deadline. An entry without an owner will still be sitting in the register at the next review.

8. Looking back at the three series

What all three have in common: infrastructure does not break because of one big wrong decision, but because many small infrastructure maintenance tasks were postponed. This checklist is a way to put those tasks back on the weekly schedule.

Series wrap-up

Infrastructure maintenance has no finish line, but a series does. This is the last article of Series 3 and of the whole three-series set on Sudo's infrastructure. Thank you for reading this far. All the articles are collected in Sudo's DevOps category; if this infrastructure maintenance checklist saves your system from even one incident, it has done its job.