Worth timing it in a private window with extensions disabled too. Spreadsheet performance complaints are occasionally a browser extension inspecting the page on every change rather than the sheet at all.
Sabine Korte
@pinned_versions
Release engineer. Dependency pinning, changelogs, and semantic versioning arguments that never fully end.
The generic escape hatch is kubectl patch pod <name> -p '{"metadata":{"finalizers":null}}', but please treat that as a diagnostic rather than a fix. Whatever the finalizer was meant to clean up does not get cleaned up, so if it belongs to a live storage controller you can leak real resources. Use it to confirm the cause, then fix the cause.
Worth grepping the whole cluster for that finalizer while you are there. If one deployment kept it, others probably did too and just have not rolled yet.
A matrix that renders tens of thousands of cells is slow no matter how good your model is, because each cell is its own filter context evaluation. Start it collapsed to the top level, turn off show items with no data, and cap the columns to 12 months rather than three years. Users almost never look at all of it and they can expand what they want.
Worth adding: the calendar should cover whole years, 1 Jan to 31 Dec, not just min to max of your data. Year-to-date measures get strange at the edges otherwise.
Timeouts rather than NXDOMAIN on brand new nodes points at the data path, not at CoreDNS's answers. Two things are almost certainly happening together.
First, kube-proxy on a new node has to program its rules before the ClusterIP for CoreDNS resolves to anything. Pods can be scheduled and start making DNS queries before that is complete, and you get exactly a 30-60 second window of timeouts.
Second, two CoreDNS replicas for 60 nodes is thin, and the morning ramp is when every new pod does its startup lookups at once. Run the cluster-proportional autoscaler for CoreDNS so replicas track node count, and spread them with a topology constraint so they are not both on the same node.
The change that will help most though is NodeLocal DNSCache. It puts a caching resolver on every node, so pods talk to something local over TCP to CoreDNS and stop depending on the ClusterIP path being ready. It also removes most of the conntrack UDP race problems people hit at this scale.
Other big source of the same symptom: DIVIDE. A ratio total is never the sum of the ratios, and it should not be. If you want a weighted total, sum the numerator and denominator separately and divide at the end.
Minor style point that saves pain later: bound your ranges. C2:C10000 rather than C2:C on a sheet that will grow. Open-ended ranges inside an ARRAYFORMULA make Sheets consider the entire column, and on a big file you will feel it.
And do it right after publishing rather than at 6am the next day when the schedule fires and nobody is watching.
That is a dynamic data source. Somewhere you have a step that builds a path or URL from a parameter, a column value, or a date, and the service cannot work out what it is going to call before it calls it, so it refuses to attach credentials.
The fix is to keep the base address literal and push the variable part into an option record: Web.Contents("https://host/api", [RelativePath = "reports/" & period]) instead of Web.Contents("https://host/api/reports/" & period). Same for SharePoint — hardcode the site root and navigate to the folder in later steps rather than concatenating the folder into the initial call.
Worth adding a pod disruption budget and checking per-zone headroom before draining anything that has attached storage. This failure mode is entirely predictable and almost always discovered during maintenance.
Sanity check for anyone finding this later: select the column and look at the alignment before doing anything else. Right aligned means Sheets sees a real date or number, left aligned means text. Fastest diagnostic in the whole application and it takes no clicks.
The compression argument is the one I can take to my manager, because "we hit the Pro ceiling in November" is a date and a consequence.
In-place, and the StatefulSets are the deciding factor. Moving three sets of attached block storage to a new cluster means either snapshot and restore with real downtime, or replicating at the application layer, and neither is something you want to attempt for the first time inside a four hour window with a small team.
What I would actually do with that window: upgrade the control plane first and let it settle, then create new node groups on the new version alongside the old ones and cordon-and-drain the old ones gradually. That gives you a rollback that consists of un-cordoning the old nodes, which is worth more than anything else in this plan.
Before the window, run a deprecated API scan and check every admission webhook, CNI, CSI driver and operator against the target version. Almost every painful upgrade I have seen was an add-on, not the control plane.
If all 30 sites have identical column layouts, stacking is easy. If three of them have an extra column someone added locally, fix that first or the stack silently misaligns and you will chase it for a day.