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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MTQ3MjgsIm5iZiI6MTczODkxNDQyOCwicGF0aCI6Ii8xMDQyOTg2MDAvMzcwODYyODg1LWZmNjg5Y2ViLTU1NGEtNDM4Yi04M2U0LWVmZDBiMTllMDE3MC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwN1QwNzQ3MDhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1kMzhlMDk4ZmYzZDc0ZTJhZWZiOWJjOGEzN2Q1Zjg0ZWEyOTljZGU3YmQ2Y2IxNjg1MWFjMzJjZDZjZWRkNTAzJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.r2HFUxRegSHkP6E3ZEdKrWTCZrblLwCvdVwKgKESM1M)
![Screenshot-host-workers-file](https://private-user-images.githubusercontent.com/104298600/370862959-ec9b0598-9502-4ba2-ac52-9254e9093500.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MTQ3MjgsIm5iZiI6MTczODkxNDQyOCwicGF0aCI6Ii8xMDQyOTg2MDAvMzcwODYyOTU5LWVjOWIwNTk4LTk1MDItNGJhMi1hYzUyLTkyNTRlOTA5MzUwMC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwN1QwNzQ3MDhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT05NTM4Y2U0MTY3NjQwOGU4YjFmNDdmZWM2NGNmNjE1YTQ0NTA3YjExNTJiYThhYWQzYjNmNGEwMWMzODlhY2E1JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.owCJ_xyWzCR9WFS_M4kdFzIXuwRu_2D6A_IriMbMZTk)
![Screenshot-pod-network-cidr-file](https://private-user-images.githubusercontent.com/104298600/370863101-92aaab26-f9a1-43fe-830f-a56ed19eba0a.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MTQ3MjgsIm5iZiI6MTczODkxNDQyOCwicGF0aCI6Ii8xMDQyOTg2MDAvMzcwODYzMTAxLTkyYWFhYjI2LWY5YTEtNDNmZS04MzBmLWE1NmVkMTllYmEwYS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwN1QwNzQ3MDhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT02NjFiN2JjNjUxNWY0NTQzNDRhYzYwODIxOTM5NmU1MzdmMjI1NWE2Mjg2NTU4NTNhMmViMjlkOTE5ZDg2M2Q5JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.Ixp2-6jp6p4985X-gtyHTIJJ3mBsmxRTp28cYVK31oA)
- 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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MTQ3MjgsIm5iZiI6MTczODkxNDQyOCwicGF0aCI6Ii8xMDQyOTg2MDAvMzcwODYzMjI3LTQwY2Q1NDAwLTQ1N2ItNDQyOC04OWI0LThkNWQ0MzY5MGY2Yy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwN1QwNzQ3MDhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0zNzRhMTdiZDYxOWEyYzYxYjkxYzlhZGUzZDlkNGM4M2FhMDgzOWM2NDRlMDgzZmI4Y2MxYTExNzNkZWM1NGUyJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.UrmhtMGGtIigoXzM-2favx7oVVzq8Q8yOg4sH78xg4E)
./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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MTQ3MjgsIm5iZiI6MTczODkxNDQyOCwicGF0aCI6Ii8xMDQyOTg2MDAvNDAyMzQ2MzQxLTM2M2E4MTA3LTBhMDgtNGNkYS05OTZmLWNiNWU4ZmI5ZTdiZC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwN1QwNzQ3MDhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT00ODYzYzM2NzVlNTcyY2Y0MjVkNjJlYjM4ZWRjN2VjMGNhODhkOWU3NTExZWM3ZjRkNmVlZDRhOTNlMWE1MzdlJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.8zJTjcncujywXZRd4u3BFuMbwlT437ZVhEjIaqOYTHU)
./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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MTQ3MjgsIm5iZiI6MTczODkxNDQyOCwicGF0aCI6Ii8xMDQyOTg2MDAvMzcwODYzNzU5LTQwNzMyNDIwLWFjZDItNGEwOS05NGQ4LTEyOGFjNDQ2MzRjZS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwN1QwNzQ3MDhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT00OTRkODljNzdmN2E4ZmMzMTU4NWMzMWJlNDA3Y2ZhMzk2Y2E3YWQ5YjI1ZTQ0ZmE2MmZiMDEwZjcyOWFlODY0JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.-BVQRBJyjhNIOiyknbjESvKaFpXmRxY2pKPWxw0jRDk)
./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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MTQ3MjgsIm5iZiI6MTczODkxNDQyOCwicGF0aCI6Ii8xMDQyOTg2MDAvMzcwODYzOTgwLTU5NWQ1MGE5LTE5ZDgtNDc0Yy05N2JkLWU2ZWU3MmMwOTU4NC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwN1QwNzQ3MDhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT05ZmJiNzFkNTM2ZWVkNGI1ZTJjNWNjOWM5NWQxNGMzNGQ3MDViMjQ3NmRmYWE2NzZhMDU1OGMxZDVkODM3ODBhJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.nLMlYVZHC931aEd3qPrVZ-V64WLPowdViDJDlBxuASk)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MTQ3MjgsIm5iZiI6MTczODkxNDQyOCwicGF0aCI6Ii8xMDQyOTg2MDAvMzcwODY0NDIxLWM1OTk3MGYzLWMyOGQtNDFkMi1iOTA2LWNhODkxZGNlMGNlMS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwN1QwNzQ3MDhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1hZTQwZDIwZGYwOWMxODk2ODU0OGVhM2QyOWQ2YWYyNDdlZDYxMGEwNTgyOWViYTJmMjkzYWUyNjA0MjdhODIyJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.V8SJfvZIgWGfikNXBe_ZdjzGDupeLYjtJ-RTT0ZwJHQ)
./optional-install-metallb.yaml
Expected Outcome:
![Screenshot-metallb](https://private-user-images.githubusercontent.com/104298600/370864299-ca42347a-9b44-43af-9aa2-229713a11192.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MTQ3MjgsIm5iZiI6MTczODkxNDQyOCwicGF0aCI6Ii8xMDQyOTg2MDAvMzcwODY0Mjk5LWNhNDIzNDdhLTliNDQtNDNhZi05YWEyLTIyOTcxM2ExMTE5Mi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwN1QwNzQ3MDhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1kNmQ3NzE3YjM0NzU2MzYyYWZhYTA0N2M5OTI3MDkzYzIzMjFlY2UyNTU1MzE4YmE0NmE4NGYwN2UxOWI5Y2Y2JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.DDlcfh-CDjyvDuC508CA7K4iWzp0fXWC-zSAZXHo_QA)
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.