Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Install a 3 Node Kubernetes Cluster on Ubuntu 16

Master: Dependencies

apt update && apt upgrade -y
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -

cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF

apt-get update
apt install linux-image-extra-virtual ca-certificates curl software-properties-common -y

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

add-apt-repository    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) \
stable"

apt update

Master: Install Docker, Kubernetnes:

apt install docker-ce kubelet kubeadm kubectl kubernetes-cni -y

Master: Initialize the Kubernetes Cluster:

kubeadm init --pod-network-cidr 192.168.0.0/16 --service-cidr 10.96.0.0/12 --service-dns-domain "k8s" --apiserver-advertise-address $(ifconfig eth0 | grep 'inet addr'| cut -d':' -f2 | awk '{print $1}')

You should get information back on initiating commands as a normal user, as well as the network that you need to deploy as well as how to join worker nodes to the cluster.

Master: Setup the Kubernetes Config:

As a normal user:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=$HOME/.kube/config
export KUBECONFIG=$HOME/.kube/config | tee -a ~/.bashrc

Master: Deploy a POD Network to the Cluster:

As a normal user, deploy a pod network:

kubectl apply -f http://docs.projectcalico.org/v2.3/getting-started/kubernetes/installation/hosted/kubeadm/1.6/calico.yaml
# latest:
# kubectl apply -f https://docs.projectcalico.org/v3.11/manifests/calico.yaml

Worker: Setup Dependencies and Install Kubernetes:

apt update && apt upgrade -y
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -

cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF

apt-get update
apt install linux-image-extra-virtual ca-certificates curl software-properties-common -y

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

add-apt-repository    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) \
stable"

apt update
apt install docker-ce kubelet kubeadm kubectl kubernetes-cni -y

Worker: Setup the Kubernetes Config:

As a normal user:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=$HOME/.kube/config
export KUBECONFIG=$HOME/.kube/config | tee -a ~/.bashrc

Worker: Join the Node to the Cluster:

From the output of the kubeadm init, you received a join token, which we will be running from the node that we would like to join:

kubeadm join --token 51e20a.40a4599dbe3ca2e0 172.31.39.193:6443 --discovery-token-ca-cert-hash sha256:[long-string]

Master: Check if the nodes are reachable:

kubectl get nodes
NAME               STATUS    ROLES     AGE       VERSION
ip-172-31-32-88    Ready     <none>    16m       v1.8.4
ip-172-31-39-193   Ready     master    23m       v1.8.4

Master: Verify if all the Kube-System Containers are running:

kubectl get all --namespace=kube-system

Master: List the Pods:

List the containers thats currently running:

kubectl get pods
NAME                     READY     STATUS              RESTARTS   AGE
guids-6d7b75568d-sndbd   0/1       ContainerCreating   0          5s

Master: Deploy a Pod:

Lets deploy a service into our kubernetes cluster:

kubectl run guids --image=alexellis2/guid-service:latest --port 9000
deployment "guids" created

kubectl get pods
NAME                     READY     STATUS    RESTARTS   AGE
guids-6d7b75568d-sndbd   1/1       Running   0          15s

Master: Describe the Pod:

Describe the Pod and get the IP:

kubectl describe pod guids-6d7b75568d-sndbd | grep IP
IP:             192.168.144.66

Master: Describing Services:

kubectl describe services kubernetes-dashboard --namespace=kube-system

Master: Testing the Service:

curl 192.168.144.66:9000/guid
{"guid":"dde5c4f1-d412-4acf-9ab3-bd81b347bc4f","container":"guids-6d7b75568d-sndbd"}

Master: Getting the Logs:

kubectl logs guids-6d7b75568d-sndbd

Master: Exec into a Cointainer:

kubectl exec -it guids-6d7b75568d-sndbd sh

Create the Dashboard Service:

kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
kubectl describe services kubernetes-dashboard --namespace=kube-system
kubectl proxy --address 0.0.0.0 --port 8001 --accept-hosts='^*$'

# or if using localhost:
ssh -L 8001:127.0.0.1:8001 -N

Deploy a Web Application:

kubectl create namespace sock-shop
kubectl apply -n sock-shop -f "https://github.com/microservices-demo/microservices-demo/blob/master/deploy/kubernetes/complete-demo.yaml?raw=true"
kubectl -n sock-shop get svc front-end
kubectl get pods --namespace=sock-shop

## Resources:
- https://github.com/kubernetes/kubernetes/tree/master/examples
- http://blog.pichuang.com.tw/Installing-Kubernetes-on-Linux-with-kubeadm/
- https://blog.alexellis.io/kubernetes-in-10-minutes/
- http://alexander.holbreich.org/kubernetes-on-ubuntu/
- http://alesnosek.com/blog/2017/02/14/accessing-kubernetes-pods-from-outside-of-the-cluster/
@mikkushukla

This comment has been minimized.

Copy link

mikkushukla commented Apr 4, 2018

Can we access kubernate dashboard without proxy?

@joergkiesewetter

This comment has been minimized.

Copy link

joergkiesewetter commented May 2, 2018

Step: Worker: Setup the Kubernetes Config

cmd: sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

cp: cannot stat '/etc/kubernetes/admin.conf': No such file or directory

@bogd

This comment has been minimized.

Copy link

bogd commented May 9, 2018

@joergkiesewetter - I don't think that step is actually necessary on a worker node. You just need to join the worker to the cluster (kubeadm join), and that's that.

@manikantareddypasala

This comment has been minimized.

Copy link

manikantareddypasala commented Jun 2, 2018

@joergkiesewetter
At worker you don't need that step

@senthillinux

This comment has been minimized.

Copy link

senthillinux commented Jun 14, 2018

Hi,

Kubernetes dashboard login not logged. I created cluster admin role and get the token value but not working.

@heangratha

This comment has been minimized.

Copy link

heangratha commented Aug 14, 2018

Hi,
How can I access service from my host computer?
I deployed 3

  • Ingress
  • Service
  • Deployment (Apache2)

I'm able access my service from host by using minikube but not on kubeadm

This is what I install in minikube the same as kubeadm

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml
kubectl apply -f https://raw.githubusercontent.com/containous/traefik/master/examples/k8s/traefik-ds.yaml
Thank

@pinggit

This comment has been minimized.

Copy link

pinggit commented Sep 26, 2018

this is good. but looks like the containers in 2 worker nodes does not communicate via tunl0... ping failed between containers.
does anyone see that and found a solution?

@stupidoes-day

This comment has been minimized.

Copy link

stupidoes-day commented Dec 28, 2018

i able to join onw of mya worker node but when i ran kubectl get nodes i got these status on my cluster

NAME STATUS ROLES AGE VERSION
master NotReady master 15m v1.13.1
node02 NotReady 12m v1.13.1

is there anyone faceing the same problem as me

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.