Deploying Pods
Life of a pod
- Pending : in progress
- Running
- Succeeded : successfully exited
- Failed
- Unknown
Resource Configs
Each entity created with kubernetes is a resource including pod, service, deployments, replication controller etc. Resources can be defined as YAML or JSON. Here is the syntax to create a YAML specification.
AKMS => Resource Configs Specs
apiVersion: v1
kind:
metadata:
spec:
Spec Schema: https://kubernetes.io/docs/user-guide/pods/multi-container/
To list supported version of apis
kubectl api-versions
Writing Pod Spec
Lets now create the Pod config by adding the kind and specs to schme given in the file vote-pod.yaml as follows.
Filename: k8s-code/pods/vote-pod.yaml
apiVersion:
kind: Pod
metadata:
spec:
Lets edit this and add the pod specs
Filename: k8s-code/pods/vote-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: vote
  labels:
    app: python
    role: vote
    version: v1
spec:
  containers:
    - name: app
      image: schoolofdevops/vote:v1
Use this link to refer to pod spec
Launching and operating a Pod
To launch a monitoring screen to see whats being launched, use the following command in a new terminal window where kubectl is configured.
watch -n 1  kubectl get pods,deploy,rs,svc
kubectl Syntax:
kubectl
kubectl apply --help
kubectl apply -f FILE
To Launch pod using configs above,
kubectl apply -f vote-pod.yaml
To view pods
kubectl get pods
kubectl get po -o wide
kubectl get pods vote
To get detailed info
kubectl describe pods vote
[Output:]
Name:           vote
Namespace:      default
Node:           kube-3/192.168.0.80
Start Time:     Tue, 07 Feb 2017 16:16:40 +0000
Labels:         app=voting
Status:         Running
IP:             10.40.0.2
Controllers:    <none>
Containers:
  vote:
    Container ID:       docker://48304b35b9457d627b341e424228a725d05c2ed97cc9970bbff32a1b365d9a5d
    Image:              schoolofdevops/vote:latest
    Image ID:           docker-pullable://schoolofdevops/vote@sha256:3d89bfc1993d4630a58b831a6d44ef73d2be76a7862153e02e7a7c0cf2936731
    Port:               80/TCP
    State:              Running
      Started:          Tue, 07 Feb 2017 16:16:52 +0000
    Ready:              True
    Restart Count:      0
    Volume Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-2n6j1 (ro)
    Environment Variables:      <none>
Conditions:
  Type          Status
  Initialized   True
  Ready         True
  PodScheduled  True
Volumes:
  default-token-2n6j1:
    Type:       Secret (a volume populated by a Secret)
    SecretName: default-token-2n6j1
QoS Class:      BestEffort
Tolerations:    <none>
Events:
  FirstSeen     LastSeen        Count   From                    SubObjectPath           Type            Reason          Message
  ---------     --------        -----   ----                    -------------           --------        ------          -------
  21s           21s             1       {default-scheduler }                            Normal          Scheduled       Successfully assigned vote to kube-3
  20s           20s             1       {kubelet kube-3}        spec.containers{vote}   Normal          Pulling         pulling image "schoolofdevops/vote:latest"
  10s           10s             1       {kubelet kube-3}        spec.containers{vote}   Normal          Pulled          Successfully pulled image "schoolofdevops/vote:latest"
  9s            9s              1       {kubelet kube-3}        spec.containers{vote}   Normal          Created         Created container with docker id 48304b35b945; Security:[seccomp=unconfined]
  9s            9s              1       {kubelet kube-3}        spec.containers{vote}   Normal          Started         Started container with docker id 48304b35b945
Commands to operate the pod
kubectl logs vote
kubectl exec -it vote  sh
Inside the container in a pod
ifconfig
cat /etc/issue
hostname
cat /proc/cpuinfo
ps aux
Attach a Volume to the Pod
Lets create a pod for database and attach a volume to it. To achieve this we will need to
- create a volumes definition
- attach volume to container using VolumeMounts property
Local host volumes are of two types:
  * emptyDir
  * hostPath  
We will pick hostPath. Refer to this doc to read more about hostPath.
File: db-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: db
  labels:
    app: postgres
    role: database
    tier: back
spec:
  containers:
    - name: db
      image: postgres:9.4
      ports:
        - containerPort: 5432
      volumeMounts:
      - name: db-data
        mountPath: /var/lib/postgresql/data
  volumes:
  - name: db-data
    hostPath:
      path: /var/lib/pgdata
      type: DirectoryOrCreate
To create this pod,
kubectl apply -f db-pod.yaml
kubectl describe pod db
kubectl get events
Exercise : Examine /var/lib/pgdata on the systems to check if the directory is been created and if the data is present.
Creating Multi Container Pods
file: multi_container_pod.yml
apiVersion: v1
kind: Pod
metadata:
  name: web
  labels:
    tier: front
    app: nginx
    role: ui
spec:
  containers:
    - name: nginx
      image: nginx:stable-alpine
      ports:
        - containerPort: 80
          protocol: TCP
      volumeMounts:
        - name: data
          mountPath: /var/www/html-sample-app
    - name: sync
      image: schoolofdevops/sync:v2
      volumeMounts:
        - name: data
          mountPath: /var/www/app
  volumes:
    - name: data
      emptyDir: {}
To create this pod
kubectl apply -f multi_container_pod.yml
Check Status
root@kube-01:~# kubectl get pods
NAME      READY     STATUS              RESTARTS   AGE
nginx     0/2       ContainerCreating   0          7s
vote      1/1       Running             0          3m
Checking logs, logging in
kubectl logs  web  -c sync
kubectl logs  web  -c nginx
kubectl exec -it web  sh  -c nginx
kubectl exec -it web  sh  -c sync
Observe whats common and whats isolated in two containers running inside the same pod using the following commands,
shared
hostname
ifconfig
isolated
cat /etc/issue
ps aux
df -h
Exercise
Create a pod definition for redis and deploy.
Reading List
- PodSpec: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.9/#pod-v1-core
- Managing Volumes with Kubernetes: https://kubernetes.io/docs/concepts/storage/volumes/
- Node Selectors, Affinity: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/