Skip to main content
compliance · gcp

GKE node pools running an image other than Container-Optimized OS

resource types
1
rule IDs covered
1
severity
medium

What does ZopNight detect here?

GKE node pools are flagged when their `imageType` is anything other than `COS` or `COS_CONTAINERD`, such as `UBUNTU_CONTAINERD`. Google calls Container-Optimized OS with containerd the recommended node image, maintained by a Google team that can patch it quickly, and it is the only image Autopilot uses.

Signal and threshold

How ZopNight evaluates GKE node pools running an image other than Container-Optimized OS.
Field Value
Rule IDsRC-1225
Categorycompliance
Severitymedium
Metricnone — pure configuration read
ThresholdimageType not COS or COS_CONTAINERD
SourceZopNight
Permissions usedcontainer.clusters.list · container.clusters.get

Why Google steers node pools to Container-Optimized OS

GKE Standard lets you choose the node operating system per pool. Google’s node image guide is clear about its preference: Container-Optimized OS with containerd (cos_containerd) is the recommended node OS, and Autopilot clusters always use it. The same page describes the images as optimised to enhance node security and backed by a Google team that can quickly patch them, and states they provide better support, security and stability than the other images.

Ubuntu is supported and validated, and Google names the cases for it: nodes that need XFS, CephFS or Debian packages. Outside those cases, a general-purpose distribution on nodes is more software to patch without a reason to have it.

Listing image types per pool

Terminal window
gcloud container node-pools list --cluster=CLUSTER_NAME --location=LOCATION \
--format="table(name,config.imageType)"

Which pools ZopNight flags

ZopNight reads each node pool’s image type from inventory. A value of COS or COS_CONTAINERD is compliant; any other value, including Ubuntu and Windows images, raises a finding that names the image in use. A pool with no recorded image type is skipped.

Cases that deserve an exception

Windows containers need Windows Server nodes, so a Windows Server LTSC (windows_ltsc_containerd) pool is flagged even though it cannot move to Container-Optimized OS. Treat those findings as documented exceptions. The same applies to Ubuntu pools that exist for one of Google’s named reasons, or for a DaemonSet that installs kernel modules or host packages.

Security posture only

There is no saving attached to this finding. The concern is attack surface and how quickly the node OS receives fixes.

Moving a pool to Container-Optimized OS

  1. Check workloads for host dependencies: privileged DaemonSets that install packages, hostPath mounts of distribution-specific paths, or kernel modules.
  2. Test on a new small pool first: gcloud container node-pools create cos-test --cluster=CLUSTER_NAME --location=LOCATION --image-type=COS_CONTAINERD --num-nodes=1.
  3. Switch the pool: gcloud container clusters upgrade CLUSTER_NAME --location=LOCATION --image-type=COS_CONTAINERD --node-pool=POOL_NAME.
  4. Watch Pods reschedule onto the new nodes.

See it fire on your bill.

Connect an account read-only. The first findings land in minutes.

472 rule families across 353 resource types on 22 platforms. Every threshold, metric, and IAM action is documented on these pages before you grant anything.

472 rule families documented
353 resource types covered
read-only default access level
Multi-cloud automation· Production-ready in 30 min· SOC 2 · ISO 27001· 20–60% off the bill, first month· 4 platforms · 1 console· Multi-cloud automation· Production-ready in 30 min· SOC 2 · ISO 27001· 20–60% off the bill, first month· 4 platforms · 1 console·