Documentation
¶
Index ¶
- func IsDuplicateError(err error) bool
- type APIServersConfig
- type Client
- func (c *Client) AddRemote(ctx context.Context, host, caCert string, labels map[string]string, ...) (cluster.Cluster, error)
- func (c *Client) Apply(ctx context.Context, obj runtime.ApplyConfiguration, ...) error
- func (c *Client) ClustersForGVK(gvk schema.GroupVersionKind) ([]cluster.Cluster, error)
- func (c *Client) Create(ctx context.Context, obj client.Object, opts ...client.CreateOption) error
- func (c *Client) Delete(ctx context.Context, obj client.Object, opts ...client.DeleteOption) error
- func (c *Client) DeleteAllOf(ctx context.Context, obj client.Object, opts ...client.DeleteAllOfOption) error
- func (c *Client) GVKFromHomeScheme(obj runtime.Object) (gvk schema.GroupVersionKind, err error)
- func (c *Client) Get(ctx context.Context, key client.ObjectKey, obj client.Object, ...) error
- func (c *Client) GetEventRecorder(name string) events.EventRecorder
- func (c *Client) GroupVersionKindFor(obj runtime.Object) (schema.GroupVersionKind, error)
- func (c *Client) IndexField(ctx context.Context, obj client.Object, list client.ObjectList, field string, ...) error
- func (c *Client) InitFromConf(ctx context.Context, mgr ctrl.Manager, conf ClientConfig) error
- func (c *Client) IsObjectNamespaced(obj runtime.Object) (bool, error)
- func (c *Client) List(ctx context.Context, list client.ObjectList, opts ...client.ListOption) error
- func (c *Client) Patch(ctx context.Context, obj client.Object, patch client.Patch, ...) error
- func (c *Client) RESTMapper() meta.RESTMapper
- func (c *Client) Scheme() *runtime.Scheme
- func (c *Client) Status() client.StatusWriter
- func (c *Client) SubResource(subResource string) client.SubResourceClient
- func (c *Client) Update(ctx context.Context, obj client.Object, opts ...client.UpdateOption) error
- type ClientConfig
- type HistoryResourceRouter
- type HomeConfig
- type HypervisorResourceRouter
- type MultiClusterRecorder
- type MulticlusterBuilder
- type RemoteConfig
- type ReservationsResourceRouter
- type ResourceRouter
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func IsDuplicateError ¶
IsDuplicateError returns true if the error indicates that a resource was found in multiple clusters. This can be used by callers of the Get and List methods to keep using the result even if a duplicate exists, as long as they don't mind that the result is potentially inconsistent.
Types ¶
type APIServersConfig ¶
type APIServersConfig struct {
// Resources managed in the cluster where cortex is deployed.
Home HomeConfig `json:"home"`
// Resources managed in remote clusters.
Remotes []RemoteConfig `json:"remotes,omitempty"`
}
APIServersConfig separates resources into home and remote clusters.
type Client ¶
type Client struct {
// ResourceRouters determine which cluster a resource should be written to
// when multiple clusters serve the same GVK.
ResourceRouters map[schema.GroupVersionKind]ResourceRouter
// The cluster in which cortex is deployed.
HomeCluster cluster.Cluster
// The REST config for the home cluster in which cortex is deployed.
HomeRestConfig *rest.Config
// The scheme for the home cluster in which cortex is deployed.
// This scheme should include all types used in the remote clusters.
HomeScheme *runtime.Scheme
// contains filtered or unexported fields
}
func (*Client) AddRemote ¶
func (c *Client) AddRemote(ctx context.Context, host, caCert string, labels map[string]string, gvks ...schema.GroupVersionKind) (cluster.Cluster, error)
Add a remote cluster which uses the same REST config as the home cluster, but a different host, for the given resource gvks.
This can be used when the remote cluster accepts the home cluster's service account tokens. See the kubernetes documentation on structured auth to learn more about jwt-based authentication across clusters.
func (*Client) Apply ¶
func (c *Client) Apply(ctx context.Context, obj runtime.ApplyConfiguration, opts ...client.ApplyOption) error
Apply is not supported in the multicluster client as the group version kind cannot be inferred from the ApplyConfiguration.
func (*Client) ClustersForGVK ¶
ClustersForGVK returns all clusters that serve the given GVK. The GVK must be explicitly configured in either homeGVKs or remoteClusters. Returns an error if the GVK is unknown.
func (*Client) Create ¶
Create routes the object to the matching cluster using the ResourceRouter and performs a Create operation.
func (*Client) Delete ¶
Delete routes the object to the matching cluster using the ResourceRouter and performs a Delete operation.
func (*Client) DeleteAllOf ¶
func (c *Client) DeleteAllOf(ctx context.Context, obj client.Object, opts ...client.DeleteAllOfOption) error
DeleteAllOf iterates over all clusters with the GVK and performs DeleteAllOf on each.
func (*Client) GVKFromHomeScheme ¶
Get the gvk registered for the given resource in the home cluster's scheme.
func (*Client) Get ¶
func (c *Client) Get(ctx context.Context, key client.ObjectKey, obj client.Object, opts ...client.GetOption) error
Get iterates over all clusters with the GVK and returns the result.
If the requested resource is encountered in multiple clusters, this function will return the first one, but will set an error message that can be checked with IsDuplicateError. In that way the result can be used if the caller just cares about the resource existing in at least one cluster, and doesn't mind which one is returned.
If no cluster has the resource, a NotFound error is returned.
Non-NotFound errors from individual clusters are logged and silently skipped so that a single unavailable cluster does not block the entire read path.
func (*Client) GetEventRecorder ¶
func (c *Client) GetEventRecorder(name string) events.EventRecorder
GetEventRecorder creates a multi-cluster-aware EventRecorder. It pre-creates a per-cluster recorder for the home cluster and every remote cluster currently registered in the client. The name parameter is passed through to each cluster's GetEventRecorder method (it becomes the reportingController in the Kubernetes Event).
func (*Client) GroupVersionKindFor ¶
Return the GroupVersionKind for the given object using the home cluster's RESTMapper.
func (*Client) IndexField ¶
func (c *Client) IndexField(ctx context.Context, obj client.Object, list client.ObjectList, field string, extractValue client.IndexerFunc) error
Index a field for a resource in all matching cluster caches. Usually, you want to index the same field in both the object and list type, as both would be mapped to individual clients based on their GVK.
func (*Client) InitFromConf ¶
Helper function to initialize a new multicluster client during service startup, using the conf module provided by cortex.
func (*Client) IsObjectNamespaced ¶
Return true if the GroupVersionKind of the object is namespaced using the home cluster's RESTMapper.
func (*Client) List ¶
func (c *Client) List(ctx context.Context, list client.ObjectList, opts ...client.ListOption) error
List iterates over all clusters with the GVK and returns a combined list containing all resources found in any cluster.
If resources are encountered in multiple clusters with the same namespace/name, this function will still return a combined list of all resources, but will set an error message that can be checked with IsDuplicateError. In that way the result can be used if duplicates are ok and disambiguated by the caller.
Errors from individual clusters are logged and silently skipped so that a single unavailable cluster does not block the entire read path.
func (*Client) Patch ¶
func (c *Client) Patch(ctx context.Context, obj client.Object, patch client.Patch, opts ...client.PatchOption) error
Patch routes the object to the matching cluster using the ResourceRouter and performs a Patch operation.
func (*Client) RESTMapper ¶
func (c *Client) RESTMapper() meta.RESTMapper
Return the RESTMapper of the home cluster.
func (*Client) Status ¶
func (c *Client) Status() client.StatusWriter
Provide a wrapper around the status subresource client which picks the right cluster based on the resource type.
func (*Client) SubResource ¶
func (c *Client) SubResource(subResource string) client.SubResourceClient
Provide a wrapper around the given subresource client which picks the right cluster based on the resource type.
type ClientConfig ¶
type ClientConfig struct {
// Apiserver configuration mapping GVKs to home or remote clusters.
// Every GVK used through the multicluster client must be listed
// in either Home or Remotes. Unknown GVKs will cause an error.
APIServers APIServersConfig `json:"apiservers"`
}
type HistoryResourceRouter ¶
type HistoryResourceRouter struct{}
HistoryResourceRouter routes histories to clusters based on availability zone.
type HomeConfig ¶
type HomeConfig struct {
// The resource GVKs formatted as "<group>/<version>/<Kind>".
GVKs []string `json:"gvks"`
}
HomeConfig lists GVKs that are managed in the home cluster.
type HypervisorResourceRouter ¶
type HypervisorResourceRouter struct{}
HypervisorResourceRouter routes hypervisors to clusters based on availability zone.
type MultiClusterRecorder ¶
type MultiClusterRecorder struct {
// contains filtered or unexported fields
}
MultiClusterRecorder implements events.EventRecorder and routes events to the correct cluster based on the GVK of the "regarding" object. It uses the same routing logic as the multicluster Client's write path.
type MulticlusterBuilder ¶
type MulticlusterBuilder struct {
// Wrapped builder provided by controller-runtime.
*builder.Builder
// contains filtered or unexported fields
}
Builder which provides special methods to watch resources across multiple clusters.
func BuildController ¶
func BuildController(c *Client, mgr manager.Manager) MulticlusterBuilder
Build a multicluster controller using the multicluster client. Use this builder to watch resources across multiple clusters.
func (MulticlusterBuilder) WatchesMulticluster ¶
func (b MulticlusterBuilder) WatchesMulticluster(object client.Object, eventHandler handler.TypedEventHandler[client.Object, reconcile.Request], predicates ...predicate.Predicate) (MulticlusterBuilder, error)
WatchesMulticluster watches a resource across all clusters that serve its GVK. If the GVK is served by multiple remote clusters, a watch is set up on each. Returns an error if the GVK is not configured in any cluster.
type RemoteConfig ¶
type RemoteConfig struct {
// The remote kubernetes apiserver url, e.g. "https://my-apiserver:6443".
Host string `json:"host"`
// The root CA certificate to verify the remote apiserver.
CACert string `json:"caCert,omitempty"`
// The resource GVKs this apiserver serves, formatted as "<group>/<version>/<Kind>".
GVKs []string `json:"gvks"`
// Labels used by ResourceRouters to match resources to this cluster
// for write operations (Create/Update/Delete/Patch).
Labels map[string]string `json:"labels,omitempty"`
}
RemoteConfig maps multiple GVKs to a remote kubernetes apiserver with routing labels. It is assumed that the remote apiserver accepts the serviceaccount tokens issued by the local cluster.
type ReservationsResourceRouter ¶
type ReservationsResourceRouter struct{}
ReservationsResourceRouter routes reservations to clusters based on availability zone.