Manifests: Patches
Patches are a way to perform minor overrides to the configuration without having to create a separate config file. Patch functionality follows JSON Patch(RFC) semantics, as well as enhanced path selectors, as implemented by the yaml-jsonpath library.
Patches are compatible with kubectl manifests and inlineManifest.
Example
Patches are ideal for reflecting changes between different environments, e.g. dev, staging and production.
version: v2beta1
name: nginx-k8s
deployments:
example:
kubectl:
manifests:
- ./deployment.yaml
patches:
- target:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment
op: replace
path: spec.template.spec.containers[0].image
value: nginx:1.23.3
Explanation:
- The above example defines 1 patch for the
deployment.yamlmanifest - During deployment, the patches are applied in-memory, changing in this case the image of the container
# In-Memory deployment BEFORE Applying Patches
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 4
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
# In-Memory deployment AFTER Applying Patches
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 4
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.23.3
ports:
- containerPort: 80
When you want to define a path that contains an array (e.g. containers), you have several options:
- Use the index of the array item you want to patch, e.g.
spec.template.spec.containers[0],spec.template.spec.containers/0 - Use a wildcard selector to match all array item(s), e.g.
spec.template.spec.containers.*,spec.template.spec.containers[*]orspec.template.spec.containers/*
If you use the replace or add operation, value is a mandatory property.
If value is defined, the new value must provide the correct type to be used when adding or replacing the existing value found under path using the newly provided value, e.g. an array must be replaced with an array.
Example: Match patches
version: v2beta1
name: nginx-k8s
deployments:
example:
kubectl:
inlineManifest: |-
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-inline-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 4
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
- name: busybox
image: busybox
command: ["sleep"]
args: ["infinity"]
- name: alpine
image: alpine
command: ["sleep"]
args: ["infinity"]
patches:
# wildcard match
- target:
apiVersion: apps/v1 # Optional
kind: Deployment # Optional
name: nginx-inline-deployment # Required
op: add
path: spec.template.spec.containers[*].env
value: [{"name": "test", "value": "test123"}]
Explanation:
- The above example will patch and add an environment variable
test=test123to all containers in the deployment.
Example: Using target effectively
version: v2beta1
name: nginx-k8s
deployments:
example:
kubectl:
inlineManifest: |-
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-inline-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 4
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-inline-deployment
labels:
app: nginx-inline-deployment
spec:
ports:
- port: 80
protocol: TCP
selector:
app: nginx-inline-deployment
patch:
- target:
apiVersion: apps/v1 # Optional
kind: Deployment # Optional
name: nginx-inline-deployment # Required
op: add
path: spec.template.metadata.labels.test
value: test-deployment
- target:
apiVersion: v1 # Optional
kind: Service # Optional
name: nginx-inline-deployment # Required
op: add
path: metadata.labels.test
value: test-service
Explanation:
- The above example shows how you can address two resources with the same name, in this case
nginx-inline-deployment. - By using
kindandapiVersionwe can narrow down one patch to be applied only onapps/v1 - Deploymentand the other only tov1 - Service
Configuration
patches required object[]
Patches are additional changes to the pod spec that should be applied
patches required object[] 