Additional provider docs (#498)
* Modify providers shortcode Signed-off-by: lucperkins <lucperkins@gmail.com> * Add extra note to provider section Signed-off-by: lucperkins <lucperkins@gmail.com> * More info in Providers doc Signed-off-by: lucperkins <lucperkins@gmail.com> * Update Alibaba tag Signed-off-by: lucperkins <lucperkins@gmail.com> * Add resources directory back to Git Signed-off-by: lucperkins <lucperkins@gmail.com>
This commit is contained in:
@@ -64,6 +64,10 @@ $colors: mergeColorMaps(("twitter-blue": ($twitter-blue, $white), "slack-green":
|
||||
.main
|
||||
flex: 1
|
||||
|
||||
blockquote
|
||||
code
|
||||
background-color: $grey-lighter
|
||||
|
||||
=hide
|
||||
display: none
|
||||
|
||||
|
||||
@@ -36,4 +36,80 @@ mkdir providers/my-provider
|
||||
|
||||
In that created directory, implement the [`Provider`](https://godoc.org/github.com/virtual-kubelet/virtual-kubelet/providers#Provider) interface in [Go](https://golang.org).
|
||||
|
||||
For a basic example, see the [Virtual Kubelet CRI Provider](https://github.com/virtual-kubelet/virtual-kubelet/tree/master/providers/cri).
|
||||
> For an example implementation of the Virtual Kubelet `Provider` interface, see the [Virtual Kubelet CRI Provider](https://github.com/virtual-kubelet/virtual-kubelet/tree/master/providers/cri), especially [`cri.go`](https://github.com/virtual-kubelet/virtual-kubelet/blob/master/providers/cri/cri.go).
|
||||
|
||||
Each Virtual Kubelet provider can be configured using its own configuration file and environment variables.
|
||||
|
||||
You can see the list of required methods, with relevant descriptions of each method, below:
|
||||
|
||||
```go
|
||||
// Provider contains the methods required to implement a Virtual Kubelet provider
|
||||
type Provider interface {
|
||||
// Takes a Kubernetes Pod and deploys it within the provider
|
||||
CreatePod(ctx context.Context, pod *v1.Pod) error
|
||||
|
||||
// Takes a Kubernetes Pod and updates it within the provider
|
||||
UpdatePod(ctx context.Context, pod *v1.Pod) error
|
||||
|
||||
// Takes a Kubernetes Pod and deletes it from the provider
|
||||
DeletePod(ctx context.Context, pod *v1.Pod) error
|
||||
|
||||
// Retrieves a pod by name from the provider (can be cached)
|
||||
GetPod(ctx context.Context, namespace, name string) (*v1.Pod, error)
|
||||
|
||||
// Retrieves the logs of a container by name from the provider
|
||||
GetContainerLogs(ctx context.Context, namespace, podName, containerName string, tail int) (string, error)
|
||||
|
||||
// Executes a command in a container in the pod, copying data between
|
||||
// in/out/err and the container's stdin/stdout/stderr
|
||||
ExecInContainer(name string, uid types.UID, container string, cmd []string, in io.Reader, out, err io.WriteCloser, tty bool, resize <-chan remotecommand.TerminalSize, timeout time.Duration) error
|
||||
|
||||
// Retrieves the status of a pod by name from the provider
|
||||
GetPodStatus(ctx context.Context, namespace, name string) (*v1.PodStatus, error)
|
||||
|
||||
// Retrieves a list of all pods running on the provider (can be cached)
|
||||
GetPods(context.Context) ([]*v1.Pod, error)
|
||||
|
||||
// Returns a resource list with the capacity constraints of the provider
|
||||
Capacity(context.Context) v1.ResourceList
|
||||
|
||||
// Returns a list of conditions (Ready, OutOfDisk, etc), which is polled
|
||||
// periodically to update the node status within Kubernetes
|
||||
NodeConditions(context.Context) []v1.NodeCondition
|
||||
|
||||
// Returns a list of addresses for the node status within Kubernetes
|
||||
NodeAddresses(context.Context) []v1.NodeAddress
|
||||
|
||||
// Returns NodeDaemonEndpoints for the node status within Kubernetes.
|
||||
NodeDaemonEndpoints(context.Context) *v1.NodeDaemonEndpoints
|
||||
|
||||
// Returns the operating system the provider is for
|
||||
OperatingSystem() string
|
||||
}
|
||||
```
|
||||
|
||||
In addition to `Provider`, there's an optional [`PodMetricsProvider`](https://godoc.org/github.com/virtual-kubelet/virtual-kubelet/providers#PodMetricsProvider) interface that providers can implement to expose Kubernetes Pod stats:
|
||||
|
||||
```go
|
||||
type PodMetricsProvider interface {
|
||||
GetStatsSummary(context.Context) (*stats.Summary, error)
|
||||
}
|
||||
```
|
||||
|
||||
For a Virtual Kubelet provider to be considered viable, it must support the following functionality:
|
||||
|
||||
1. It must provide the backend plumbing necessary to support the lifecycle management of Pods, containers, and supporting resources in the Kubernetes context.
|
||||
1. It must conform to the current API provided by Virtual Kubelet (see [above](#adding))
|
||||
1. It won't have access to the [Kubernetes API server](https://kubernetes.io/docs/concepts/overview/kubernetes-api/), so it must provide a well-defined callback mechanism for fetching data like [Secrets](https://kubernetes.io/docs/concepts/configuration/secret/) and [ConfigMaps](https://kubernetes.io/docs/tutorials/configuration/).
|
||||
|
||||
In addition to implementing the `Provider` interface in `providers/<your provider>`, you also need to add your provider to the [`providers/register`](https://github.com/virtual-kubelet/virtual-kubelet/tree/master/providers/register) directory, in `provider_<your provider>.go`. Current examples include [`provider_azure.go`](https://github.com/virtual-kubelet/virtual-kubelet/blob/master/providers/register/provider_azure.go) and [`provider_aws.go`](https://github.com/virtual-kubelet/virtual-kubelet/blob/master/providers/register/provider_aws.go), which you can use as templates.
|
||||
|
||||
## Documentation
|
||||
|
||||
No Virtual Kubelet provider is complete without solid documentation. We strongly recommend providing a README for your provider in its directory. The READMEs for the currently existing implementations can provide a blueprint.
|
||||
|
||||
You'll also likely want your provider to appear in the [list of current providers](#current-providers). That list is generated from a [`provider.yaml`](https://github.com/virtual-kubelet/virtual-kubelet/blob/master/website/data/providers.yaml) file. Add a `name` field for the displayed name of the provider and the subdirectory as the `tag` field. The `name` field supports Markdown, so feel free to use bold text or a hyperlink.
|
||||
|
||||
## Testing
|
||||
|
||||
In order to test the provider you're developing, simply run `make test` from the root of the Virtual Kubelet directory.
|
||||
|
||||
Reference in New Issue
Block a user