Ansible playbook for kubeadm-based Kubernetes cluster installation on Linux
This Ansible playbook automates the installation and configuration of a Kubernetes cluster on Linux, with a single control plane node and multiple worker nodes, using the most recent stable Kubernetes release.
We understand that there’s Kubespray, which is much more powerful and allows for a lot of customizations, but this playbook is lightweight and simple. It might be a good option for those looking to set up a quick and easy development and testing environment of Kubernetes on Linux.
Suitable Environment: Development & Testing
System Requirements: Minimum 2 GB RAM & 2 vCPU
Supported Platforms: Baremetal, Virtual Machines, Cloud Instances
- RedHat-based ( Fedora, RHEL, Rocky Linux, Almalinux, Oracle Linux )
- Debian-based ( Debian, Ubuntu )
- SUSE-based ( OpenSUSE, SLES )
- Please install Ansible on the machine where you plan to run the playbook if you haven’t done so already.
- Prepare the cluster nodes by installing any of the above mentioned supported Linux distributions, even with a minimal installation.
- Please ensure that you have DNS set up that resolves all the involved hosts, or update the host files on all hosts with the necessary entries for each involved host.
- Create a common Linux user on all cluster nodes, which will be used for the cluster installation.
- Enable passwordless SSH authentication from the Ansible host to all cluster nodes using the common user created earlier.
- Ensure the common user has passwordless sudo privileges on all cluster nodes.
The main playbook installs and configures the latest stable versions of the following required components.
- Container orchestrator: kubernetes
- Container runtime: containerd
- Low-level container runtime: runc ( dependency for containerd )
- CNI plugin: calico
- csi-driver-nfs
- csi-driver-smb
- MetalLB LoadBalancer
Step 1) Copy and execute the below command snippet to extract the tarball for the most recent stable release of this Ansible project.
curl -sSL https://github.com/Muthukumar-Subramaniam/install-k8s-on-linux/releases/latest/download/inst-k8s-ansible.tar.gz | tar -xzvf - && cd inst-k8s-ansible
![Screenshot-host-control-plane-file](https://private-user-images.githubusercontent.com/104298600/370862885-ff689ceb-554a-438b-83e4-efd0b19e0170.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5OTU5NjAsIm5iZiI6MTczODk5NTY2MCwicGF0aCI6Ii8xMDQyOTg2MDAvMzcwODYyODg1LWZmNjg5Y2ViLTU1NGEtNDM4Yi04M2U0LWVmZDBiMTllMDE3MC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwOFQwNjIxMDBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1lODY3ZGI1YzA3MzhjN2I3NmNlZTExNTc3ZjNlN2NhMmZlZDJmNTBmOTA1MWFhYTY4MWEzMGM1OGU0NmJjNzUxJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.LcLfn3j-yR0KtFhSLdkBWwZQtDIxHyLgjReAdpApSrk)
![Screenshot-host-workers-file](https://private-user-images.githubusercontent.com/104298600/370862959-ec9b0598-9502-4ba2-ac52-9254e9093500.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5OTU5NjAsIm5iZiI6MTczODk5NTY2MCwicGF0aCI6Ii8xMDQyOTg2MDAvMzcwODYyOTU5LWVjOWIwNTk4LTk1MDItNGJhMi1hYzUyLTkyNTRlOTA5MzUwMC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwOFQwNjIxMDBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1kODI1Zjk4NzU4MWJhMzhhYTZlNzRkYzk4MmE4ZjBlNWUyNzA5ZDBmNTBiZDU3ZThlNzc4NjMwYjllZTQ4NmMwJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.uZls1AKLbqESPNOMVp5QFAgkSU0o6pm2H8xS3o3Jv8w)
![Screenshot-pod-network-cidr-file](https://private-user-images.githubusercontent.com/104298600/370863101-92aaab26-f9a1-43fe-830f-a56ed19eba0a.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5OTU5NjAsIm5iZiI6MTczODk5NTY2MCwicGF0aCI6Ii8xMDQyOTg2MDAvMzcwODYzMTAxLTkyYWFhYjI2LWY5YTEtNDNmZS04MzBmLWE1NmVkMTllYmEwYS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwOFQwNjIxMDBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0wY2I0ZmVjZWE2YWVkM2RhZTQ3ZjMyYzdiYWQ2ODNkOTdmMmQ4NTBhNDVlZDI5NjYwYTVjMzMwMGRlYmNkMzIxJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.jzVX3AGcDcXxt2USJcGRgj6KznXjwEnjSxwqmxt75iA)
- Only private IP addresses, as defined in RFC 1918 are allowed.
- The deployment is configured to accept CIDR prefixes exclusively within the /16 to /28 range.
- Ensure that the selected CIDR prefix does not conflict with any existing networks in your infrastructure.
- Choose a CIDR prefix that provides sufficient address space for your cluster.
./setup.py
![Screenshot-setup-script-run](https://private-user-images.githubusercontent.com/104298600/370863227-40cd5400-457b-4428-89b4-8d5d43690f6c.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5OTU5NjAsIm5iZiI6MTczODk5NTY2MCwicGF0aCI6Ii8xMDQyOTg2MDAvMzcwODYzMjI3LTQwY2Q1NDAwLTQ1N2ItNDQyOC04OWI0LThkNWQ0MzY5MGY2Yy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwOFQwNjIxMDBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1jMjk2YmU5MjdmMTliZWI1ODc3ZWMwNDIyNmVkOTRiZDM5OWFkZTVlYjdmYmFiMTAxYTE2NDA0NzQzZDZkOTJiJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.nXjsTvMlxaI8QFCSh3gJvc5Gvz9EMQNYoiJFcmujvJM)
./inst-k8s-ansible.yaml
Expected Outcome:
![Screenshot-end-output-of-playbook-run](https://private-user-images.githubusercontent.com/104298600/402346341-363a8107-0a08-4cda-996f-cb5e8fb9e7bd.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5OTU5NjAsIm5iZiI6MTczODk5NTY2MCwicGF0aCI6Ii8xMDQyOTg2MDAvNDAyMzQ2MzQxLTM2M2E4MTA3LTBhMDgtNGNkYS05OTZmLWNiNWU4ZmI5ZTdiZC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwOFQwNjIxMDBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT05YjEyZjE0YjRmZjc5M2JhZjlkMzcxNTRmZTg1N2Q2ZTJkM2RmNTM1OTJhNjNmZjBiMjU1YTJhYzgxOTk1NmVmJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.uijncQcXPLmiGn8n4wBR7MwlQoWLqKdEk5b8TDMOgsk)
./optional-k8s-csi-nfs-driver.yaml
Expected Outcome:
![Screenshot-csi-driver-nfs](https://private-user-images.githubusercontent.com/104298600/370863759-40732420-acd2-4a09-94d8-128ac44634ce.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5OTU5NjAsIm5iZiI6MTczODk5NTY2MCwicGF0aCI6Ii8xMDQyOTg2MDAvMzcwODYzNzU5LTQwNzMyNDIwLWFjZDItNGEwOS05NGQ4LTEyOGFjNDQ2MzRjZS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwOFQwNjIxMDBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1iMTJlNjg1MmIzNWJkMTI5OTJlNDAxOWNhMjM2MTc3MjJlZjY1ZjExOWJhODkwNjFkMDUzNTA5MGUzMGU2ZTEzJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.wIF5V3JmjSXZfEZiJftn4sKalIS-DoDFjH-0OoW1KyA)
./optional-k8s-csi-smb-driver.yaml
Expected Outcome:
![Screenshot-csi-driver-smb](https://private-user-images.githubusercontent.com/104298600/370863980-595d50a9-19d8-474c-97bd-e6ee72c09584.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5OTU5NjAsIm5iZiI6MTczODk5NTY2MCwicGF0aCI6Ii8xMDQyOTg2MDAvMzcwODYzOTgwLTU5NWQ1MGE5LTE5ZDgtNDc0Yy05N2JkLWU2ZWU3MmMwOTU4NC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwOFQwNjIxMDBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT05OWQwMzUwNzIzZTg0YWYwYmZmOWQ4YTEyNjlkNDcwOTRmNTAwMDdiMzQ2YTFkZjVkZjBlYWZhNmVmMzIxOTMxJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.vR8KFsC3RQEk9D4GL51FpyKoaysh9a6_mMLhg7vpBYs)
Note: Please make sure to change the address pool range in the playbook as per your environment and requirement.
![Screenshot-metallb-ip-pool](https://private-user-images.githubusercontent.com/104298600/370864421-c59970f3-c28d-41d2-b906-ca891dce0ce1.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5OTU5NjAsIm5iZiI6MTczODk5NTY2MCwicGF0aCI6Ii8xMDQyOTg2MDAvMzcwODY0NDIxLWM1OTk3MGYzLWMyOGQtNDFkMi1iOTA2LWNhODkxZGNlMGNlMS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwOFQwNjIxMDBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1kMjk0NTE0MGM3NzI1Y2UxYTY5NTQ0NjRhNmE3ZjIwOTZlOTdjYTFmMjczZThmYjRlYTE5ZWRmMWVkODQxNWM1JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.3f_wWtuO7h7odJwZP84oNEBS_Z3nY__S3oUfOx-DF1Y)
./optional-install-metallb.yaml
Expected Outcome:
![Screenshot-metallb](https://private-user-images.githubusercontent.com/104298600/370864299-ca42347a-9b44-43af-9aa2-229713a11192.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5OTU5NjAsIm5iZiI6MTczODk5NTY2MCwicGF0aCI6Ii8xMDQyOTg2MDAvMzcwODY0Mjk5LWNhNDIzNDdhLTliNDQtNDNhZi05YWEyLTIyOTcxM2ExMTE5Mi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwOFQwNjIxMDBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1iZGM5YjQyNWEyMDhkZGE3YzNiM2Y3MjFkZmViYmYzNTExYzc3ZjlhZjFmYmIwYWI2ODk2YWZjNmQzYTg4N2Q1JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.MYbQSjw1IsZIQ3sqHPG-7GH9sxXfb0y4lUquR2HkKuQ)
That's all for now! Your trust and engagement means a lot, and we hope you find the playbook useful.
- This playbook is a useful resource for experimenting with Kubernetes and can be customized to meet your specific requirements.
- The playbook utilizes the GitHub API to fetch the current stable versions of all required software components.
- Compatible with a wide range of Linux distributions.
- Your feedback and contributions are invaluable to the success of this project.
- Please report any bugs, suggest new features, or contribute directly to the codebase.