devops-exercises/topics/kubernetes/CKA.md

190 lines
4.7 KiB
Markdown
Raw Normal View History

2022-10-09 22:05:52 +02:00
# CKA (Certified Kubernetes Administrator)
- [CKA (Certified Kubernetes Administrator)](#cka-certified-kubernetes-administrator)
- [Setup](#setup)
- [Pods](#pods)
- [Troubleshooting Pods](#troubleshooting-pods)
- [Namespaces](#namespaces)
2022-10-15 15:30:49 +02:00
- [Nodes](#nodes)
- [Services](#services)
2022-10-09 22:05:52 +02:00
## Setup
* Set up Kubernetes cluster. Use on of the following
1. Minikube for local free & simple cluster
2. Managed Cluster (EKS, GKE, AKS)
* Set aliases
```
alias k=kubectl
alias kd=kubectl delete
alias kds=kubectl describe
alias ke=kubectl edit
alias kr=kubectl run
alias kg=kubectl get
```
## Pods
<details>
<summary>Run a command to view all the pods in current namespace</summary><br><b>
Note: create an alias (`alias k=kubectl`) and get used to `k get po`
</b></details>
<details>
<summary>Run a pod called "nginx-test" using the "nginx" image</summary><br><b>
`k run nginx-test --image=nginx`
</b></details>
<details>
<summary>Assuming you have a Pod called "nginx-test", how to remove it?</summary><br><b>
`k delete nginx-test`
</b></details>
<details>
<summary>In what namespace the <code>etcd</code> pod is running? list the pods in that namespace</summary><br><b>
`k get po -n kube-system`
</b></details>
<details>
<summary>List pods from all namespaces</summary><br><b>
`k get po --all-namespaces`
</b></details>
<details>
<summary>Write a YAML of a Pod with two containers and use the YAML file to create the Pod (use whatever images you prefer)</summary><br><b>
```
cat > pod.yaml <<EOL
apiVersion: v1
kind: Pod
metadata:
name: test
spec:
containers:
- image: alpine
name: alpine
- image: nginx-unprivileged
name: nginx-unprivileged
EOL
k create -f pod.yaml
```
</b></details>
<details>
<summary>Create a YAML of a Pod without actually running the Pod with the kubectl command (use whatever image you prefer)</summary><br><b>
`k run some-pod -o yaml --image nginx-unprivileged --dry-run=client > pod.yaml`
</b></details>
<details>
<summary>How to test a manifest is valid?</summary><br><b>
with `--dry-run` flag which will not actually create it, but it will test it and you can find this way any syntax issues.
2022-10-15 15:30:49 +02:00
`k create -f YAML_FILE --dry-run`
</b></details>
<details>
<summary>How to check which image a certain Pod is using?</summary><br><b>
`k describe po <POD_NAME> | grep -i image`
</b></details>
<details>
<summary>How to check how many containers run in signle Pod?</summary><br><b>
`k get po POD_NAME` and see the number under "READY" column.
You can also run `k describe po POD_NAME`
</b></details>
<details>
<summary>Run a Pod called "remo" with the the latest redis image and the label 'year=2017'</summary><br><b>
`k run remo --image=redis:latest -l year=2017`
</b></details>
<details>
<summary>List pods and their labels</summary><br><b>
`k get po --show-labels`
2022-10-09 22:05:52 +02:00
</b></details>
### Troubleshooting Pods
<details>
<summary>You try to run a Pod but see the status "CrashLoopBackOff". What does it means? How to identify the issue?</summary><br><b>
The container failed to run (due to different reasons) and Kubernetes tries to run the Pod again after some delay (= BackOff time).
Some reasons for it to fail:
- Misconfiguration - mispelling, non supported value, etc.
- Resource not available - nodes are down, PV not mounted, etc.
Some ways to debug:
1. `kubectl describe pod POD_NAME`
1. Focus on `State` (which should be Waiting, CrashLoopBackOff) and `Last State` which should tell what happened before (as in why it failed)
2. Run `kubectl logs mypod`
1. This should provide an accurate output of
2. For specific container, you can add `-c CONTAINER_NAME`
3. If you still have no idea why it failed, try `kubectl get events`
</b></details>
<details>
<summary>What the error <code>ImagePullBackOff</code> means?</summary><br><b>
Most likely you didn't write correctly the name of the image you try to pull and run
You can confirm with `kubectl describe po POD_NAME`
</b></details>
2022-10-15 15:30:49 +02:00
<details>
<summary>How to check on which node a certain Pod is running?</summary><br><b>
`k get po POD_NAME -o wide`
</b></details>
2022-10-09 22:05:52 +02:00
## Namespaces
<details>
<summary>List all the namespaces</summary><br><b>
`k get ns`
2022-10-15 15:30:49 +02:00
</b></details>
<details>
<summary>Create a namespace called 'alle'</summary><br><b>
`k create ns alle`
</b></details>
## Nodes
<details>
<summary>Run a command to view all nodes of the cluster</summary><br><b>
`kubectl get nodes`
Note: create an alias (`alias k=kubectl`) and get used to `k get no`
</b></details>
<details>
<summary>Create a list of all nodes in JSON format and store it in a file called "some_nodes.json"</summary><br><b>
`k get nodes -o json > some_nodes.json`
</b></details>
## Services
<details>
<summary>Create an internal service called "sevi" to expose the app 'web' on port 1991</summary><br><b>
2022-10-09 22:05:52 +02:00
</b></details>