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
orkubectl 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 yamlapiVersion: 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
- Actual state of object
- 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