Skip to content

Instantly share code, notes, and snippets.

@HungHuynh
Created December 26, 2018 07:54
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save HungHuynh/ca03c00e67f8ecdb7c4b0b0543f2c058 to your computer and use it in GitHub Desktop.
Save HungHuynh/ca03c00e67f8ecdb7c4b0b0543f2c058 to your computer and use it in GitHub Desktop.

Module 1: Create cluster

Start with minikube

minikube version

minikube start

Start with kubectl

kubectl version

kubectl cluster-info

kubectl get nodes

Module 2: Deploy an app

kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080

kubectl get deployments

New terminal with kube-proxy

kubectl proxy
curl http://localhost:8001/version

#Get pop name
export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')

#Make request to application running in that pop
curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/

Module 3: Exploring your app

#Get list existing pods
kubectl get pods

#Get infomation of containers and images inside that pods
kubectl describe pods

New terminal with kube-proxy

kubectl proxy
export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')

echo Name of the Pod: $POD_NAME

curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/
kubectl logs $POP_NAME

kubectl exec $POP_NAME env

kubectl exec -ti $POP_NAME bash
> cat server.js
> curl localhost:8080
> exit

Module 4: Exploring your app public

Step 1: create new service

check current service running

kubectl get pods

kubectl get services

Create new service

kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080

kubectl get services 

kubectl describe services/kubernetes-bootcamp
export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')

echo NODE_PORT=$NODE_PORT

curl $(minikube ip):$NODE_PORT

Step 2: using labels

kubectl describe deployment

kubectl get pods -l run=kubernetes-bootcamp

kubectl get services -l run=kubernetes-bootcamp
export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')

echo Name of the Pod: $POD_NAME

kubectl label pod $POD_NAME app=v1

kubectl describe pops $POD_NAME

kubectl get pods -l app=v1

Step 3: delete service

$ kubectl delete service -l run=kubernetes-bootcamp
service "kubernetes-bootcamp" deleted
$ kubectl get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   26m
$ curl $(minikube ip):$NODE_PORT
curl: (7) Failed to connect to 172.17.0.44 port 31815: Connection refused
$ kubectl exec -ti $POD_NAME curl localhost:8080
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-mzxx5 | v=1

Module 5: Scale your app

Step 1: scaling a deployment

$ kubectl get deployments

$ kubectl scale deployments/kubernetes-bootcamp --replicas=4
deployment.extensions/kubernetes-bootcamp scaled
$ kubectl get deployments
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   4         4         4            4           44s
$ kubectl get pods -o wide
NAME                                   READY     STATUS    RESTARTS   AGE       IP           NODE
kubernetes-bootcamp-5c69669756-2kz6c   1/1       Running   0          2m        172.18.0.4   minikube
kubernetes-bootcamp-5c69669756-cl9wz   1/1       Running   0          2m        172.18.0.5   minikube
kubernetes-bootcamp-5c69669756-ksc7k   1/1       Running   0          2m        172.18.0.3   minikube
kubernetes-bootcamp-5c69669756-zmdx2   1/1       Running   0          2m        172.18.0.2   minikube
$ kubectl describe deployments/kubernetes-bootcamp
Name:                   kubernetes-bootcamp
Namespace:              default
CreationTimestamp:      Sat, 22 Dec 2018 06:51:16 +0000
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:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  run=kubernetes-bootcamp
  Containers:
   kubernetes-bootcamp:
    Image:        gcr.io/google-samples/kubernetes-bootcamp:v1
    Port:         8080/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   kubernetes-bootcamp-5c69669756 (4/4 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  7m    deployment-controller  Scaled up replica set kubernetes-bootcamp-5c69669756 to 1
  Normal  ScalingReplicaSet  6m    deployment-controller  Scaled up replica set kubernetes-bootcamp-5c69669756 to 4

Step 2: load balancing

$ kubectl describe services/kubernetes-bootcamp
Name:                     kubernetes-bootcamp
Namespace:                default
Labels:                   run=kubernetes-bootcamp
Annotations:              <none>
Selector:                 run=kubernetes-bootcamp
Type:                     NodePort
IP:                       10.104.6.130
Port:                     <unset>  8080/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  31201/TCP
Endpoints:                172.18.0.2:8080,172.18.0.3:8080,172.18.0.4:8080 + 1 more...
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
$ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
$ echo NODE_PORT=$NODE_PORT
NODE_PORT=31201
$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-zmdx2 | v=1

Step 3: scale down

$ kubectl scale deployments/kubernetes-bootcamp --replicas=2
deployment.extensions/kubernetes-bootcamp scaled
$ kubectl get deployments
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   2         2         2            2           9m
$ kubectl get pods -o wide
NAME                                   READY     STATUS        RESTARTS   AGE       IP           NODE
kubernetes-bootcamp-5c69669756-2kz6c   0/1       Terminating   0          9m        172.18.0.4   minikube
kubernetes-bootcamp-5c69669756-cl9wz   0/1       Terminating   0          9m        172.18.0.5   minikube
kubernetes-bootcamp-5c69669756-ksc7k   1/1       Running       0          9m        172.18.0.3   minikube
kubernetes-bootcamp-5c69669756-zmdx2   1/1       Running       0          9m        172.18.0.2   minikube

Module 6: Update your app

Step 1: update the versions of the app

$ kubectl get deployments
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   4         4         4            4           24s
$ kubectl get pods
NAME                                   READY     STATUS    RESTARTS   AGE
kubernetes-bootcamp-5c69669756-fcsrx   1/1       Running   0          39s
kubernetes-bootcamp-5c69669756-fgs4w   1/1       Running   0          39s
kubernetes-bootcamp-5c69669756-lkvtg   1/1       Running   0          39s
kubernetes-bootcamp-5c69669756-nn7d6   1/1       Running   0          39s	
$ kubectl describe pods
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
deployment.extensions/kubernetes-bootcamp image updated
$ kubectl describe pods

Step 2: verify an update

$ kubectl describe services/kubernetes-bootcamp
Name:                     kubernetes-bootcamp
Namespace:                default
Labels:                   run=kubernetes-bootcamp
Annotations:              <none>
Selector:                 run=kubernetes-bootcamp
Type:                     NodePort
IP:                       10.99.4.64
Port:                     <unset>  8080/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  31743/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>
$ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
$ echo NODE_PORT=$NODE_PORT
NODE_PORT=31743
$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7799cbcb86-cf6nd | v=2
$ kubectl describe pods

Step 3: rollback an update

$ kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10
deployment.extensions/kubernetes-bootcamp image updated
$ kubectl get deployments
$ kubectl get pods
NAME                                   READY     STATUS             RESTARTS   AGE
kubernetes-bootcamp-5f76cd7b94-68p8h   0/1       ErrImagePull       0          1m
kubernetes-bootcamp-5f76cd7b94-pxwcm   0/1       ImagePullBackOff   0          1m
kubernetes-bootcamp-7799cbcb86-hpcgk   1/1       Running            0          9m
kubernetes-bootcamp-7799cbcb86-qglw4   1/1       Running            0          9m
kubernetes-bootcamp-7799cbcb86-z74gl   1/1       Running            0          9m
$ kubectl rollout undo deployments/kubernetes-bootcamp
deployment.extensions/kubernetes-bootcamp
$ kubectl get pods
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment