Hands-on Lab·Kubernetes and Cloud Native Security Associate
Image Tags, Digests and Pull Policy
Supply chain security starts with a question with a surprising answer: what did this Pod actually run? A tag is a mutable pointer, and the cluster records what it resolved to in a different field. This guide reads both, then makes pinning compulsory with one CEL expression.
Platform Security Guide 33 of 42 Intermediate
- Kubernetesapiserver v1.36.4, kubelet v1.36.3
- Runtimecontainerd 2.2.6
- CNICilium 1.18.1
- Built withkubeadm v1.36.3
- TimeAbout 17 min
imagePullPolicy defaults from the tag: Always for :latest, IfNotPresent otherwise. The AlwaysPullImages admission plugin exists and is not enabled by default.
- Host kernel7.0.0-29
| Server Name | IP Address | OS | Roles | CPU | RAM | HDD |
|---|---|---|---|---|---|---|
| CKA5001 | 192.168.0.41 | Ubuntu 26.04 LTS | Control Plane Node (tainted NoSchedule) | 2 Core | 4 GB | 50 GB |
| CKA5001-NODE01 | 192.168.0.42 | Ubuntu 26.04 LTS | Worker Node | 2 Core | 4 GB | 50 GB |
| CKA5001-NODE02 | 192.168.0.43 | Ubuntu 26.04 LTS | Worker Node | 2 Core | 4 GB | 50 GB |
| CKA5001-NODE03 | 192.168.0.44 | Ubuntu 26.04 LTS | Worker Node | 2 Core | 4 GB | 50 GB |
This guide includes
Use this when supply chain security has to start somewhere concrete. This matters because a tag is a pointer that can move - what actually ran is the digest, and the cluster records both so the two can be compared.
- reading back the two image fields, only one of which is what you wrote
- finding the pull policy neither Pod set, which was defaulted from the tag
- counting the admission plugin that would close the cache hole
- pinning the Pod to the digest that actually ran
- making that compulsory with one expression over every container
Before you start
-
Two fields, and only one of them is what you wrote
-
The pull policy neither Pod set
-
The plugin that would close the cache hole
-
Pinning to what actually ran
-
Making it compulsory