🎥 Setting up a Kubernetes Cluster - Live Stream Replay (with notes)
Tags: linux, kubernetes, tutorial
Published: 2019-10-02 21:42:09

Ever wanted to setup your own Kubernetes(k8s) cluster for development? Wanted to go a bit further than using `minikube`? We'll walk through setting up 3 vms to create our very own k8 cluster.

## Video - notes below
{% youtube RWUskyCbbSw %} 

## Notes and Summary
*notes*
- The first ~30 minutes of this are VM install and setup, feel free to skip that.
- The GUI I'm using for KVMs is [`virt-manager`](https://virt-manager.org/).
- I did not have virtualization turned on in my system bios (new system didn't have the switch flipped yet) so this severely impacted performance.
- `virt-clone` should have provisioned a different mac address for each VM clone, still not sure what happened there.

### Summary
Most of the instructions I ran through *aside* from networking woes can be boiled down to this:

#### 1. Setup support for installing packages over https

`sudo apt-get update && sudo apt-get install -y apt-transport-https`

#### 2. Add trusted key for packages we want to install

`curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add`

#### 3. Add repository for Kubernetes(k8s)

`sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"`

#### 4. Update package listings
`sudo apt-get update`

#### 5. Install kubernetes, its tools, and docker.io 
`sudo apt install kubectl kubeadm docker.io`

#### 6. Disable swap memory. (it isn't supported)
`sudo swapoff -a`

You'll also want to remove the swap entry from `fstab` so you don't have to do this every time your system comes up (vm or bare metal).

`sudo nano /etc/fstab` 

Remove the entire line with `swap`, but nothing else, be careful here.

#### 7. Enable and start the docker service.
`sudo systemctl enable docker.service`

#### 8. Setup the Docker Daemon
`sudo nano /etc/docker/daemon.json`
```json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
```

`sudo mkdir -p /etc/systemd/system/docker.service.d`

#### 9. Reload the docker daemon and system process
`sudo systemctl daemon-reload && sudo systemctl restart docker`

#### 10. Clone our VM.
At this point you can clone your VM, you should be able to do this and get the same installs, but with different network MAC addresses. Some issues with my own setup prevented this from going smoothly, but this is the time to clone the VM if you want to go that route. 

Spin up two clones of our first VM. You'll need to change the `hostname` at a minimum, and reboot (or restart the networking service).

`sudo nano /etc/hostname`

I used `kube-worker-1` and `kube-worker-2`, but use whatever you like. So long as it doesn't have `_` or `CAPS` characters. I learned that the hard way.

`sudo reboot`

### Steps on our Manager node

#### 1. Initialize our k8 cluster
`sudo kubeadm config images pull` - (optional) The next command will do this by default, but it can take a while, my sanity prefers pulling the images first.


`sudo kubeadm init`

After running this command, you'll get output similar to this:

  `mkdir -p $HOME/.kube`
  `sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config`
  `sudo chown $(id -u):$(id -g) $HOME/.kube/config`

Along with a __`join`__ command for the cluster. __Copy this, save it__ to a safe place. You'll need it later.

If you lose this token, you can make a new one with:

`kubeadm token create --print-join-command`

#### 2. Establish Cluster Network - Using Weave
`kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"`

#### 3. View the networking services we just spun up
`kubectl get pods --all-namespaces`

### Steps on our Worker nodes

#### 1. Join our cluster
`sudo kubeadm join ....` - *This should be the command you copied/saved form the init command above.*

#### Back to the Manager Node
We can now check the status of our cluster:

`kubectl get nodes`

*Profit*

## Links:
- [Kubernetes Docs](https://kubernetes.io/docs/home/)
- [Weave networking](https://www.weave.works/docs/net/latest/kubernetes/kube-addon/)
- [Virt-manager](https://virt-manager.org/)
- [Ubuntu Server](https://ubuntu.com/download/server)