I love decentralized computing. It’s beautiful. Just add a node to your cluster if you need more power! Just that. Restart the pods with no downtime, horizontal pod autoscaler...
To create a cluster, we can do it with services provided by google, amazon… or just manually installing it in each node.
I prefer to create my own mini cluster. My cluster is made of 6 raspberry pi 4B (4GB RAM each) and has it's own name: clusperry ⚡️
I created a simple gui tool to generate the linux images to flash into the mini-SD cards with the initial cloudconfig. You can check it here: https://github.com/nullxx/clusperry-installer.
Nodes setup
Download the release from https://github.com/nullxx/clusperry-installer/releases/ (its currently only compiled for macOS)
1. Select the nodes operating system
2. Configure each node with your configuration:
- IP
- WIFI (or ethernet)
- hostname
- SSH keys
3. Download OS images
4. Write images
5. Open generated images
Install kubernetes with k3s
For this I will use ansible. It makes it easier to do all the install work.
I will use the following repo: https://github.com/k3s-io/k3s-ansible
Clone the repo
git clone https://github.com/k3s-io/k3s-ansible.git
Get into the cloned repo
cd k3s-ansible
Create our inventory from the sample
cp -R inventory/sample inventory/my-cluster
Edit inventory/my-cluster/hosts.ini
nano inventory/my-cluster/hosts.ini
[master]
192.168.1.100
[node]
192.168.1.101
192.168.1.102
192.168.1.103
192.168.1.104
192.168.1.105
[k3s_cluster:children]
master
node
Edit inventory/my-cluster/group_vars/all.yml
In my case edit the ansible_user
to ubuntu
---
k3s_version: v1.17.5+k3s1
ansible_user: ubuntu
systemd_dir: /etc/systemd/system
master_ip: "{{ hostvars[groups['master'][0]]['ansible_host'] | default(groups['master'][0]) }}"
extra_server_args: ""
extra_agent_args: ""
Be ready for the power!
Execute the ansible-playbook to install k8s in the nodes.
ansible-playbook site.yml -i inventory/my-cluster/hosts.ini
Install kubectl in your computer
In my case macOS
brew install kubectl
Get the kubectl config from any of your master nodes
scp ubuntu@192.168.1.100:~/.kube/config ~/.kube/config
Verify installation.
Check that all nodes are in STATUS 'Ready'
kubectl get nodes
Deploy test
Create a local DNS entry for the test
sudo echo "192.168.1.100 test.com" >> /etc/hosts
I'm going to use traefik because is installed by default with k3s.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # tells deployment to run 2 pods matching the template
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
name: nginx-service
spec:
ports:
- port: 80
name: http
selector:
name: nginx-deployment
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
- host: "test.com"
http:
paths:
- path: /
backend:
serviceName: nginx-service
servicePort: 80
Verify pods are up
kubectl get pods
Go to http://test.com
on your browser
curl http://test.com
Its working!
Cleanup
Remember to remove the test.com
line in /etc/hosts
Persistent storage
Part two available here
Top comments (0)
Some comments may only be visible to logged-in visitors. Sign in to view all comments.