|
| 1 | +--- |
| 2 | +title: Out-of-Tree Credential Providers |
| 3 | +authors: |
| 4 | + - "@mcrute" |
| 5 | +owning-sig: sig-cloud-provider |
| 6 | +participating-sigs: |
| 7 | + - sig-node |
| 8 | + - sig-auth |
| 9 | +reviewers: |
| 10 | + - "@andrewsykim" |
| 11 | + - "@cheftako" |
| 12 | + - "@nckturner" |
| 13 | +approvers: |
| 14 | + - TBD |
| 15 | +editor: TBD |
| 16 | +creation-date: 2019-10-04 |
| 17 | +last-updated: 2019-10-16 |
| 18 | +status: provisional |
| 19 | +--- |
| 20 | + |
| 21 | +# Out-of-Tree Credential Providers |
| 22 | + |
| 23 | +## Table of Contents |
| 24 | + |
| 25 | +<!-- toc --> |
| 26 | +- [Release Signoff Checklist](#release-signoff-checklist) |
| 27 | +- [Summary](#summary) |
| 28 | +- [Motivation](#motivation) |
| 29 | + - [Goals](#goals) |
| 30 | + - [Non-Goals](#non-goals) |
| 31 | +- [Proposal](#proposal) |
| 32 | + - [API Server Proxy](#api-server-proxy) |
| 33 | + - [Sidecar Credential Daemon](#sidecar-credential-daemon) |
| 34 | + - [External Non-Daemon Executable](#external-non-daemon-executable) |
| 35 | + - [Risks and Mitigations](#risks-and-mitigations) |
| 36 | +- [Design Details](#design-details) |
| 37 | + - [Test Plan](#test-plan) |
| 38 | + - [Graduation Criteria](#graduation-criteria) |
| 39 | + - [Upgrade / Downgrade Strategy](#upgrade--downgrade-strategy) |
| 40 | + - [Version Skew Strategy](#version-skew-strategy) |
| 41 | +- [Implementation History](#implementation-history) |
| 42 | +- [Infrastructure Needed](#infrastructure-needed) |
| 43 | +<!-- /toc --> |
| 44 | + |
| 45 | +## Release Signoff Checklist |
| 46 | + |
| 47 | +- [ ] kubernetes/enhancements issue in release milestone, which links to KEP (this should be a link to the KEP location in kubernetes/enhancements, not the initial KEP PR) |
| 48 | +- [ ] KEP approvers have set the KEP status to `implementable` |
| 49 | +- [ ] Design details are appropriately documented |
| 50 | +- [ ] Test plan is in place, giving consideration to SIG Architecture and SIG Testing input |
| 51 | +- [ ] Graduation criteria is in place |
| 52 | +- [ ] "Implementation History" section is up-to-date for milestone |
| 53 | +- [ ] User-facing documentation has been created in [kubernetes/website], for publication to [kubernetes.io] |
| 54 | +- [ ] Supporting documentation e.g., additional design documents, links to mailing list discussions/SIG meetings, relevant PRs/issues, release notes |
| 55 | + |
| 56 | +## Summary |
| 57 | + |
| 58 | +Replace the existing in-tree container image registry (registry) credential providers with an external and pluggable credential provider mechanism and remove in-tree credential providers. |
| 59 | + |
| 60 | +## Motivation |
| 61 | + |
| 62 | +kubelet uses cloud provider specific SDKs to obtain credentials when pulling container images from cloud provider specific registries. The use of cloud provider specific SDKs from within the main Kubernetes tree is deprecated by [KEP-0002](https://github.com/kubernetes/enhancements/blob/master/keps/sig-cloud-provider/20180530-cloud-controller-manager.md) and all existing uses need to be migrated out-of-tree. This KEP supports that migration process by removing this SDK usage. |
| 63 | + |
| 64 | +In addition to supporting cloud provider migration this KEP supports allowing users to support multiple container registries across different cloud providers by introducing a pluggable interface to cloud specific credential providers such that a single user could run multiple credential providers for different clouds at the same time. Currently this functionality is gated by having only a single, active cloud provider within the API server and kubelet. |
| 65 | + |
| 66 | +### Goals |
| 67 | + |
| 68 | +* Develop/test/release an API for kubelet to obtain registry credentials from the API server |
| 69 | +* Update/test/release the credential acquisition logic within kubelet |
| 70 | +* Build user documentation for out-of-tree credential providers |
| 71 | +* Migrate existing in-tree credential providers to new credential provider interface |
| 72 | +* Remove in-tree credential provider code from kuberentes core |
| 73 | + |
| 74 | +### Non-Goals |
| 75 | + |
| 76 | +* Broad removal of cloud SDK usage, this effort falls under the [KEP for removing in-tree providers](https://github.com/kubernetes/enhancements/blob/master/keps/sig-cloud-provider/2019-01-25-removing-in-tree-providers.md). |
| 77 | + |
| 78 | +## Proposal |
| 79 | + |
| 80 | +### API Server Proxy |
| 81 | + |
| 82 | +The API server will act as a proxy to an external container registry credential provider that may support multiple cloud providers. The credential provider service will return container runtime compatible responses of the type currently used by the credential provider infrastructure within the kubelet along with credential expiration information to allow the API server to cache credential responses for a period of time. |
| 83 | + |
| 84 | +This limits the cloud-specific privileges required for each node for the purpose of fetching credentials. Centralized caching helps to avoid cloud-specific rate limits for credential acquisition by consolidating that credential acquisition within the API server. |
| 85 | + |
| 86 | +### Sidecar Credential Daemon |
| 87 | + |
| 88 | +Each node will run a sidecar credential daemon that can obtain cloud-specific container registry credentials and may support multiple cloud providers. This service will be available to the kubelet on the local host and will return container runtime responses compatible with those currently used by the credential provider infrastructure within kubelet. Each daemon will perform its own caching of credentials for the node on which it runs. |
| 89 | + |
| 90 | +This architecture is similar to the approach taken by CSI with node plugins and is a well understood deployment pattern.It limits fleet-wide cacheability of credentials. |
| 91 | + |
| 92 | +### External Non-Daemon Executable |
| 93 | + |
| 94 | +An executable capable of providing container registry credentials will be installed on each node. This binary will be executed by the kubelet to obtain container registry credentials in a format compatible with container runtimes. Credential responses may be cached within the kubelet. |
| 95 | + |
| 96 | +This Architecture is similar to the approach taken by CNI and is a well understood deployment pattern. It limits fleet-wide cacheability of credentials. |
| 97 | + |
| 98 | +### Risks and Mitigations |
| 99 | + |
| 100 | +TODO |
| 101 | + |
| 102 | +## Design Details |
| 103 | + |
| 104 | +### Test Plan |
| 105 | + |
| 106 | +TODO |
| 107 | + |
| 108 | +### Graduation Criteria |
| 109 | + |
| 110 | +TODO |
| 111 | + |
| 112 | +### Upgrade / Downgrade Strategy |
| 113 | + |
| 114 | +TODO |
| 115 | + |
| 116 | +### Version Skew Strategy |
| 117 | + |
| 118 | +TODO |
| 119 | + |
| 120 | +## Implementation History |
| 121 | + |
| 122 | +TODO |
| 123 | + |
| 124 | +## Infrastructure Needed |
| 125 | + |
| 126 | +* New GitHub repos for existing credential providers (AWS, Azure, GCP) |
0 commit comments