{"id":41363556,"url":"https://github.com/platform9/nodelet","last_synced_at":"2026-01-23T08:10:38.889Z","repository":{"id":37792155,"uuid":"439128467","full_name":"platform9/nodelet","owner":"platform9","description":null,"archived":false,"fork":false,"pushed_at":"2024-11-27T06:02:17.000Z","size":80135,"stargazers_count":3,"open_issues_count":21,"forks_count":3,"subscribers_count":20,"default_branch":"main","last_synced_at":"2024-11-27T06:27:38.739Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/platform9.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":"support/download-nodejs-carbon-latest.sh","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-12-16T21:13:27.000Z","updated_at":"2022-11-11T07:17:08.000Z","dependencies_parsed_at":"2024-06-19T11:27:48.127Z","dependency_job_id":"cc7687ab-b791-4593-b62a-c4f09a9dc604","html_url":"https://github.com/platform9/nodelet","commit_stats":null,"previous_names":[],"tags_count":30,"template":false,"template_full_name":null,"purl":"pkg:github/platform9/nodelet","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/platform9%2Fnodelet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/platform9%2Fnodelet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/platform9%2Fnodelet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/platform9%2Fnodelet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/platform9","download_url":"https://codeload.github.com/platform9/nodelet/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/platform9%2Fnodelet/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28684016,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-23T05:48:07.525Z","status":"ssl_error","status_checked_at":"2026-01-23T05:48:07.129Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":[],"created_at":"2026-01-23T08:10:34.553Z","updated_at":"2026-01-23T08:10:38.878Z","avatar_url":"https://github.com/platform9.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# NODELET\n\n07/01/2023\n\n** This project is no longer maintained. **\n\nAll future changes must go to [pf9-kube](https://github.com/platform9/pf9-kube/)\n\n---\n\n[![Makefile CI](https://github.com/platform9/nodelet/actions/workflows/unit-test.yml/badge.svg)](https://github.com/platform9/nodelet/actions/workflows/unit-test.yml)\n[![rpm-deb-build](https://github.com/platform9/nodelet/actions/workflows/rpm-deb-build.yml/badge.svg)](https://github.com/platform9/nodelet/actions/workflows/rpm-deb-build.yml)\n[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Froopakparikh%2Fnodelet.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Froopakparikh%2Fnodelet?ref=badge_shield)\n\nNodelet is a Kubernetes lifecycle manager which can be used stand-alone or as part of a larger system (e.g. Cluster API). Nodelet is capable of performing the following tasks:\n- Installing a Kubernetes stack on one or more nodes\n- Configuring the cluster\n- Configuring a set of core add-ons\n- Upgrades\n\nNodelet has a fine-grain orchestration system wherein individual steps needed to configure the stack are logically separated and report independent status, making it easier to assess the health of the system and pinpoint failures.\n\nCurrently nodelet supports k8s 1.21 only. Support for other k8s versions is in progress.\n\n## Compiling and creating OS packages\n\n1. Install the build pre-reqs\n   ```\n   sudo apt-get update\n   sudo apt-get install ruby-dev rpm build-essential docker.io -y\n   sudo gem i fpm -f\n   curl -O https://dl.google.com/go/go1.17.1.linux-amd64.tar.gz\n   sudo tar -C /usr/local -xzf go1.17.1.linux-amd64.tar.gz\n   mkdir -p ~/go; echo \"export GOPATH=$HOME/go\" \u003e\u003e ~/.bashrc\n   echo \"export PATH=$PATH:$HOME/go/bin:/usr/local/go/bin\" \u003e\u003e ~/.bashrc\n   source ~/.bashrc\n   ```\n2. Compile and create rpm/deb packages\n   ```\n   make agent-deb # to create a deb package\n   make agent-rpm # to create a rpm package\n   ```\n## Installation steps\nThe easiest way to create the cluster is using nodeletctl, see the following for more details:\n\nhttps://github.com/platform9/nodelet/tree/main/nodeletctl\n\n## Cluster in a container\nThe following describes how you can run a cluster within a docker container\nhttps://github.com/platform9/nodelet/tree/main/test\n\n## Installation - Long way (use nodeletctl, this section is here for historical purposes)\n\nThis section contains instructions on creating a single master cluster using nodelet. Instructions for multi-master clusters will be added shortly.\n1. Create the config directories -\n   ```\n   mkdir -p /etc/pf9/nodelet /etc/pf9/kube.d\n   ```\n\n2. Generate CA certificates that will be used for signing all the certificates for various k8s components. This step is optional when creating a single node cluster.\nWe are actively working on documenting a more streamlined way of generating and sharing certificates using Hashicorp Vault.\n\n   a. Create a OpenSSL conf package\n      ```\n      [ req ]\n      default_md = sha256\n      prompt = no\n      req_extensions = req_ext\n      distinguished_name = req_distinguished_name\n      [ req_distinguished_name ]\n      commonName = kubernetes\n      [ req_ext ]\n      keyUsage=critical,digitalSignature,keyEncipherment\n      extendedKeyUsage=critical,serverAuth,clientAuth\n      subjectAltName = @alt_names\n      [ alt_names ]\n      IP.0 = \u003cNODE IP ADDRESS\u003e\n      IP.1 = 127.0.0.1\n      DNS.1 = localhost\n      ```\n   b. Generate CA using OpenSSL\n      ```\n      openssl req -x509 -sha256 -days 3650 -newkey rsa:2048 -keyout /etc/pf9/kube.d/rootCA.key -out /etc/pf9/kube.d/rootCA.crt -config \u003cOpenSSL conf file\u003e -nodes\n      ```\n   c. Copy `/etc/pf9/kube.d/rootCA.key` and `/etc/pf9/kube.d/rootCA.crt` to all the nodes. The location of these files must be same on all hosts i.e. `/etc/pf9/kube.d/rootCA.*`\n\n3. Create the necessary config files. Replace the IP address of the node. Also add path for \"tar/zip files of images\" under USER_IMAGES_DIR  (optional). Create /etc/pf9/nodelet/config_sunpike.yaml on master node with following contents -\n   ```\n   # Contents of /etc/pf9/nodelet/config_sunpike.yaml\n   ALLOW_WORKLOADS_ON_MASTER: \"true\" # whether to allow workloads on master. Valid values are - \"true\" \u0026 \"false\"\n   API_SERVER_FLAGS: \"\" # comma separated list of arguments to be provided to apiserver\n   APISERVER_STORAGE_BACKEND: etcd3 \n   CALICO_IPIP_MODE: Always \n   CALICO_IPV4: autodetect\n   CALICO_IPV4_BLOCK_SIZE: \"26\"\n   CALICO_IPV4_DETECTION_METHOD: first-found\n   CALICO_IPV6: none\n   CALICO_IPV6_DETECTION_METHOD: first-found\n   CALICO_IPV6POOL_BLOCK_SIZE: \"116\"\n   CALICO_IPV6POOL_CIDR: \"\"\n   CALICO_IPV6POOL_NAT_OUTGOING: \"false\"\n   CALICO_NAT_OUTGOING: \"true\"\n   CALICO_ROUTER_ID: hash\n   CLOUD_PROVIDER_TYPE: local\n   CLUSTER_ID: cbe813ef-8a68-4af5-bc7d-7242e3ec4c5d # unique ID for each cluster. Must be modified when reusing a node from another cluster managed by nodelet.\n   CNI_BRIDGE: cni0\n   CONTAINERS_CIDR: 10.20.0.0/22 # container subnet\n   CONTROLLER_MANAGER_FLAGS: \"\" # comma separated list of arguments to be provided to controller manager\n   CPU_MANAGER_POLICY: none\n   DEBUG: \"true\"\n   DOCKER_CENTOS_REPO_URL: \"\" # URL to yum repo for downloading docker. Yum repo configured on the host will be used when left empty.\n   DOCKER_LIVE_RESTORE_ENABLED: \"true\"\n   DOCKER_PRIVATE_REGISTRY: \"\"\n   DOCKER_ROOT: /var/lib\n   DOCKER_UBUNTU_REPO_URL: \"\" # URL to apt repo for downloading docker. Apt repo configured on the host will be used when left empty.\n   DOCKERHUB_ID: \"\" \n   DOCKERHUB_PASSWORD: \"\"\n   ETCD_DATA_DIR: /var/opt/pf9/kube/etcd/data # location where etcd will store data\n   ETCD_DISCOVERY_URL: \"\"\n   ETCD_ELECTION_TIMEOUT: \"1000\"\n   ETCD_ENV: |-\n     ETCD_NAME=be0324eb-f74b-4eeb-8437-19ad9a3307f4\n     ETCD_STRICT_RECONFIG_CHECK=true\n     ETCD_INITIAL_CLUSTER_TOKEN=cbe813ef-8a68-4af5-bc7d-7242e3ec4c5d\n     ETCD_INITIAL_CLUSTER_STATE=new\n     ETCD_INITIAL_CLUSTER=be0324eb-f74b-4eeb-8437-19ad9a3307f4=https://\u003cNODE IP ADDRESS\u003e:2380\n     ETCD_INITIAL_ADVERTISE_PEER_URLS=https://\u003cNODE IP ADDRESS\u003e:2380\n     ETCD_LISTEN_PEER_URLS=https://\u003cNODE IP ADDRESS\u003e:2380\n     ETCD_ADVERTISE_CLIENT_URLS=https://\u003cNODE IP ADDRESS\u003e:4001\n     ETCD_LISTEN_CLIENT_URLS=https://0.0.0.0:4001,http://127.0.0.1:2379\n     ETCD_DATA_DIR=/var/etcd/data\n     ETCD_CERT_FILE=/certs/etcd/client/request.crt\n     ETCD_KEY_FILE=/certs/etcd/client/request.key\n     ETCD_TRUSTED_CA_FILE=/certs/etcd/client/ca.crt\n     ETCD_PEER_KEY_FILE=/certs/etcd/peer/request.key\n     ETCD_PEER_CERT_FILE=/certs/etcd/peer/request.crt\n     ETCD_PEER_TRUSTED_CA_FILE=/certs/etcd/peer/ca.crt\n     ETCD_CLIENT_CERT_AUTH=true\n     ETCD_DEBUG=false\n     ETCD_CIPHER_SUITES=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256\n   ETCD_HEARTBEAT_INTERVAL: \"100\"\n   EXTERNAL_DNS_NAME: \u003cNODE IP ADDRESS\u003e \n   FELIX_IPV6SUPPORT: \"false\"\n   FLANNEL_IFACE_LABEL: \"\"\n   FLANNEL_PUBLIC_IFACE_LABEL: \"\"\n   GCR_PRIVATE_REGISTRY: \"\"\n   HOSTID: be0324eb-f74b-4eeb-8437-19ad9a3307f4 # Unique ID for each node\n   IPV6_ENABLED: \"false\"\n   K8S_API_PORT: \"443\"\n   K8S_PRIVATE_REGISTRY: \"\"\n   KEYSTONE_DOMAIN: kubernetes-keystone.platform9.horse\n   KUBE_PROXY_MODE: ipvs\n   KUBE_SERVICE_STATE: \"true\"\n   KUBELET_CLOUD_CONFIG: \"\"\n   MASTER_IP: \u003cNODE IP ADDRESS\u003e\n   MTU_SIZE: \"1440\"\n   PF9_NETWORK_PLUGIN: calico\n   PRIVILEGED: \"true\"\n   QUAY_PRIVATE_REGISTRY: \"\"\n   REGISTRY_MIRRORS: \"\" # comma separated list of docker registry mirrors\n   RESERVED_CPUS: \"\"\n   ROLE: master\n   RUNTIME: containerd # container runtime. Valid values are \"docker\" and \"containerd\"\n   RUNTIME_CONFIG: \"\"\n   SCHEDULER_FLAGS: \"\"\n   SERVICES_CIDR: 10.21.0.0/22\n   TOPOLOGY_MANAGER_POLICY: none\n   USE_HOSTNAME: \"false\"\n   STANDALONE: \"true\"\n   USER_IMAGES_DIR: \"\"\n   ```\n\n4. Create /etc/pf9/nodelet/config_sunpike.yaml on all worker nodes with following contents -\n   ```\n   # Contents of /etc/pf9/nodelet/config_sunpike.yaml\n   CALICO_IPIP_MODE: Always \n   CALICO_IPV4: autodetect\n   CALICO_IPV4_BLOCK_SIZE: \"26\"\n   CALICO_IPV4_DETECTION_METHOD: first-found\n   CALICO_IPV6: none\n   CALICO_IPV6_DETECTION_METHOD: first-found\n   CALICO_IPV6POOL_BLOCK_SIZE: \"116\"\n   CALICO_IPV6POOL_CIDR: \"\"\n   CALICO_IPV6POOL_NAT_OUTGOING: \"false\"\n   CALICO_NAT_OUTGOING: \"true\"\n   CALICO_ROUTER_ID: hash\n   CLOUD_PROVIDER_TYPE: local\n   CLUSTER_ID: cbe813ef-8a68-4af5-bc7d-7242e3ec4c5d # unique ID for each cluster. Must be modified when reusing a node from another cluster managed by nodelet.\n   CNI_BRIDGE: cni0\n   CONTAINERS_CIDR: 10.20.0.0/22 # container subnet\n   CONTROLLER_MANAGER_FLAGS: \"\" # comma separated list of arguments to be provided to controller manager\n   CPU_MANAGER_POLICY: none\n   DEBUG: \"true\"\n   DOCKER_CENTOS_REPO_URL: \"\" # URL to yum repo for downloading docker. Yum repo configured on the host will be used when left empty.\n   DOCKER_LIVE_RESTORE_ENABLED: \"true\"\n   DOCKER_PRIVATE_REGISTRY: \"\"\n   DOCKER_ROOT: /var/lib\n   DOCKER_UBUNTU_REPO_URL: \"\" # URL to apt repo for downloading docker. Apt repo configured on the host will be used when left empty.\n   DOCKERHUB_ID: \"\" \n   DOCKERHUB_PASSWORD: \"\"\n   EXTERNAL_DNS_NAME: \u003cMASTER NODE IP ADDRESS\u003e \n   FELIX_IPV6SUPPORT: \"false\"\n   FLANNEL_IFACE_LABEL: \"\"\n   FLANNEL_PUBLIC_IFACE_LABEL: \"\"\n   GCR_PRIVATE_REGISTRY: \"\"\n   HOSTID: be0324eb-f74b-4eeb-8437-19ad9a3307f4 # Unique ID for each node\n   IPV6_ENABLED: \"false\"\n   K8S_API_PORT: \"443\"\n   K8S_PRIVATE_REGISTRY: \"\"\n   KEYSTONE_DOMAIN: kubernetes-keystone.platform9.horse\n   KUBE_PROXY_MODE: ipvs\n   KUBE_SERVICE_STATE: \"true\"\n   KUBELET_CLOUD_CONFIG: \"\"\n   MASTER_IP: \u003cMASTER NODE IP ADDRESS\u003e\n   MTU_SIZE: \"1440\"\n   PF9_NETWORK_PLUGIN: calico\n   PRIVILEGED: \"true\"\n   QUAY_PRIVATE_REGISTRY: \"\"\n   REGISTRY_MIRRORS: \"\" # comma separated list of docker registry mirrors\n   RESERVED_CPUS: \"\"\n   ROLE: worker\n   RUNTIME: containerd # container runtime. Valid values are \"docker\" and \"containerd\"\n   RUNTIME_CONFIG: \"\"\n   SCHEDULER_FLAGS: \"\"\n   SERVICES_CIDR: 10.21.0.0/22\n   TOPOLOGY_MANAGER_POLICY: none\n   USE_HOSTNAME: \"false\"\n   STANDALONE: \"true\"\n   USER_IMAGES_DIR: \"\"\n   ```\n   Replace the master node IP address in this config file. \n   Also add path for \"tar/zip files of images\" under USER_IMAGES_DIR (optional).\n\n5. Install the rpm or deb according to your OS on all the hosts. Currently nodelet only supports CentOS 7.8, CentOS 7.9, Ubuntu 18 and Ubuntu 20. Support for other OS and creating a OS independent nodelet binary is in-progress.\n   ```\n   yum install \u003cRPM\u003e\n   OR\n   apt install \u003cDEB\u003e\n   ```\n\n6. Start the nodelet service on all the hosts\n   ```\n   systemctl daemon-reload\n   systemctl start pf9-nodeletd\n   ```\n   \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fplatform9%2Fnodelet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fplatform9%2Fnodelet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fplatform9%2Fnodelet/lists"}