This article records the commands for Kubernetes Tutorial online sessions:
https://kubernetes.io/docs/tutorials/kubernetes-basics/1. Create a Cluster
https://kubernetes.io/docs/tutorials/kubernetes-basics/create-cluster/cluster-interactive/1.1 Show minikube version
$ minikube version
minikube version: v0.28.2
1.2 Start minikube cluster
$ minikube start
Starting local Kubernetes v1.10.0 cluster...
Starting VM...
Getting VM IP address...
Moving files into cluster...
Setting 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.
1.3 Show client and server side version
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.0", GitCommit:"91e7b4fd31fcd3d5f436da26c980becec37ceefe", GitTreeState:"clean", BuildDate:"2018-06-27T20:17:28Z", GoVersion:"go1.10.2", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.0", GitCommit:"fc32d2f3698e36b93322a3465f63a14e9f0eaead", GitTreeState:"clean", BuildDate:"2018-04-10T12:46:31Z", GoVersion:"go1.9.4", Compiler:"gc", Platform:"linux/amd64"}
1.4 View cluster information
$ kubectl cluster-info
Kubernetes master is running at https://172.17.0.109:8443
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
1.5 List all Nodes in the cluster
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready <none> 2m v1.10.0
(Currently only 1 node named "minikube" is in the cluster, and its STATUS is ready to accept applications for deployment.)
2. Deploy an App
https://kubernetes.io/docs/tutorials/kubernetes-basics/deploy-app/deploy-interactive/ 2.1 Create a deployment for application
$ kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1--port=8080
deployment.apps/kubernetes-bootcamp created
This command creates a deployment named "kubernetes-bootcamp" based on Docker image from "gcr.io/google-samples/kubernetes-bootcamp" with tag "v1". And this application will run on port 8080.
2.2 List deployment
$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 1 1 1 1 2m
Above shows there is 1 deployment running a single instance of the application.
2.3 Create a proxy
$ kubectl proxy
Starting to serve on 127.0.0.1:8001
This proxy creates the connection between our host (the online terminal) and the Kubernetes cluster.
2.4 Query the API through proxy
$ curl http://localhost:8001/version
{
"major": "1",
"minor": "10",
"gitVersion": "v1.10.0",
"gitCommit": "fc32d2f3698e36b93322a3465f63a14e9f0eaead",
"gitTreeState": "clean",
"buildDate": "2018-04-10T12:46:31Z",
"goVersion": "go1.9.4",
"compiler": "gc",
"platform": "linux/amd64"
}
2.5 Save the POD name into environment variable $POD_NAME
$ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metdata.name}}{{"\n"}}{{end}}')
$ echo Name of the Pod: $POD_NAME
Name of the Pod: kubernetes-bootcamp-5c69669756-4qdmk
2.6 Query the API through proxy to specific POD
$ curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-4qdmk | v=1
3. Explorer App
https://kubernetes.io/docs/tutorials/kubernetes-basics/explore/explore-interactive/3.1 List PODs
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-5c69669756-5mxvh 0/1 Pending 0 5s
Currently only 1 POD named "kubernetes-bootcamp-5c69669756-5mxvh" is running.
3.2 View Container information inside the POD
$ kubectl describe pods
Name: kubernetes-bootcamp-5c69669756-5mxvh
Namespace: default
Node: minikube/172.17.0.17
Start Time: Thu, 01 Nov 2018 21:20:21 +0000
Labels: pod-template-hash=1725225312
run=kubernetes-bootcamp
Annotations: <none>
Status: Running
IP: 172.18.0.2
Controlled By: ReplicaSet/kubernetes-bootcamp-5c69669756
Containers:
kubernetes-bootcamp:
Container ID: docker://f9d6331b1c7dcc24e6c18a920fa65f2344c2421f5f394665668fd406c5641e22
Image: gcr.io/google-samples/kubernetes-bootcamp:v1
Image ID: docker-pullable://gcr.io/google-samples/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc64af
Port: 8080/TCP
Host Port: 0/TCP
State: Running
Started: Thu, 01 Nov 2018 21:20:22 +0000
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-b8t9g (ro)
Conditions:
Type Status
Initialized True
Ready True
PodScheduled True
Volumes:
default-token-b8t9g:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-b8t9g
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 1m (x4 over 1m) default-scheduler 0/1 nodes are available: 1 node(s) were not ready.
Normal Scheduled 1m default-scheduler Successfully assigned kubernetes-bootcamp-5c69669756-5mxvh to minikube
Normal SuccessfulMountVolume 1m kubelet, minikube MountVolume.SetUp succeeded for volume "default-token-b8t9g"
Normal Pulled 1m kubelet, minikube Container image "gcr.io/google-samples/kubernetes-bootcamp:v1" already present on machine
Normal Created 1m kubelet, minikube Created container
Normal Started 1m kubelet, minikube Started container
3.3 View Container logs
$ kubectl logs $POD_NAME
Kubernetes Bootcamp App Started At: 2018-11-01T21:20:22.891Z | Running On: kubernetes-bootcamp-5c69669756-5mxvh
Running On: kubernetes-bootcamp-5c69669756-5mxvh | Total Requests: 1 | App Uptime: 309.865 seconds | Log Time: 2018-11-01T21:25:32.756Z
Here we only have 1 Container inside the POD, so no need to specify the Container name.
The usage for "kubectl logs" is:
kubectl logs [-f] [-p] (POD | TYPE/NAME) [-c CONTAINER] [options]
So we can specify both POD and Container name as well:
kubectl logs $POD_NAME -c kubernetes-bootcamp
3.4 Execute command inside the Container
$ kubectl exec $POD_NAME env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=kubernetes-bootcamp-5c69669756-5mxvh
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
3.5 Start an open console inside the Container
$ kubectl exec -ti $POD_NAME bash
root@kubernetes-bootcamp-5c69669756-5mxvh:/#
4. Expose App
https://kubernetes.io/docs/tutorials/kubernetes-basics/expose/expose-interactive/4.1 List Services
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 17m
The default service(created by minikube) named "kubernetes" is based on TYPE "ClusterIP".
4.2 Expose a new Service
$ kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
service/kubernetes-bootcamp exposed
Above command creates a new service named "kubernetes-bootcamp" based on TYPE "NodePort" on internal port 8080. The external port is 30336.
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 15s
kubernetes-bootcamp NodePort 10.100.77.17 <none> 8080:30336/TCP 1s
4.3 View Service information
$ kubectl describe services/kubernetes-bootcamp
Name: kubernetes-bootcamp
Namespace: default
Labels: run=kubernetes-bootcamp
Annotations: <none>
Selector: run=kubernetes-bootcamp
Type: NodePort
IP: 10.100.77.17
Port: <unset> 8080/TCP
TargetPort: 8080/TCP
NodePort: <unset> 30336/TCP
Endpoints: 172.18.0.2:8080
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
4.4 Fetch the external port of the Service
$ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index.spec.ports 0).nodePort}}')
$ echo NODE_PORT=$NODE_PORT
NODE_PORT=30336
Test from IP of the Node and the external port:
$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-f7d5c | v=1
4.5 Fetch the label from the deployment
$ kubectl describe deployment|grep -i label
Labels: run=kubernetes-bootcamp
Labels: run=kubernetes-bootcamp
4.6 List PODs and Services based on label
$ kubectl get pods -l run=kubernetes-bootcamp
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-5c69669756-f7d5c 1/1 Running 0 17m
$ kubectl get services -l run=kubernetes-bootcamp
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-bootcamp NodePort 10.100.77.17 <none> 8080:30336/TCP 17m
4.7 Apply a new label to a POD
$ kubectl label pod $POD_NAME app=v1
pod/kubernetes-bootcamp-5c69669756-f7d5c labeled
Check the new label of the POD:
$ kubectl describe pods $POD_NAME
Name: kubernetes-bootcamp-5c69669756-f7d5c
Namespace: default
Node: minikube/172.17.0.18
Start Time: Thu, 01 Nov 2018 22:22:22 +0000
Labels: app=v1
pod-template-hash=1725225312
run=kubernetes-bootcamp
...
4.8 Delete a Service based on label
$ kubectl delete service -l run=kubernetes-bootcamp
service "kubernetes-bootcamp" deleted
4.9 Confirm a Service is removed
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 29m
$ curl $(minikube ip):$NODE_PORT
curl: (7) Failed to connect to 172.17.0.18 port 30336: Connection refused
Confirm the App is still running inside POD:
$ kubectl exec -ti $POD_NAME curl localhost:8080
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-f7d5c | v=1
5. Scale App
https://kubernetes.io/docs/tutorials/kubernetes-basics/scale/scale-interactive/5.1 Scale up the deployment to 4 replicas
$ 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 1m
Confirm that more PODs are running now:
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
kubernetes-bootcamp-5c69669756-5dcc6 1/1 Running 0 1m 172.18.0.7 minikube
kubernetes-bootcamp-5c69669756-8bbrg 1/1 Running 0 2m 172.18.0.2 minikube
kubernetes-bootcamp-5c69669756-9jcgl 1/1 Running 0 1m 172.18.0.5 minikube
kubernetes-bootcamp-5c69669756-s7vlm 1/1 Running 0 1m 172.18.0.6 minikube
5.2 Check event log
$ kubectl describe deployments/kubernetes-bootcamp
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 3m deployment-controller Scaled up replica set kubernetes-bootcamp-5c69669756 to 1
Normal ScalingReplicaSet 2m deployment-controller Scaled up replica set kubernetes-bootcamp-5c69669756 to 4
5.3 Find the external port for the Service
$ kubectl describe services/kubernetes-bootcamp
Name: kubernetes-bootcamp
Namespace: default
Labels: run=kubernetes-bootcamp
Annotations: <none>
Selector: run=kubernetes-bootcamp
Type: NodePort
IP: 10.107.230.53
Port: <unset> 8080/TCP
TargetPort: 8080/TCP
NodePort: <unset> 30798/TCP
Endpoints: 172.18.0.2:8080,172.18.0.5:8080,172.18.0.6: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=30798
$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-9jcgl | v=1
5.4 Scale down the deployment to 2 replicas
$ 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 8m
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
kubernetes-bootcamp-5c69669756-5dcc6 1/1 Terminating 0 7m 172.18.0.7 minikube
kubernetes-bootcamp-5c69669756-8bbrg 1/1 Running 0 8m 172.18.0.2 minikube
kubernetes-bootcamp-5c69669756-9jcgl 1/1 Terminating 0 7m 172.18.0.5 minikube
kubernetes-bootcamp-5c69669756-s7vlm 1/1 Running 0 7m 172.18.0.6 minikube
Eventually the 2 "Terminating" PODs will be gone:
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
kubernetes-bootcamp-5c69669756-8bbrg 1/1 Running 0 12m 172.18.0.2 minikube
kubernetes-bootcamp-5c69669756-s7vlm 1/1 Running 0 11m 172.18.0.6 minikube
6. Update App
https://kubernetes.io/docs/tutorials/kubernetes-basics/update/update-interactive/6.1 List current Deployment and PODs
$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 4 4 4 4 15s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-5c69669756-4gvjd 1/1 Running 0 18s
kubernetes-bootcamp-5c69669756-j8wf8 1/1 Running 0 18s
kubernetes-bootcamp-5c69669756-m5fnv 1/1 Running 0 18s
kubernetes-bootcamp-5c69669756-qlqsj 1/1 Running 0 18s
6.2 Update the image for the Deployment
$ kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
deployment.extensions/kubernetes-bootcamp image updated
6.3 Monitor the PODs status
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-5c69669756-4gvjd 1/1 Running 0 3m
kubernetes-bootcamp-5c69669756-j8wf8 1/1 Terminating 0 3m
kubernetes-bootcamp-5c69669756-m5fnv 1/1 Terminating 0 3m
kubernetes-bootcamp-5c69669756-qlqsj 1/1 Running 0 3m
kubernetes-bootcamp-7799cbcb86-7c6h7 1/1 Running 0 2s
kubernetes-bootcamp-7799cbcb86-xwglv 1/1 Running 0 2s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-5c69669756-4gvjd 1/1 Terminating 0 3m
kubernetes-bootcamp-5c69669756-j8wf8 1/1 Terminating 0 3m
kubernetes-bootcamp-5c69669756-m5fnv 1/1 Terminating 0 3m
kubernetes-bootcamp-5c69669756-qlqsj 1/1 Terminating 0 3m
kubernetes-bootcamp-7799cbcb86-6rk6l 1/1 Running 0 11s
kubernetes-bootcamp-7799cbcb86-7c6h7 1/1 Running 0 13s
kubernetes-bootcamp-7799cbcb86-x4cgg 1/1 Running 0 11s
kubernetes-bootcamp-7799cbcb86-xwglv 1/1 Running 0 13s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-7799cbcb86-6rk6l 1/1 Running 0 2m
kubernetes-bootcamp-7799cbcb86-7c6h7 1/1 Running 0 2m
kubernetes-bootcamp-7799cbcb86-x4cgg 1/1 Running 0 2m
kubernetes-bootcamp-7799cbcb86-xwglv 1/1 Running 0 2m
6.4 Check the rollout status
$ kubectl rollout status deployments/kubernetes-bootcamp
deployment "kubernetes-bootcamp" successfully rolled out
And check the image for each container:
$ kubectl describe pods|grep Image:
Image: jocatalin/kubernetes-bootcamp:v2
Image: jocatalin/kubernetes-bootcamp:v2
Image: jocatalin/kubernetes-bootcamp:v2
Image: jocatalin/kubernetes-bootcamp:v2
6.5 Another WRONG image 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
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 4 5 2 3 12m
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-5f76cd7b94-6smkb 0/1 ErrImagePull 0 34s
kubernetes-bootcamp-5f76cd7b94-sbk7t 0/1 ErrImagePull 0 34s
kubernetes-bootcamp-7799cbcb86-7c6h7 1/1 Running 0 9m
kubernetes-bootcamp-7799cbcb86-x4cgg 1/1 Running 0 9m
kubernetes-bootcamp-7799cbcb86-xwglv 1/1 Running 0 9m
6.6 Find out the root cause
$ kubectl describe pods|grep Failed
Warning Failed 5m (x4 over 6m) kubelet, minikube Failed to pull image "gcr.io/google-samples/kubernetes-bootcamp:v10": rpc error: code = Unknown desc =unauthorized: authentication required
Warning Failed 5m (x4 over 6m) kubelet, minikube Error: ErrImagePull
Warning Failed 4m (x6 over 6m) kubelet, minikube Error: ImagePullBackOff
Warning Failed 5m (x4 over 6m) kubelet, minikube Failed to pull image "gcr.io/google-samples/kubernetes-bootcamp:v10": rpc error: code = Unknown desc =unauthorized: authentication required
Warning Failed 5m (x4 over 6m) kubelet, minikube Error: ErrImagePull
Warning Failed 4m (x6 over 6m) kubelet, minikube Error: ImagePullBackOff
There is no image called v10 in the repository.
6.7 Rollback to previous working version
$ kubectl rollout undo deployments/kubernetes-bootcamp
deployment.extensions/kubernetes-bootcamp
Confirm the rollback is done:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-7799cbcb86-7c6h7 1/1 Running 0 19m
kubernetes-bootcamp-7799cbcb86-8d5h6 1/1 Running 0 1m
kubernetes-bootcamp-7799cbcb86-x4cgg 1/1 Running 0 19m
kubernetes-bootcamp-7799cbcb86-xwglv 1/1 Running 0 19m
$ kubectl describe pods |grep Image:
Image: jocatalin/kubernetes-bootcamp:v2
Image: jocatalin/kubernetes-bootcamp:v2
Image: jocatalin/kubernetes-bootcamp:v2
Image: jocatalin/kubernetes-bootcamp:v2