- Prepare a cluster (Single node, kubeadm, k3s, etc)
- Open browser tabs to https://kubernetes.io/docs/, https://github.com/kubernetes/ and https://kubernetes.io/blog/ (these are permitted as per the current guidelines)
- Create a deployment object consisting of 6 pods, each containing a single
nginx:1.19.5container - Identify the update strategy employed by this deployment
- Modify the update strategy so
maxSurgeis equal to50%andmaxUnavailableis equal to50% - Perform a rolling update to this deployment so that the image gets updated to
nginx1.19.6 - Undo the most recent change
Answer - Imperative
kubectl create deployment nginx --image=nginx:1.19.5 --replicas=6
kubectl describe deployment nginx (unless specified, will be listed as "UpdateStrategy")
kubectl patch deployment nginx -p "{\"spec\": {\"strategy\": {\"rollingUpdate\": { \"maxSurge\":\"50%\"}}}}" --record=true
kubectl patch deployment nginx -p "{\"spec\": {\"strategy\": {\"rollingUpdate\": { \"maxUnavailable\":\"50%\"}}}}" --record=true
kubectl set image deployment nginx nginx=nginx:1.19.6 --record=true
kubectl rollout undo deployment/nginxAnswer - Declarative
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 6
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19.5
ports:
- containerPort: 80kubectl describe deployment nginx (unless specified, will be listed as "UpdateStrategy")patch.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
strategy:
rollingUpdate:
maxSurge: 50%
maxUnavailable: 50%
template:
spec:
containers:
- name: nginx
image: nginx:1.19.6
ports:
- containerPort: 80kubectl patch deployment nginx --patch-file=patch.yamlkubectl rollout undo deployment/nginx- Create a configmap named
mycmthat has the following key=value pairkey= ownervalue= yourname
- Create a pod of your choice, such as
nginx. Configure this Pod so that the underlying container has the environent varibaleOWNERset to the value of this configmap
Answer
Create Secret:
kubectl create configmap mycm --from-literal=owner=davidDefine Pod:
apiVersion: v1
kind: Pod
metadata:
name: nginx-configmap
spec:
containers:
- name: nginx-configmap
image: nginx
command: [ "/bin/sh", "-c", "env" ]
env:
# Define the environment variable
- name: OWNER
valueFrom:
configMapKeyRef:
# The ConfigMap containing the value you want to assign to SPECIAL_LEVEL_KEY
name: mycm
# Specify the key associated with the value
key: ownerValidate:
kubectl logs nginx-configmap | grep OWNER
OWNER=david- Create a secret named
mysecretthat has the following key=value pairdbuser= MyDatabaseUserdbpassword= MyDatabasePassword
- Create a pod of your choice, such as
nginx. Configure this Pod so that the underlying container has the the following environment variables set: DBUSERfrom secret keydbuserDBPASSfrom secret keydbpassword
Answer
kubectl create secret generic mysecret --from-literal=dbuser="MyDatabaseUser" --from-literal=dbpassword="MyDatabasePassword"Apply the following manifest:
apiVersion: v1
kind: Pod
metadata:
name: nginx-secret
spec:
containers:
- name: nginx-secret
image: nginx
command: [ "/bin/sh", "-c", "env" ]
env:
- name: dbuser
valueFrom:
secretKeyRef:
name: mysecret
key: dbuser
- name: dbpassword
valueFrom:
secretKeyRef:
name: mysecret
key: dbpassword
restartPolicy: NeverWhich can be validated with:
kubectl logs nginx-secret | grep db
dbuser=MyDatabaseUser
dbpassword=MyDatabasePassword- Create a deployment object consisting of 3
podscontaining a singlenginxcontainer - Increase this deployment size by adding two additional pods.
- Decrease this deployment back to the original size of 3
pods
Answer - Imperative
kubectl create deployment nginx --image=nginx --replicas=3
kubectl scale --replicas=5 deployment nginx
kubectl scale --replicas=3 deployment nginxAnswer - Declarative
Apply initial YAML:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80Apply modified YAML:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 5
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1
ports:
- containerPort: 80Apply original YAML:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80- Create a new namespace called "tenant-b-100mi"
- Create a memory limit of 100Mi for this namespace
- Create a pod with a memory request of 150Mi, ensure the limit has been set by verifying you get a error message.
Answer
kubectl create ns tenant-b-100miDeploy the manifest:
apiVersion: v1
kind: LimitRange
metadata:
name: tenant-b-memlimit
namespace: tenant-b-100mi
spec:
limits:
- max:
memory: 100Mi
type: ContainerTest with deploying:
apiVersion: v1
kind: Pod
metadata:
name: default-mem-demo
namespace: tenant-b-100mi
spec:
containers:
- name: default-mem-demo
image: nginx
resources:
requests:
memory: 150MiWhich should return:
The Pod "default-mem-demo" is invalid: spec.containers[0].resources.requests: Invalid value: "150Mi": must be less than or equal to memory limit