Skip to content

Instantly share code, notes, and snippets.

@ruanbekker
Last active October 21, 2023 08:25
Show Gist options
  • Save ruanbekker/38a38aea5f325f7fa4a19e795ef4f0d0 to your computer and use it in GitHub Desktop.
Save ruanbekker/38a38aea5f325f7fa4a19e795ef4f0d0 to your computer and use it in GitHub Desktop.
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/
@subhanshu-shukla
Copy link

Can we access kubernate dashboard without proxy?

@joergkiesewetter
Copy link

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
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
Copy link

@joergkiesewetter
At worker you don't need that step

@senthillinux
Copy link

Hi,

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

@heangratha
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
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
Copy link

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

@hungbang
Copy link

hungbang commented May 9, 2021

Step: https://gist.github.com/ruanbekker/38a38aea5f325f7fa4a19e795ef4f0d0#master-install-docker-kubernetnes
root@vultr:~# 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}')
eth0: error fetching interface information: Device not found
flag needs an argument: --apiserver-advertise-address
To see the stack trace of this error execute with --v=5 or higher

is there anyone facing this out?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment