{"id":37087624,"url":"https://github.com/swisstxt/cloudstack-cloud-controller-manager","last_synced_at":"2026-01-14T10:47:04.596Z","repository":{"id":57592335,"uuid":"158395735","full_name":"swisstxt/cloudstack-cloud-controller-manager","owner":"swisstxt","description":"This project is no longer maintained. Please migrate to https://github.com/apache/cloudstack-kubernetes-provider","archived":true,"fork":false,"pushed_at":"2019-09-20T09:43:53.000Z","size":53427,"stargazers_count":9,"open_issues_count":0,"forks_count":2,"subscribers_count":6,"default_branch":"master","last_synced_at":"2024-06-20T05:16:18.400Z","etag":null,"topics":["cargo","ccm","cloudstack","golang","kubernetes"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/swisstxt.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE-2.0","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-11-20T13:42:05.000Z","updated_at":"2023-01-28T17:09:56.000Z","dependencies_parsed_at":"2022-09-13T08:40:57.095Z","dependency_job_id":null,"html_url":"https://github.com/swisstxt/cloudstack-cloud-controller-manager","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/swisstxt/cloudstack-cloud-controller-manager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swisstxt%2Fcloudstack-cloud-controller-manager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swisstxt%2Fcloudstack-cloud-controller-manager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swisstxt%2Fcloudstack-cloud-controller-manager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swisstxt%2Fcloudstack-cloud-controller-manager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/swisstxt","download_url":"https://codeload.github.com/swisstxt/cloudstack-cloud-controller-manager/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swisstxt%2Fcloudstack-cloud-controller-manager/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28417716,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T10:25:19.714Z","status":"ssl_error","status_checked_at":"2026-01-14T10:22:49.371Z","response_time":107,"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":["cargo","ccm","cloudstack","golang","kubernetes"],"created_at":"2026-01-14T10:47:03.968Z","updated_at":"2026-01-14T10:47:04.589Z","avatar_url":"https://github.com/swisstxt.png","language":"Go","readme":"# CloudStack Kubernetes Provider\n\n| :warning: :construction: :gift: Ownership of this project was transferred to the Apache foundation.\n| --- |\n| It will no longer be maintained. Please migrate to [apache/cloudstack-kubernetes-provider](https://github.com/apache/cloudstack-kubernetes-provider) |\n\n[![](https://img.shields.io/github/release/swisstxt/cloudstack-cloud-controller-manager.svg?style=flat-square \"Release\")](https://github.com/swisstxt/cloudstack-cloud-controller-manager/releases)\n[![](https://img.shields.io/badge/license-Apache%202.0-blue.svg?style=flat-square \"Apache 2.0 license\")](/LICENSE-2.0)\n[![](https://img.shields.io/badge/language-Go-%235adaff.svg?style=flat-square \"Go language\")](https://golang.org)\n[![](https://img.shields.io/docker/build/swisstxt/cloudstack-cloud-controller-manager.svg?style=flat-square \"Docker build status\")](https://hub.docker.com/r/swisstxt/cloudstack-cloud-controller-manager/)\n\nA Cloud Controller Manager to facilitate Kubernetes deployments on Cloudstack.\n\nBased on the old Cloudstack provider in Kubernetes that will be removed soon.\n\n## Deployment\n\n### Kubernetes\n\nPrebuilt containers are posted on [Docker Hub](https://hub.docker.com/r/swisstxt/cloudstack-cloud-controller-manager).\n\nThe cloud controller is intended to be deployed as a daemon set, with on instance running on each node.\n\nTo configure API access to your CloudStack management server, you need to create a secret containing a `cloudstack.ini`\nthat is suitable for your environment.\n\n`cloudstack.ini` should look like this:\n```ini\n[Global]\napi-url = \u003cCloudStack API URL\u003e\napi-key = \u003cCloudStack API Key\u003e\nsecret-key = \u003cCloudStack API Secret\u003e\nproject-id = \u003cCloudStack Project UUID (optional)\u003e\nzone = \u003cCloudStack Zone Name (optional)\u003e\nssl-no-verify = \u003cDisable SSL certificate validation: true or false (optional)\u003e\n```\n\nThe access token needs to be able to fetch VM information and deploy load balancers in the project or domain where the nodes reside.\n\nTo create the secret, use the following command:\n```bash\nkubectl create secret generic cloudstack-secret --from-file=cloudstack.ini\n```\n\nYou can then use the provided example [deployment.yaml](/deployment.yaml) to deploy the controller:\n```bash\nkubectl apply -f deployment.yaml\n```\n\n### Protocols\n\nThis CCM supports TCP, UDP and [TCP-Proxy](https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt) LoadBalancer deployments.\n\nFor UDP and Proxy Protocol support, CloudStack 4.6 or later is required.\n\nSince kube-proxy does not support the Proxy Protocol or UDP, you should connect this directly to pods, for example by deploying a DaemonSet and setting `hostNetwork: true`.\nThe service running in the pod must support the protocol.\n\nSee [service.yaml](/service.yaml) for an example Service deployment and part of a suitable configuration for an ingress controller.\n\n### Node Labels\n\n:warning: **The node name must match the host name, so the controller can fetch and assign metadata from CloudStack.**\n\nIt is recommended to launch `kubelet` with the following parameter:\n\n```\n--register-with-taints=node.cloudprovider.kubernetes.io/uninitialized=true:NoSchedule\n```\n\nThis will treat the node as 'uninitialized' and cause the CCM to apply metadata labels from CloudStack automatically.\n\nSupported labels are:\n* kubernetes.io/hostname (= the instance name)\n* beta.kubernetes.io/instance-type (= the compute offering)\n* failure-domain.beta.kubernetes.io/zone (= the zone)\n* failure-domain.beta.kubernetes.io/region (also = the zone)\n\nIt is also possible to trigger this process manually by issuing the following command:\n\n```\nkubectl taint nodes \u003cmy-node-without-labels\u003e node.cloudprovider.kubernetes.io/uninitialized=true:NoSchedule\n```\n\n## Migration Guide\n\nThere are several notable differences to the old Kubernetes CloudStack cloud provider that need to be taken into\naccount when migrating from the old cloud provider to the standalone controller.\n\n### Load Balancer\n\nLoad balancer rule names now include the protocol in addition to the LB name and service port.\nThis was added to distinguish tcp, udp and tcp-proxy services operating on the same port.\nWithout this change, it would not be possible to map a service that runs on both TCP and UDP port 8000, for example.\n\n:warning: **If you have existing rules, remove them before the migration, and add them back afterwards.**\n\nIf you don't do this, you will end up with duplicate rules for the same service, which won't work.\n\n### Metadata\n\nSince the controller is now intended to be run inside a pod and not on the node, it will not be able to fetch metadata from the Virtual Router's DHCP server.\n\nInstead, it first obtains the name of the node from Kubernetes, then fetches information from the CloudStack API.\n\n## Development\n\n### Building\n\nGo 1.12 is required to build cloudstack-ccm.\n\nIt is recommended to build with Go module support, but dependencies are also vendored.\n\nTo build the controller with correct versioning, some build flags need to be passed.\nA Makefile is provided that sets these build flags to values obtained from git.\n\n```bash\ngo get github.com/apache/cloudstack-kubernetes-provider\ncd ${GOPATH}/src/github.com/apache/cloudstack-kubernetes-provider\nmake\n```\n\nTo build the cloudstack-cloud-controller-manager container, please use the provided Dockerfile.\nThe Makefile will also with that and properly tag the resulting container.\n\n```bash\nmake docker\n```\n\n### Testing\n\nYou need a local instance of the CloudStack Management Server or a 'real' one to connect to.\nThe CCM supports the same cloudstack.ini configuration file format used by [the cs tool](https://github.com/exoscale/cs),\nso you can simply point it to that.\n\n```bash\n./cloudstack-ccm --cloud-provider external-cloudstack --cloud-config ~/.cloudstack.ini --master k8s-apiserver\n```\n\nReplace k8s-apiserver with the host name of your Kubernetes development clusters's API server.\n\nIf you don't have a 'real' CloudStack installation, you can also launch a local [simulator instance](https://hub.docker.com/r/cloudstack/simulator) instead. This is very useful for dry-run testing.\n\n## Copyright\n\n© 2018 SWISS TXT AG and the Kubernetes authors.\n\nSee LICENSE-2.0 for permitted usage.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fswisstxt%2Fcloudstack-cloud-controller-manager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fswisstxt%2Fcloudstack-cloud-controller-manager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fswisstxt%2Fcloudstack-cloud-controller-manager/lists"}