Kubernetes Basics
Architecture
Source: https://x-team.com/blog/introduction-kubernetes-architecture/
Install Minikube
https://kubernetes.io/docs/tasks/tools/install-minikube/
Install Kubectl
https://docs.docker.com/ee/ucp/user-access/kubectl/
Start minikube server. It acts like a single node kubernetes server.
$ 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.
If you are running minikube inside the VM, use the following command.
$ minikube start --vm-driver=none
Set docker environment variables
$ minikube docker-env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/abulbasar/.minikube/certs"
export DOCKER_API_VERSION="1.35"
# Run this command to configure your shell:
# eval $(minikube docker-env)
$ eval $(minikube docker-env)
You can ssh into the VM by finding the IP (from kubectl config view) and using username "docker" password "tcuser":
$ minikube ip
192.168.XX.XX
$ ssh docker@192.168.XX.XX
Launch minikube dashboard
$ minikube dashboard
If you want to ssh into minikube,
$ minikube ssh
Otherwise, you can use username and password to login username "docker" password "tcuser" using IP address.
$ minikube ip
Test kubernetes with hello-minikube
Install the hello-minikube pod
The minikube project on GitHub offers a quick start demo which uses a pre-built Docker image hello-minikube. Since we started the minikube cluster already, we can skip the first step:
Let’s run the built-in hello-minikube pod. This will create a deployment for the pod:
$ kubectl run hello-minikube --image=gcr.io/google_containers/echoserver:1.4 --port=8080
deployment "hello-minikube" created
We can inspect the pods and the deployments to verify these have been updated with the following commands:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-minikube-c8b6b4fdc-p2rzh 0/1 ContainerCreating 0 6s
$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
hello-minikube 1 1 1 1 28s
In order to access the hello-minikube service, we must first expose the deployment to an external IP via the command:
$ kubectl expose deployment hello-minikube --type=NodePort
service "hello-minikube" exposed
Note we must use the type=NodePort because minikube doesn’t support the LoadBalancer service. We can check if the service was exposed by listing services:
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-minikube NodePort 10.107.144.113 <none> 8080:31206/TCP 23s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4h
Find minikube service url
$ minikube service hello-minikube --url
http://192.168.99.100:31206
We could get the IP of minikube
$ minikube ip
192.168.99.100
Now we can either curl the service from the CLI, or hit it via the browser.
$ curl $(minikube service hello-minikube --url)
CLIENT VALUES:
client_address=172.17.0.1
command=GET
real path=/
query=nil
request_version=1.1
request_uri=http://192.168.99.100:8080/
This verifies that we could successfully test kubenetes.
Delete the deployment and services.
$ kubectl delete deployment,service hello-minikube
deployment.extensions "hello-minikube" deleted
service "hello-minikube" deleted
Test with custom build docker image
Look at exist docker images
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
k8s.gcr.io/kube-proxy-amd64 v1.10.0 bfc21aadc7d3 4 months ago 97MB
k8s.gcr.io/kube-apiserver-amd64 v1.10.0 af20925d51a3 4 months ago 225MB
k8s.gcr.io/kube-controller-manager-amd64 v1.10.0 ad86dbed1555 4 months ago 148MB
k8s.gcr.io/kube-scheduler-amd64 v1.10.0 704ba848e69a 4 months ago 50.4MB
k8s.gcr.io/etcd-amd64 3.1.12 52920ad46f5b 5 months ago 193MB
k8s.gcr.io/kube-addon-manager v8.6 9c16409588eb 5 months ago 78.4MB
k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64 1.14.8 c2ce1ffb51ed 7 months ago 41MB
k8s.gcr.io/k8s-dns-sidecar-amd64 1.14.8 6f7f2dc7fab5 7 months ago 42.2MB
k8s.gcr.io/k8s-dns-kube-dns-amd64 1.14.8 80cc5ea4b547 7 months ago 50.5MB
k8s.gcr.io/pause-amd64 3.1 da86e6ba6ca1 7 months ago 742kB
k8s.gcr.io/kubernetes-dashboard-amd64 v1.8.1 e94d2f21bc0c 8 months ago 121MB
gcr.io/k8s-minikube/storage-provisioner v1.8.1 4689081edb10 9 months ago 80.8MB
gcr.io/google_containers/echoserver 1.4 a90209bb39e3 2 years ago 140MB
Copy the directory - web-service.
$ git clone https://github.com/abulbasar/docker-examples
$ cd docker-examples/docker-app/web-service/
$ ls
Dockerfile app.py
Build a new image using specification in Dockerfile
$ docker build -t mywebappimage:1.0 .
Sending build context to Docker daemon 4.096kB
Step 1/4 : FROM abasar/web_tier:1.0
1.0: Pulling from abasar/web_tier
c64513b74145: Already exists
01b8b12bad90: Already exists
c5d85cf7a05f: Already exists
b6b268720157: Already exists
e12192999ff1: Already exists
f0cd933648d7: Already exists
Digest: sha256:9c21c7d225a50ee19916e12fd2d15a91715379ebbcc804e511258e5d3bad94f8
Status: Downloaded newer image for abasar/web_tier:1.0
---> d6a39aa114c8
Step 2/4 : COPY . /app
---> a62af20ad34a
Step 3/4 : WORKDIR /app
Removing intermediate container 1a859bcb949b
---> e4eaea026858
Step 4/4 : CMD ["python", "app.py"]
---> Running in c3718aa8a0b9
Removing intermediate container c3718aa8a0b9
---> 27b05321d593
Successfully built 27b05321d593
Successfully tagged mywebappimage:1.0
Start kubenete deployment
$ kubectl run mywebapp --image=mywebappimage:1.0 --port=5000 --image-pull-policy=IfNotPresent
deployment.apps/mywebapp created
List the existing pods
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mywebapp-59985486fb-hzm5k 1/1 Running 0 23s
Describe the pod
$ kubectl describe pod mywebapp-59985486fb-hzm5k
Name: mywebapp-59985486fb-hzm5k
Namespace: default
Node: minikube/10.0.2.15
Start Time: Thu, 16 Aug 2018 01:17:00 +0530
Labels: pod-template-hash=1554104296
run=mywebapp
Annotations: <none>
Status: Running
IP: 172.17.0.4
Controlled By: ReplicaSet/mywebapp-59985486fb
Containers:
mywebapp:
Container ID: docker://0833acd5c851652fa66b9d55576857c3a916bed3aed464d9425bbe4b295b69fe
Image: mywebappimage:1.0
Image ID: docker://sha256:27b05321d5935b53c2cbc097da8dc800e57354213d557f0ab2b346bac98e1bdb
Port: 5000/TCP
Host Port: 0/TCP
State: Running
Started: Thu, 16 Aug 2018 01:17:01 +0530
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-lvmxl (ro)
Conditions:
Type Status
Initialized True
Ready True
PodScheduled True
Volumes:
default-token-lvmxl:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-lvmxl
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
---- ------ ---- ---- -------
Normal Scheduled 1m default-scheduler Successfully assigned mywebapp-59985486fb-hzm5k to minikube
Normal SuccessfulMountVolume 1m kubelet, minikube MountVolume.SetUp succeeded for volume "default-token-lvmxl"
Normal Pulled 1m kubelet, minikube Container image "mywebappimage:1.0" already present on machine
Normal Created 1m kubelet, minikube Created container
Normal Started 1m kubelet, minikube Started container
Expose the deployment to an external IP address and port in order to access it via curl:
$ kubectl expose deployment mywebapp --type=NodePort
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4h
mywebapp NodePort 10.105.206.4 <none> 5000:30596/TCP 9s
Find service URL
$ minikube service mywebapp --url
http://192.168.99.100:30596
Test the url using curl
$ curl http://192.168.99.100:30596
Hello world
Login to a container
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
mywebapp-59985486fb-hzm5k 1/1 Running 0 16m
$ kubectl exec -it mywebapp-59985486fb-hzm5k -- /bin/bash
Delete the deployment and service
$ kubectl delete deployment,service mywebapp
Kubernetes Deployment Options
Build multi node Kubernetes cluster using kubeadm
https://medium.com/@SystemMining/setup-kubenetes-cluster-on-ubuntu-16-04-with-kubeadm-336f4061d929
Installations for Windows - 10 Professional
Install docker
https://docs.docker.com/toolbox/toolbox_install_windows/#what-you-get-and-how-it-works
Install minikube
https://github.com/kubernetes/minikube/releases
Install kubectl
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.11.0/bin/windows/amd64/kubectl.exe
Add the binary in to your PATH.