Kubernetes API Objects
Everything containered in K8S is represented by RESTful resource, we refer to those resources as kubernetes objects.
The most basic command of viewing k8s objects is get.
kubectl get <resource-name> => all resources
kubectl get <resource-name> <object-name> => to view the specific resource
To get all the resources of the k8s we can execute kubectl api-resources
We can also view the k8s object in the json or yaml format kubectl get <resource-name> <object-name> -o json or kubectl get <resource-name> <object-name> -o yaml
Pods
Lets assume we have an application which has webserver and database
One Option is to create two containers in a Pod
The above option is considered to be bad practice or antipattern
Generally we will have one container in a Pod to make scaling effective.
In some cases we might have two containers in a pod
maincar
sidecar
Representing an K8s object in yaml file
Refer Here for understaning API and objects
In Kubernetes since resources are exposed as REST APIs, We have to understand API Versioining
Kubernetes groups resources in API Group
core: Referred as legacy group . In REST API => api/v1 and in yaml apiVersion: v1
named groups: In REST API apis/$GROUP_NAME/$VERSION and in yaml => apiVersion: $GROUPNAME/$VERSION
To describe a k8s object we have the following nested fields
Object Spec:
Here we describe the desired state of the object
Object Status
When we try to write a desired state / k8s manifest file in yaml
apiVersion: <version>
kind: <kind of the resource>
metadata:
name: <name of the object>
spec:
<object-spec>
Now lets look at the example which we have used earlier
apiVersion: v1
kind: Pod
metadata:
name: httpd
spec:
containers:
- name: httpd
image: httpd:latest
ports:
- containerPort: 80
When we execute the following command kubectl get pods httpd -o yaml
apiVersion: v1
items:
- apiVersion: v1
kind: Pod
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"httpd","namespace":"default"},"spec":{"containers":[{"image":"httpd:latest","name":"httpd","ports":[{"containerPort":80}]}]}}
creationTimestamp: "2022-02-12T14:08:29Z"
name: httpd
namespace: default
resourceVersion: "10096"
uid: cac0c00f-f6e7-4684-9eb4-cf99e1ada436
spec:
containers:
- image: httpd:latest
imagePullPolicy: Always
name: httpd
ports:
- containerPort: 80
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-zw8x6
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
nodeName: ip-172-31-33-127
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-zw8x6
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-02-12T14:08:29Z"
status: "True"
type: Initialized
- lastProbeTime: null
lastTransitionTime: "2022-02-12T14:08:31Z"
status: "True"
type: Ready
- lastProbeTime: null
lastTransitionTime: "2022-02-12T14:08:31Z"
status: "True"
type: ContainersReady
- lastProbeTime: null
lastTransitionTime: "2022-02-12T14:08:29Z"
status: "True"
type: PodScheduled
containerStatuses:
- containerID: docker://4cf2b8387d82cd5ddd280b4be549496c663bb0dfb05d950d7d86c1e58f05e66e
image: httpd:latest
imageID: docker-pullable://httpd@sha256:5cc947a200524a822883dc6ce6456d852d7c5629ab177dfbf7e38c1b4a647705
lastState: {}
name: httpd
ready: true
restartCount: 0
started: true
state:
running:
startedAt: "2022-02-12T14:08:31Z"
hostIP: 172.31.33.127
phase: Running
podIP: 192.168.2.6
podIPs:
- ip: 192.168.2.6
qosClass: BestEffort
startTime: "2022-02-12T14:08:29Z"
kind: List
metadata:
resourceVersion: ""
selfLink: ""
To write manifests lets use the reference page
Refer Here for the reference links
Since we are using 1.23 we use Refer Here
Since we are writing Pod Manifest Refer Here
Activity 1: Create a Pod to run nginx container in it
Create a yaml and add apiVersion => v1 & kind => Pod
Now we need to add metadata Refer Here
To write Pod Spec Refer Here
Since we decided to use nginx container in the pod we use containers section
To describe container Refer Here
Refer Here for the pod manifest created
Now delete the pod
Activity 2: Lets create a Pod with mysql container and set the following environmental variables
MYSQL_ROOT_PASSWORD => root123
MYSQL_DATABASE => qtecommerce
MYSQL_USER => qtdevops
MYSQL_PASSWORD => qtdevops123
solution: Refer Here
Lets login into the container