Exercise
Create a file named whoami.yaml that specifies a Pod named whoami with a single container based on the image: containous/whoami
Launch the Pod
Get the existing Pods and make sure the Pod named whoami is listed.
Get the Pod’s details and find the information indicating it’s IP address.
Using kubectl port-forward send a request to the application running in the whoami Pod.
Delete the Pod
Solution
- The Pod’s specification is the following one:
apiVersion: v1
kind: Pod
metadata:
name: whoami
spec:
containers:
- name: whoami
image: containous/whoami- The Pod can be created with the following command:
kubectl apply -f whoami.yaml- The following command list the existing Pods:
kubectl get podsThe Pod whoami should appear as Running:
NAME READY STATUS RESTARTS AGE
whoami 1/1 Running 0 14s
...Note: pod (singular) or po can also be used as shortcuts of pods
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
whoami 1/1 Running 0 16s
$ kubectl get po
NAME READY STATUS RESTARTS AGE
whoami 1/1 Running 0 22s- The Pod’s details can be retrieved with the following command:
kubectl describe pod whoamiYou’ll get an output similar to this one (in this example, the Pod’s IP address is 192.168.117.160):
Name: whoami
Namespace: default
Priority: 0
Node: pool-0c6fd-ertzi/194.182.169.185
Start Time: Mon, 21 Mar 2022 20:27:00 +0100
Labels: <none>
Annotations: cni.projectcalico.org/containerID: bf1482441187f92742b1485b6497e92af2b28398f9c2eaa4dc21776f5213af83
cni.projectcalico.org/podIP: 192.168.117.160/32
cni.projectcalico.org/podIPs: 192.168.117.160/32
kubernetes.io/psp: privileged
Status: Running
IP: 192.168.117.160
IPs:
IP: 192.168.117.160
Containers:
whoami:
Container ID: containerd://6b53f5f5945cef71c8fd40fc15edcd61a2682f092ea84ad3be08c9d59f448c68
Image: containous/whoami
Image ID: docker.io/containous/whoami@sha256:7d6a3c8f91470a23ef380320609ee6e69ac68d20bc804f3a1c6065fb56cfa34e
Port: <none>
Host Port: <none>
State: Running
Started: Mon, 21 Mar 2022 20:27:04 +0100
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-k5t8q (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-k5t8q:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 60s default-scheduler Successfully assigned default/whoami to pool-0c6fd-ertzi
Normal Pulling 59s kubelet Pulling image "containous/whoami"
Normal Pulled 56s kubelet Successfully pulled image "containous/whoami" in 2.857153773s
Normal Created 56s kubelet Created container whoami
Normal Started 56s kubelet Started container whoamiNote: the following commands can also be used to describe the Pod whoami:
- kubectl describe pods whoami
- kubectl describe po whoami
- kubectl describe pods/whoami
- kubectl describe pod/whoami
- kubectl describe po/whoami
The whole Pod’s specification can be retrieved with the following command using the -o yaml flag:
kubectl get po/whoami -o yamlYou’ll get a result like the one below:
apiVersion: v1
kind: Pod
metadata:
annotations:
cni.projectcalico.org/containerID: bf1482441187f92742b1485b6497e92af2b28398f9c2eaa4dc21776f5213af83
cni.projectcalico.org/podIP: 192.168.117.160/32
cni.projectcalico.org/podIPs: 192.168.117.160/32
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"whoami","namespace":"default"},"spec":{"containers":[{"image":"containous/whoami","name":"whoami"}]}}
kubernetes.io/psp: privileged
creationTimestamp: "2022-03-21T19:27:00Z"
name: whoami
namespace: default
resourceVersion: "1792248914"
uid: cb52024e-5d56-414e-9547-bdce7b9b7ff8
spec:
containers:
- image: containous/whoami
imagePullPolicy: Always
name: whoami
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-k5t8q
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
nodeName: pool-0c6fd-ertzi
preemptionPolicy: PreemptLowerPriority
priority: 0
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: default
serviceAccountName: default
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
volumes:
- name: kube-api-access-k5t8q
projected:
defaultMode: 420
sources:
- serviceAccountToken:
expirationSeconds: 3607
path: token
- configMap:
items:
- key: ca.crt
path: ca.crt
name: kube-root-ca.crt
- downwardAPI:
items:
- fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
path: namespace
status:
conditions:
- lastProbeTime: null
lastTransitionTime: "2022-03-21T19:27:00Z"
status: "True"
type: Initialized
- lastProbeTime: null
lastTransitionTime: "2022-03-21T19:27:04Z"
status: "True"
type: Ready
- lastProbeTime: null
lastTransitionTime: "2022-03-21T19:27:04Z"
status: "True"
type: ContainersReady
- lastProbeTime: null
lastTransitionTime: "2022-03-21T19:27:00Z"
status: "True"
type: PodScheduled
containerStatuses:
- containerID: containerd://6b53f5f5945cef71c8fd40fc15edcd61a2682f092ea84ad3be08c9d59f448c68
image: docker.io/containous/whoami:latest
imageID: docker.io/containous/whoami@sha256:7d6a3c8f91470a23ef380320609ee6e69ac68d20bc804f3a1c6065fb56cfa34e
lastState: {}
name: whoami
ready: true
restartCount: 0
started: true
state:
running:
startedAt: "2022-03-21T19:27:04Z"
hostIP: 194.182.169.185
phase: Running
podIP: 192.168.117.160
podIPs:
- ip: 192.168.117.160
qosClass: BestEffort
startTime: "2022-03-21T19:27:00ZThe Pod’s IP address can be retrieved in .status.podIP
- Run the following command to open a local port mapped to the Pod’s container port:
kubectl port-forward whoami 8888:80From your web browser, open the URL http://localhost:8888, you should get a reply similar to the following one:
Hostname: whoami
IP: 127.0.0.1
IP: ::1
IP: 192.168.117.160
IP: fe80::b866:55ff:fe79:3cf2
RemoteAddr: 127.0.0.1:58882
GET / HTTP/1.1
Host: localhost:8888
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate, br
Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7
Cache-Control: max-age=0
Connection: keep-alive
If-None-Match: "5d52db33-264"
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Sec-Gpc: 1
Upgrade-Insecure-Requests: 1- The Pod can be deleted with the following command:
kubectl delete po/whoami