cluster-autoscaler/cloudprovider/POLICY.md
As of the moment this policy is written (September 2022) Cluster Autoscaler has integrations with almost 30 different cloudproviders. At the same time there are only a handful of core CA maintainers. The maintainers don't have the capacity to build new integrations or maintain existing ones. In most cases they also have no experience with particular clouds and no access to a test environment.
Due to above reasons each integration is required to have a set of OWNERS who are responsible for development and maintenance of the integration. This document describes the role and responsibilities of core maintainers and integration owners. A lot of what is described below has been unofficial practice for multiple years now, but this policy also introduces some new requirements for cloudprovider maintenance.
Cloudprovider owners are responsible for:
The core maintainers will generally not interfere with cloudprovider development, but they may take the following actions without seeking approval from cloudprovider owners:
One way to integrate CA with a cloudprovider is to use existing External gRPC provider. Integrating with gRPC interface may be easier than implementing an in-tree cloudprovider and the gRPC provider comes with some essential caching built in.
An external cloudprovider implementation doesn't live in this repository and is not a part of CA image. As such it is also not a subject to this policy.
An alternative to External gRPC provider is an in-tree cloudprovider integration. An in-tree provider allows more customization (ex. by implementing custom processors that integrate with a specific provider), but it requires significantly more effort to implement and maintain.
In order to add new in-tree integration you need to open a pull request implementing the interfaces defined in cloud_provider.go. This policy requires that any new in-tree cloudprovider follows the following rules:
Note: Any functions in cloud_provider.go marked as 'Implementation optional' may be left unimplemented. Those functions provide additional functionality, but are not critical. To leave a function unimplemented just have it return cloudprovider.ErrNotImplemented.
In order to allow code changes to Cluster Autoscaler that would require non-trivial changes in cloudproviders this policy introduces Cloudprovider maintenance request (CMR) mechanism.
Cloudprovider owners will be required to address CMR or request an exception via the CMR github issue. A failure to take any action will result in cloudprovider being considered abandoned and marking it as deprecated as described below.
If no CMRs are issued in a given minor release, core maintainers will issue an empty CMR. The purpose of an empty CMR is to verify that cloudprovider owners are still actively maintaining their integration. The only action required for an empty CMR is replying on the github issue. Only one owner from each cloudprovider needs to reply on the issue.
Empty CMR follows the same rules as any other CMR. In particular it needs to be issued by enhancements freeze.
If cloudprovider owners fail to take actions described above, the particular integration will be marked as deprecated in the next CA minor release. A deprecated cloudprovider will be completely removed after 1 year as per Kubernetes deprecation policy.
A deprecated cloudprovider may become maintained again if the owners become active again or new owners step up. In order to regain maintained status any outstanding CMRs will need to be addressed.