Kubernetes

Kubernetes

Kubernetes is an open-source system for automating deployment, scaling, and management of containerized applications. Planet Scale. Never Outgrow. Run Anywhere. Homepage

  • Characteristics

    • Optimized for all applications

    • Known, Stable API

    • Unparalleled team and community

  • Architecture

    • Masters manage the cluster

    • Nodes are used to host the running applications

    • A Kubernetes cluster that handles production traffic should have a minimum of three nodes

    • Kubernetes API, the master exposes

      • End users interact with the cluster

        A Kubernetes cluster can be deployed on either physical or virtual machines

  • Platform As A Service

    • Heroku

      • Completely Propietary

    • Cloud Foundry

      • Optimized for 12 Factor Apps

    • Spinnaker

      • Public Cloud Infrastructure and Virtual Machines

Kubernetes :: Documentation

Kubernetes is an open source system for managing containerized applications across multiple hosts, providing basic mechanisms for deployment, maintenance, and scaling of applications. The open source project is hosted by the Cloud Native Computing Foundation (CNCF). Homepage

Application Developer__ a person that writes an Application that runs in a Kubernetes cluster _Cluster Operator a person that configures, controls and monitors clusters.

Kubernetes :: Methods

  • Minikube

    • It is a single node kubernetes cluster

  • Kops

    • Multi node kubernetes setup into AWS

  • Kubeadm

    • Multi Node Cluster in our own premises

Kubernetes :: Minikube

Lightweight Kubernetes implementation that creates a VM on your local machine and deploys a simple cluster containing only one node.

Kubernetes :: Minikube :: Create a Cluster

Kubernetes coordinates a highly available cluster of computers that are connected to work as a single unit. A Kubernetes cluster consists of two types of resources: The Master coordinates the cluster, Nodes are the workers that run applications.

  1. VT-x or AMD-v Virtualization

  2. Hypervisor

    • Linux. VirtualBox

    • Linux. KVM

[xe1gyq@server ~]$ su root
Password: 
[root@server xe1gyq]# cd /etc/yum.repos.d
[root@server yum.repos.d]# wget http://download.virtualbox.org/virtualbox/rpm/rhel/virtualbox.repo
--2018-02-25 18:51:05--  http://download.virtualbox.org/virtualbox/rpm/rhel/virtualbox.repo
Resolving download.virtualbox.org (download.virtualbox.org)... 23.54.230.212
Connecting to download.virtualbox.org (download.virtualbox.org)|23.54.230.212|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 259 [text/plain]
Saving to: ‘virtualbox.repo’

100%[======================================>] 259         --.-K/s   in 0s      

2018-02-25 18:51:06 (61.0 MB/s) - ‘virtualbox.repo’ saved [259/259]

[root@server yum.repos.d]# yum groupinstall "Development Tools"
[root@server yum.repos.d]# yum install kernel-devel
[root@server yum.repos.d]# yum install VirtualBox-5.1
[root@server yum.repos.d]# usermod -a -G vboxusers xe1gyq
  1. kubectl

[xe1gyq@server ~]$ curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
[xe1gyq@server ~]$ chmod +x kubectl 
[xe1gyq@server ~]$ sudo mv ./kubectl /usr/local/bin/kubectl
[sudo] password for xe1gyq: 
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl cluster-info
Kubernetes master is running at http://localhost:8080

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
The connection to the server localhost:8080 was refused - did you specify the right host or port?
[xe1gyq@server ~]$
  1. Minikube

[xe1gyq@server ~]$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.25.0/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 41.4M  100 41.4M    0     0   946k      0  0:00:44  0:00:44 --:--:--  989k
[xe1gyq@server ~]$
[xe1gyq@server ~]$ minikube version
minikube version: v0.25.0
[xe1gyq@server ~]$
[xe1gyq@server ~]$ minikube start
Starting local Kubernetes v1.9.0 cluster...
Starting VM...
Getting VM IP address...
Moving files into cluster...
Downloading localkube binary
 162.41 MB / 162.41 MB [============================================] 100.00% 0s
 0 B / 65 B [----------------------------------------------------------]   0.00%
 65 B / 65 B [======================================================] 100.00% 0sSetting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.
Loading cached images from config file.
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl version
Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.3", GitCommit:"d2835416544f298c919e2ead3be3d0864b52323b", GitTreeState:"clean", BuildDate:"2018-02-07T12:22:21Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"", Minor:"", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2018-01-26T19:04:38Z", GoVersion:"go1.9.1", Compiler:"gc", Platform:"linux/amd64"}
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl cluster-info
Kubernetes master is running at https://192.168.99.100:8443

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl get nodes
NAME       STATUS    ROLES     AGE       VERSION
minikube   Ready     <none>    7m        v1.9.0
[xe1gyq@server ~]$

Kubernetes :: Minikube :: Deploy An App

Kubernetes Deployments. Once you have a running Kubernetes cluster, you can deploy your containerized applications on top of it. To do so, you create a Kubernetes Deployment configuration. The Deployment instructs Kubernetes how to create and update instances of your application. Once you've created a Deployment, the Kubernetes master schedules mentioned application instances onto individual Nodes in the cluster.

In a first terminal

[xe1gyq@server ~]$ kubectl version
Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.3", GitCommit:"d2835416544f298c919e2ead3be3d0864b52323b", GitTreeState:"clean", BuildDate:"2018-02-07T12:22:21Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"", Minor:"", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2018-01-26T19:04:38Z", GoVersion:"go1.9.1", Compiler:"gc", Platform:"linux/amd64"}
[xe1gyq@server ~]$ kubectl get nodes
NAME       STATUS    ROLES     AGE       VERSION
minikube   Ready     <none>    18m       v1.9.0
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080
deployment "kubernetes-bootcamp" created
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl get deployments
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   1         1         1            0           49s
[xe1gyq@server ~]$

In a second terminal

[xe1gyq@server ~]$ kubectl proxy
Starting to serve on 127.0.0.1:8001

In the first terminal

[xe1gyq@server ~]$ curl http://localhost:8001/version
{
  "major": "",
  "minor": "",
  "gitVersion": "v1.9.0",
  "gitCommit": "925c127ec6b946659ad0fd596fa959be43f0cc05",
  "gitTreeState": "clean",
  "buildDate": "2018-01-26T19:04:38Z",
  "goVersion": "go1.9.1",
  "compiler": "gc",
  "platform": "linux/amd64"
}
[xe1gyq@server ~]$
[xe1gyq@server ~]$ export POD_NAME=$(kubectl get pods -o go-template --template'{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
[xe1gyq@server ~]$ echo Name of the Pod: $POD_NAME
Name of the Pod: kubernetes-bootcamp-5dbf48f7d4-dwl48
[xe1gyq@server ~]$
[xe1gyq@server ~]$ curl http://localhost:8001/api/v1/proxy/namespaces/default/pods/$POD_NAME/
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5dbf48f7d4-dwl48 | v=1
[xe1gyq@server ~]$

Kubernetes :: Minikube :: Explore Your App

A Pod is a Kubernetes abstraction that represents a group of one or more application containers (such as Docker or rkt), and some shared resources for those containers. Those resources include: Shared storage, as Volumes, Networking, as a unique cluster IP address, Information about how to run each container, such as the container image version or specific ports to use. Pods are the atomic unit on the Kubernetes platform. Deployment on Kubernetes creates Pods with containers inside them.

A Pod always runs on a Node. A Node is a worker machine in Kubernetes and may be either a virtual or a physical machine, depending on the cluster. Each Node is managed by the Master. A Node can have multiple pods.

Every Kubernetes Node runs at least: 1. Kubelet, a process responsible for communication between the Kubernetes Master and the Node; it manages the Pods and the containers running on a machine. 2. A container runtime (like Docker, rkt) responsible for pulling the container image from a registry, unpacking the container, and running the application. Containers should only be scheduled together in a single Pod if they are tightly coupled and need to share resources such as disk.

[xe1gyq@server ~]$ kubectl get pods
NAME                                   READY     STATUS    RESTARTS   AGE
kubernetes-bootcamp-5dbf48f7d4-dwl48   1/1       Running   0          18m
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl describe pods
Name:           kubernetes-bootcamp-5dbf48f7d4-dwl48
Namespace:      default
Node:           minikube/192.168.99.100
Start Time:     Sun, 25 Feb 2018 19:23:53 -0500
Labels:         pod-template-hash=1869049380
                run=kubernetes-bootcamp
Annotations:    <none>
Status:         Running
IP:             172.17.0.4
Controlled By:  ReplicaSet/kubernetes-bootcamp-5dbf48f7d4
Containers:
  kubernetes-bootcamp:
    Container ID:   docker://e0e42105484689b00a05c00a617a0ca331a3f5e1581c28ce1b96e73746b31918
    Image:          gcr.io/google-samples/kubernetes-bootcamp:v1
    Image ID:       docker-pullable://gcr.io/google-samples/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc64af
    Port:           8080/TCP
    State:          Running
      Started:      Sun, 25 Feb 2018 19:25:10 -0500
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-wptp4 (ro)
Conditions:
  Type           Status
  Initialized    True 
  Ready          True 
  PodScheduled   True 
Volumes:
  default-token-wptp4:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-wptp4
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     <none>
Events:
  Type    Reason                 Age   From               Message
  ----    ------                 ----  ----               -------
  Normal  Scheduled              20m   default-scheduler  Successfully assigned kubernetes-bootcamp-5dbf48f7d4-dwl48 to minikube
  Normal  SuccessfulMountVolume  20m   kubelet, minikube  MountVolume.SetUp succeeded for volume "default-token-wptp4"
  Normal  Pulling                20m   kubelet, minikube  pulling image "gcr.io/google-samples/kubernetes-bootcamp:v1"
  Normal  Pulled                 18m   kubelet, minikube  Successfully pulled image "gcr.io/google-samples/kubernetes-bootcamp:v1"
  Normal  Created                18m   kubelet, minikube  Created container
  Normal  Started                18m   kubelet, minikube  Started container
[xe1gyq@server ~]$
[xe1gyq@server ~]$ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
[xe1gyq@server ~]$ echo Name of the Pod: $POD_NAME
Name of the Pod: kubernetes-bootcamp-5dbf48f7d4-dwl48
[xe1gyq@server ~]$
[xe1gyq@server ~]$ curl http://localhost:8001/api/v1/proxy/namespaces/default/pods/$POD_NAME/
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5dbf48f7d4-dwl48 | v=1
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl logs $POD_NAME
Kubernetes Bootcamp App Started At: 2018-02-26T00:25:10.492Z | Running On:  kubernetes-bootcamp-5dbf48f7d4-dwl48 

Running On: kubernetes-bootcamp-5dbf48f7d4-dwl48 | Total Requests: 1 | App Uptime: 337.802 seconds | Log Time: 2018-02-26T00:30:48.294Z
Running On: kubernetes-bootcamp-5dbf48f7d4-dwl48 | Total Requests: 2 | App Uptime: 1241.86 seconds | Log Time: 2018-02-26T00:45:52.352Z
[xe1gyq@server ~]$

Executing commands in the Container

[xe1gyq@server ~]$ kubectl exec $POD_NAME env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=kubernetes-bootcamp-5dbf48f7d4-dwl48
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
NPM_CONFIG_LOGLEVEL=info
NODE_VERSION=6.3.1
HOME=/root
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl exec -ti $POD_NAME bash
root@kubernetes-bootcamp-5dbf48f7d4-dwl48:/#
root@kubernetes-bootcamp-5dbf48f7d4-dwl48:/# ls
bin   core  etc   lib     media    opt   root  sbin       srv  tmp  var
boot  dev   home  lib64  mnt    proc  run   server.js  sys  usr
root@kubernetes-bootcamp-5dbf48f7d4-dwl48:/#
root@kubernetes-bootcamp-5dbf48f7d4-dwl48:/# cat server.js 
var http = require('http');
var requests=0;
var podname= process.env.HOSTNAME;
var startTime;
var host;
var handleRequest = function(request, response) {
  response.setHeader('Content-Type', 'text/plain');
  response.writeHead(200);
  response.write("Hello Kubernetes bootcamp! | Running on: ");
  response.write(host);
  response.end(" | v=1\n");
  console.log("Running On:" ,host, "| Total Requests:", ++requests,"| App Uptime:", (new Date() - startTime)/1000 , "seconds", "| Log Time:",new Date());
}
var www = http.createServer(handleRequest);
www.listen(8080,function () {
    startTime = new Date();;
    host = process.env.HOSTNAME;
    console.log ("Kubernetes Bootcamp App Started At:",startTime, "| Running On: " ,host, "\n" );
});
root@kubernetes-bootcamp-5dbf48f7d4-dwl48:/#
root@kubernetes-bootcamp-5dbf48f7d4-dwl48:/# curl localhost:8080
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5dbf48f7d4-dwl48 | v=1
root@kubernetes-bootcamp-5dbf48f7d4-dwl48:/# exit
exit
[xe1gyq@server ~]$

Kubernetes :: Minikube :: Expose Your App Publicly

[xe1gyq@server ~]$ kubectl get pods
NAME                                   READY     STATUS    RESTARTS   AGE
kubernetes-bootcamp-5dbf48f7d4-dwl48   1/1       Running   0          32m
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   53m
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
service "kubernetes-bootcamp" exposed
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl get services
NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes            ClusterIP   10.96.0.1       <none>        443/TCP          55m
kubernetes-bootcamp   NodePort    10.105.17.192   <none>        8080:32473/TCP   1m
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl describe services/kubernetes-bootcamp
Name:                     kubernetes-bootcamp
Namespace:                default
Labels:                   run=kubernetes-bootcamp
Annotations:              <none>
Selector:                 run=kubernetes-bootcamp
Type:                     NodePort
IP:                       10.105.17.192
Port:                     <unset>  8080/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  32473/TCP
Endpoints:                172.17.0.4:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
[xe1gyq@server ~]$
[xe1gyq@server ~]$ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
[xe1gyq@server ~]$ echo NODE_PORT=$NODE_PORT
NODE_PORT=32473
[xe1gyq@server ~]$
[xe1gyq@server ~]$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5dbf48f7d4-dwl48 | v=1
[xe1gyq@server ~]$ 
`

Labels

[xe1gyq@server ~]$ kubectl describe deployment
Name:                   kubernetes-bootcamp
Namespace:              default
CreationTimestamp:      Sun, 25 Feb 2018 19:23:53 -0500
Labels:                 run=kubernetes-bootcamp
Annotations:            deployment.kubernetes.io/revision=1
Selector:               run=kubernetes-bootcamp
Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  1 max unavailable, 1 max surge
Pod Template:
  Labels:  run=kubernetes-bootcamp
  Containers:
   kubernetes-bootcamp:
    Image:        gcr.io/google-samples/kubernetes-bootcamp:v1
    Port:         8080/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
OldReplicaSets:  <none>
NewReplicaSet:   kubernetes-bootcamp-5dbf48f7d4 (1/1 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  39m   deployment-controller  Scaled up replica set kubernetes-bootcamp-5dbf48f7d4 to 1
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl get pods -l run=kubernetes-bootcamp
NAME                                   READY     STATUS    RESTARTS   AGE
kubernetes-bootcamp-5dbf48f7d4-dwl48   1/1       Running   0          40m
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl get services -l run=kubernetes-bootcamp
NAME                  TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes-bootcamp   NodePort   10.105.17.192   <none>        8080:32473/TCP   7m
[xe1gyq@server ~]$
[xe1gyq@server ~]$ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
[xe1gyq@server ~]$ echo Name of the Pod: $POD_NAME
Name of the Pod: kubernetes-bootcamp-5dbf48f7d4-dwl48
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl label pod $POD_NAME app=v1
pod "kubernetes-bootcamp-5dbf48f7d4-dwl48" labeled
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl describe pods $POD_NAME
Name:           kubernetes-bootcamp-5dbf48f7d4-dwl48
Namespace:      default
Node:           minikube/192.168.99.100
Start Time:     Sun, 25 Feb 2018 19:23:53 -0500
Labels:         app=v1
                pod-template-hash=1869049380
                run=kubernetes-bootcamp
Annotations:    <none>
Status:         Running
IP:             172.17.0.4
Controlled By:  ReplicaSet/kubernetes-bootcamp-5dbf48f7d4
Containers:
  kubernetes-bootcamp:
    Container ID:   docker://e0e42105484689b00a05c00a617a0ca331a3f5e1581c28ce1b96e73746b31918
    Image:          gcr.io/google-samples/kubernetes-bootcamp:v1
    Image ID:       docker-pullable://gcr.io/google-samples/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc64af
    Port:           8080/TCP
    State:          Running
      Started:      Sun, 25 Feb 2018 19:25:10 -0500
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-wptp4 (ro)
Conditions:
  Type           Status
  Initialized    True 
  Ready          True 
  PodScheduled   True 
Volumes:
  default-token-wptp4:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-wptp4
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     <none>
Events:
  Type    Reason                 Age   From               Message
  ----    ------                 ----  ----               -------
  Normal  Scheduled              42m   default-scheduler  Successfully assigned kubernetes-bootcamp-5dbf48f7d4-dwl48 to minikube
  Normal  SuccessfulMountVolume  42m   kubelet, minikube  MountVolume.SetUp succeeded for volume "default-token-wptp4"
  Normal  Pulling                42m   kubelet, minikube  pulling image "gcr.io/google-samples/kubernetes-bootcamp:v1"
  Normal  Pulled                 41m   kubelet, minikube  Successfully pulled image "gcr.io/google-samples/kubernetes-bootcamp:v1"
  Normal  Created                41m   kubelet, minikube  Created container
  Normal  Started                41m   kubelet, minikube  Started container
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl get pods -l app=v1
NAME                                   READY     STATUS    RESTARTS   AGE
kubernetes-bootcamp-5dbf48f7d4-dwl48   1/1       Running   0          43m
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl delete service -l run=kubernetes-bootcamp
service "kubernetes-bootcamp" deleted
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   1h
[xe1gyq@server ~]$
[xe1gyq@server ~]$ curl $(minikube ip):$NODE_PORT
curl: (7) Failed connect to 192.168.99.100:32473; Connection refused
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl exec -ti $POD_NAME curl localhost:8080
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5dbf48f7d4-dwl48 | v=1
[xe1gyq@server ~]$

Kubernetes :: Minikube :: Scaling Your App

[xe1gyq@server ~]$ kubectl get deployments
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   1         1         1            1           1h
[xe1gyq@server ~]$
kubernetes-bootcamp   1         1         1            1           1h
[xe1gyq@server ~]$ kubectl scale deployments/kubernetes-bootcamp --replicas=4
deployment "kubernetes-bootcamp" scaled
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl get deployments
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   4         4         4            4           1h
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl get pods -o wide
NAME                                   READY     STATUS    RESTARTS   AGE       IP           NODE
kubernetes-bootcamp-5dbf48f7d4-28clr   1/1       Running   0          56s       172.17.0.5   minikube
kubernetes-bootcamp-5dbf48f7d4-9w8zh   1/1       Running   0          56s       172.17.0.6   minikube
kubernetes-bootcamp-5dbf48f7d4-dwl48   1/1       Running   0          1h        172.17.0.4   minikube
kubernetes-bootcamp-5dbf48f7d4-q462n   1/1       Running   0          56s       172.17.0.7   minikube
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl get pods -o wide
NAME                                   READY     STATUS    RESTARTS   AGE       IP           NODE
kubernetes-bootcamp-5dbf48f7d4-28clr   1/1       Running   0          56s       172.17.0.5   minikube
kubernetes-bootcamp-5dbf48f7d4-9w8zh   1/1       Running   0          56s       172.17.0.6   minikube
kubernetes-bootcamp-5dbf48f7d4-dwl48   1/1       Running   0          1h        172.17.0.4   minikube
kubernetes-bootcamp-5dbf48f7d4-q462n   1/1       Running   0          56s       172.17.0.7   minikube
[xe1gyq@server ~]$ kubectl describe deployments/kubernetes-bootcamp
Name:                   kubernetes-bootcamp
Namespace:              default
CreationTimestamp:      Sun, 25 Feb 2018 19:23:53 -0500
Labels:                 run=kubernetes-bootcamp
Annotations:            deployment.kubernetes.io/revision=1
Selector:               run=kubernetes-bootcamp
Replicas:               4 desired | 4 updated | 4 total | 4 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  1 max unavailable, 1 max surge
Pod Template:
  Labels:  run=kubernetes-bootcamp
  Containers:
   kubernetes-bootcamp:
    Image:        gcr.io/google-samples/kubernetes-bootcamp:v1
    Port:         8080/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
OldReplicaSets:  <none>
NewReplicaSet:   kubernetes-bootcamp-5dbf48f7d4 (4/4 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  1m    deployment-controller  Scaled up replica set kubernetes-bootcamp-5dbf48f7d4 to 4
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl describe services/kubernetes
Name:              kubernetes
Namespace:         default
Labels:            component=apiserver
                   provider=kubernetes
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP:                10.96.0.1
Port:              https  443/TCP
TargetPort:        8443/TCP
Endpoints:         10.0.2.15:8443
Session Affinity:  ClientIP
Events:            <none>
[xe1gyq@server ~]$
[xe1gyq@server ~]$ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
[xe1gyq@server ~]$ echo Name of the Pod: $POD_NAME
Name of the Pod: kubernetes-bootcamp-5dbf48f7d4-28clr kubernetes-bootcamp-5dbf48f7d4-9w8zh kubernetes-bootcamp-5dbf48f7d4-dwl48 kubernetes-bootcamp-5dbf48f7d4-q462n
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   2h
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl scale deployments/kubernetes-bootcamp --replicas=2
deployment "kubernetes-bootcamp" scaled
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl get deployments
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   2         2         2            2           1h
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl get pods -o wide
NAME                                   READY     STATUS    RESTARTS   AGE       IP           NODE
kubernetes-bootcamp-5dbf48f7d4-9w8zh   1/1       Running   0          11m       172.17.0.6   minikube
kubernetes-bootcamp-5dbf48f7d4-dwl48   1/1       Running   0          1h        172.17.0.4   minikube
[xe1gyq@server ~]$

Kubernetes :: Minikube :: Performing A Rolling Update

Rolling updates allow the following actions: Promote an application from one environment to another (via container image updates). Rollback to previous versions. Continuous Integration and Continuous Delivery of applications with zero downtime.

[xe1gyq@server ~]$ kubectl get deployments
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   2         2         2            2           1h
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl get pods
NAME                                   READY     STATUS    RESTARTS   AGE
kubernetes-bootcamp-5dbf48f7d4-9w8zh   1/1       Running   0          14m
kubernetes-bootcamp-5dbf48f7d4-dwl48   1/1       Running   0          1h
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl describe pods
Name:           kubernetes-bootcamp-5dbf48f7d4-9w8zh
Namespace:      default
Node:           minikube/192.168.99.100
Start Time:     Sun, 25 Feb 2018 21:05:00 -0500
Labels:         pod-template-hash=1869049380
                run=kubernetes-bootcamp
Annotations:    <none>
Status:         Running
IP:             172.17.0.6
Controlled By:  ReplicaSet/kubernetes-bootcamp-5dbf48f7d4
Containers:
  kubernetes-bootcamp:
    Container ID:   docker://c5a2f9fc6662130f7615a0d9a09d6f15c5fb2674e43479ceec58e78bdfb6b4e7
    Image:          gcr.io/google-samples/kubernetes-bootcamp:v1
    Image ID:       docker-pullable://gcr.io/google-samples/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc64af
    Port:           8080/TCP
    State:          Running
      Started:      Sun, 25 Feb 2018 21:05:01 -0500
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-wptp4 (ro)
Conditions:
  Type           Status
  Initialized    True 
  Ready          True 
  PodScheduled   True 
Volumes:
  default-token-wptp4:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-wptp4
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     <none>
Events:
  Type    Reason                 Age   From               Message
  ----    ------                 ----  ----               -------
  Normal  Scheduled              14m   default-scheduler  Successfully assigned kubernetes-bootcamp-5dbf48f7d4-9w8zh to minikube
  Normal  SuccessfulMountVolume  14m   kubelet, minikube  MountVolume.SetUp succeeded for volume "default-token-wptp4"
  Normal  Pulled                 14m   kubelet, minikube  Container image "gcr.io/google-samples/kubernetes-bootcamp:v1" already present on machine
  Normal  Created                14m   kubelet, minikube  Created container
  Normal  Started                14m   kubelet, minikube  Started container


Name:           kubernetes-bootcamp-5dbf48f7d4-dwl48
Namespace:      default
Node:           minikube/192.168.99.100
Start Time:     Sun, 25 Feb 2018 19:23:53 -0500
Labels:         app=v1
                pod-template-hash=1869049380
                run=kubernetes-bootcamp
Annotations:    <none>
Status:         Running
IP:             172.17.0.4
Controlled By:  ReplicaSet/kubernetes-bootcamp-5dbf48f7d4
Containers:
  kubernetes-bootcamp:
    Container ID:   docker://e0e42105484689b00a05c00a617a0ca331a3f5e1581c28ce1b96e73746b31918
    Image:          gcr.io/google-samples/kubernetes-bootcamp:v1
    Image ID:       docker-pullable://gcr.io/google-samples/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc64af
    Port:           8080/TCP
    State:          Running
      Started:      Sun, 25 Feb 2018 19:25:10 -0500
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-wptp4 (ro)
Conditions:
  Type           Status
  Initialized    True 
  Ready          True 
  PodScheduled   True 
Volumes:
  default-token-wptp4:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-wptp4
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     <none>
Events:          <none>
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
deployment "kubernetes-bootcamp" image updated
[xe1gyq@server ~]$ 
`
[xe1gyq@server ~]$ kubectl get pods
NAME                                   READY     STATUS    RESTARTS   AGE
kubernetes-bootcamp-7689dc585d-4zbhj   1/1       Running   0          39s
kubernetes-bootcamp-7689dc585d-hbmnm   1/1       Running   0          39s
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl describe services/kubernetes-bootcamp
Name:                     kubernetes-bootcamp
Namespace:                default
Labels:                   run=kubernetes-bootcamp
Annotations:              <none>
Selector:                 run=kubernetes-bootcamp
Type:                     NodePort
IP:                       10.108.15.152
Port:                     <unset>  8080/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  30145/TCP
Endpoints:                172.18.0.10:8080,172.18.0.11:8080,172.18.0.8:8080 + 1 more...
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
[xe1gyq@server ~]$
[xe1gyq@server ~]$ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
[xe1gyq@server ~]$ echo NODE_PORT=$NODE_PORT
NODE_PORT=30145
[xe1gyq@server ~]$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7689dc585d-5m292 | v=2
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl rollout status deployments/kubernetes-bootcamp
deployment "kubernetes-bootcamp" successfully rolled out
[xe1gyq@server ~]$
[xe1gyq@server ~]$ kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10

Kubernetes :: CentOS

Last updated