{"id":25403157,"url":"https://github.com/hendzormati/kubernetes-playbooks","last_synced_at":"2026-05-02T06:34:17.816Z","repository":{"id":277685588,"uuid":"933185310","full_name":"hendzormati/kubernetes-playbooks","owner":"hendzormati","description":"Automated Kubernetes Cluster Deployment using Ansible on Ubuntu 24.04 LTS. Supports both single-master and multi-master HA setups with HAProxy load balancing.","archived":false,"fork":false,"pushed_at":"2025-03-30T01:17:51.000Z","size":64,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-30T02:24:21.137Z","etag":null,"topics":["ansible","ansible-playbook","automation","high-availability","k8s","kubernetes","kubernetes-cluster","multi-master"],"latest_commit_sha":null,"homepage":"","language":"Jinja","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hendzormati.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-15T11:04:31.000Z","updated_at":"2025-03-30T01:17:54.000Z","dependencies_parsed_at":"2025-03-15T14:27:14.282Z","dependency_job_id":null,"html_url":"https://github.com/hendzormati/kubernetes-playbooks","commit_stats":null,"previous_names":["hendzormati/kubernetes-playbook"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hendzormati%2Fkubernetes-playbooks","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hendzormati%2Fkubernetes-playbooks/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hendzormati%2Fkubernetes-playbooks/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hendzormati%2Fkubernetes-playbooks/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hendzormati","download_url":"https://codeload.github.com/hendzormati/kubernetes-playbooks/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248574898,"owners_count":21127085,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ansible","ansible-playbook","automation","high-availability","k8s","kubernetes","kubernetes-cluster","multi-master"],"created_at":"2025-02-16T02:28:07.672Z","updated_at":"2026-05-02T06:34:17.810Z","avatar_url":"https://github.com/hendzormati.png","language":"Jinja","funding_links":[],"categories":[],"sub_categories":[],"readme":"# kubernetes-playbooks\n\nAnsible playbooks that automate Kubernetes deployment on Ubuntu 24.04 LTS.\n## Repository Traffic Overview\n\nHere's the traffic overview for this repository:\n\n- 👁️ **Total Views** Since Creation: **398** views\n- 🔄 **Total Clones** Since Creation: **154** clones\n- 📈 **Recent Views** (Last 14 days): **4** views\n- 📊 **Recent Clones** (Last 14 days): **54** clones\n\n---\n\nLast traffic data update: **Sun Apr 26 2026 03:28:42 CET**\n\n---\n## 📂 Playbook Structure\n\n- **Single-Master Deployment** (Basic setup)\n  - Playbooks are in the root directory.\n  - Deploys a single control-plane node.\n- **Multi-Master Deployment (HA)** (Advanced setup)\n  - Playbooks are inside `playbooks/multi-master/`\n  - Uses HAProxy and multiple control-plane nodes.\n\n---\n\n## **🔹 Prerequisites**\n- Ansible and Python3 installed on the local machine\n- SSH access to your Ubuntu 24.04 nodes\n- The nodes should be provisioned (OpenStack, other cloud providers, or on-premise)\n- Unique **hostnames** for each node (`master-1`, `master-2`, etc.)\n\n---\n\n## **🔹 Single-Master Deployment**  \n\n### **📝 Inventory Setup**\nThe `hosts.ini` file defines the master and worker nodes:\n\n```ini\n[master]\nmaster1 ansible_host=192.168.1.159\n\n[workers]\nworker1 ansible_host=192.168.1.203\nworker2 ansible_host=192.168.1.171\n\n[all:vars]\nansible_python_interpreter=/usr/bin/python3\nansible_ssh_private_key_file=/path/to/your/key.pem\nansible_user=ubuntu\n```\n\n### **🚀 Deploy the Cluster**\n1. Install dependencies:\n   ```bash\n   ansible-playbook -i hosts.ini dependencies.yaml\n   ```\n2. Initialize master node:\n   ```bash\n   ansible-playbook -i hosts.ini master.yaml\n   ```\n3. Join worker nodes:\n   ```bash\n   ansible-playbook -i hosts.ini worker.yaml\n   ```\n4. Verify cluster:\n   ```bash\n   ssh -i /path/to/your/key.pem ubuntu@\u003cmaster_ip\u003e\n   kubectl get nodes\n   ```\n\n---\n\n## **🔹 Multi-Master HA Deployment**  \n\n📁 **Playbooks are under `playbooks/multi-master/`**  \n\n### **📝 Inventory Setup for Multi-Master**\nThe `multi-hosts.ini` file defines the **multi-master** and **HAProxy** setup:\n\n```ini\n[master]\nmaster1 ansible_host=192.168.1.203\nmaster2 ansible_host=192.168.1.249\nmaster3 ansible_host=192.168.1.198\n[workers]\nworker1 ansible_host=192.168.1.153\nworker2 ansible_host=192.168.1.239\n[haproxy]\nserver ansible_host=192.168.1.212\n[all:vars]\nansible_python_interpreter=/usr/bin/python3\nansible_ssh_extra_args='-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null'\nansible_ssh_private_key_file=/path/to/your/key.pem\nansible_user=ubuntu\n```\n\n## Deploying the Cluster\n\n1. Install Kubernetes dependencies on all nodes:\n```bash\nansible-playbook -i hosts.ini dependencies.yml\n```\nThis playbook:\n- Disables swap\n- Loads necessary kernel modules\n- Configures system parameters\n- Installs containerd runtime\n- Installs Kubernetes components (kubelet, kubeadm)\n\n2. Initialize the master node:\n```bash\nansible-playbook -i hosts.ini master.yml\n```\nThis playbook:\n- Initializes the Kubernetes control plane\n- Sets up pod networking (Flannel)\n- Configures kubeconfig\n\n3. Join worker nodes:\n```bash\nansible-playbook -i hosts.ini worker.yml\n```\nThis playbook:\n- Retrieves the join command from the master\n- Joins worker nodes to the cluster\n\n## Verify the Cluster\n\nSSH into the master node and check the cluster status:\n\n```bash\nssh -i /path/to/your/key.pem ubuntu@\u003cmaster_ip\u003e\nkubectl get nodes\n# Expected output:\nNAME                STATUS   ROLES           AGE   VERSION\nmaster-controller   Ready    control-plane   10d   v1.30.9\nworker-controller   Ready    \u003cnone\u003e          10d   v1.30.9\n```\n\nAll nodes should show \"Ready\" status.\n\n## Testing External Access with Nginx\n\nTo test external access to your cluster, deploy a sample Nginx application:\n\n1. Create a file named `nginx-test.yaml`:\n```yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: nginx-deployment\nspec:\n  selector:\n    matchLabels:\n      app: nginx\n  replicas: 2\n  template:\n    metadata:\n      labels:\n        app: nginx\n    spec:\n      containers:\n      - name: nginx\n        image: nginx:latest\n        ports:\n        - containerPort: 80\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: nginx-service\nspec:\n  type: NodePort\n  selector:\n    app: nginx\n  ports:\n  - port: 80\n    targetPort: 80\n    nodePort: 30080\n  externalIPs: []\n```\n\n2. Apply the configuration:\n```bash\nkubectl apply -f nginx-test.yaml\n# Expected output:\ndeployment.apps/nginx-deployment created\nservice/nginx-service created\n```\n\n3. Verify the deployment:\n```bash\nkubectl get deployments\n# Expected output:\nNAME               READY   UP-TO-DATE   AVAILABLE   AGE\nnginx-deployment   2/2     2            2           6s\n\nkubectl get pods\n# Expected output:\nNAME                               READY   STATUS    RESTARTS   AGE\nnginx-deployment-576c6b7b6-88c2r   1/1     Running   0          11s\nnginx-deployment-576c6b7b6-jwndk   1/1     Running   0          11s\n\nkubectl get services\n# Expected output:\nNAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE\nkubernetes      ClusterIP   10.96.0.1        \u003cnone\u003e        443/TCP        43s\nnginx-service   NodePort    10.111.243.240   \u003cnone\u003e        80:30080/TCP   14s\n```\n\n4. Access Nginx:\n- Through NodePort: `http://\u003cany-node-ip\u003e:30080`\n- You should see the default Nginx welcome page\n\nTo verify everything is working:\n```bash\n# Check pods are running\nkubectl get pods -o wide\n\n# Check service details\nkubectl describe service nginx-service\n\n# Check logs of a pod (replace \u003cpod-name\u003e with actual pod name)\nkubectl logs \u003cpod-name\u003e\n```\n\n---\n\n## **🛠 Troubleshooting**\n- **Multi-master not joining?**\n  - Check etcd members:  \n    ```bash\n    ETCDCTL_API=3 etcdctl member list --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key\n    ```\n  - Remove unstarted members:\n    ```bash\n    ETCDCTL_API=3 etcdctl member remove \u003cMEMBER_ID\u003e\n    ```\n- **HAProxy not balancing?**\n  - Check logs:  \n    ```bash\n    sudo journalctl -u haproxy --no-pager\n    ```\n  - Ensure all masters are **reachable** via port `6443`.\n\n---\n\n## **📜 Credits**\n- Based on [kubernetes-playbooks](https://github.com/torgeirl/kubernetes-playbooks) by torgeirl, adapted for Ubuntu 24.04 LTS\n---\n\n## **📜 License**\nSee the LICENSE file for license rights and limitations (MIT).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhendzormati%2Fkubernetes-playbooks","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhendzormati%2Fkubernetes-playbooks","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhendzormati%2Fkubernetes-playbooks/lists"}