Repository: kubernetes
Issue: feature request: add Kind/ResourceScope support in APIService model
Labels: sig/api-machinery,kind/feature,triage/accepted

### What would you like to be added?

*  add Kind/ResourceScope support in APIService model

```go
// APIServiceSpec contains information for locating and communicating with a server.
// Only https is supported, though you are able to disable certificate verification.
type APIServiceSpec struct {
	// Service is a reference to the service for this API server.  It must communicate
	// on port 443.
	// If the Service is nil, that means the handling for the API groupversion is handled locally on this server.
	// The call will simply delegate to the normal handler chain to be fulfilled.
	// +optional
	Service *ServiceReference `json:"service,omitempty" protobuf:"bytes,1,opt,name=service"`
	// Group is the API group name this server hosts
	Group string `json:"group,omitempty" protobuf:"bytes,2,opt,name=group"`
	// Version is the API version this server hosts.  For example, "v1"
	Version string `json:"version,omitempty" protobuf:"bytes,3,opt,name=version"`

	// InsecureSkipTLSVerify disables TLS certificate verification when communicating with this server.
	// This is strongly discouraged.  You should use the CABundle instead.
	InsecureSkipTLSVerify bool `json:"insecureSkipTLSVerify,omitempty" protobuf:"varint,4,opt,name=insecureSkipTLSVerify"`
	// CABundle is a PEM encoded CA bundle which will be used to validate an API server's serving certificate.
	// If unspecified, system trust roots on the apiserver are used.
	// +listType=atomic
	// +optional
	CABundle []byte `json:"caBundle,omitempty" protobuf:"bytes,5,opt,name=caBundle"`

	// GroupPriorityMininum is the priority this group should have at least. Higher priority means that the group is preferred by clients over lower priority ones.
	// Note that other versions of this group might specify even higher GroupPriorityMininum values such that the whole group gets a higher priority.
	// The primary sort is based on GroupPriorityMinimum, ordered highest number to lowest (20 before 10).
	// The secondary sort is based on the alphabetical comparison of the name of the object.  (v1.bar before v1.foo)
	// We'd recommend something like: *.k8s.io (except extensions) at 18000 and
	// PaaSes (OpenShift, Deis) are recommended to be in the 2000s
	GroupPriorityMinimum int32 `json:"groupPriorityMinimum" protobuf:"varint,7,opt,name=groupPriorityMinimum"`

	// VersionPriority controls the ordering of this API version inside of its group.  Must be greater than zero.
	// The primary sort is based on VersionPriority, ordered highest to lowest (20 before 10).
	// Since it's inside of a group, the number can be small, probably in the 10s.
	// In case of equal version priorities, the version string will be used to compute the order inside a group.
	// If the version string is "kube-like", it will sort above non "kube-like" version strings, which are ordered
	// lexicographically. "Kube-like" versions start with a "v", then are followed by a number (the major version),
	// then optionally the string "alpha" or "beta" and another number (the minor version). These are sorted first
	// by GA > beta > alpha (where GA is a version with no suffix such as beta or alpha), and then by comparing major
	// version, then minor version. An example sorted list of versions:
	// v10, v2, v1, v11beta2, v10beta3, v3beta1, v12alpha1, v11alpha2, foo1, foo10.
	VersionPriority int32 `json:"versionPriority" protobuf:"varint,8,opt,name=versionPriority"`

	// leaving this here so everyone remembers why proto index 6 is skipped
	// Priority int64 `json:"priority" protobuf:"varint,6,opt,name=priority"`

	// ---------------------------------------------------------------
	// ScopedResources declares a range of scoped resources to tell what resources to provide by the APIService. there can be more resources provided
	// by the servicebackend. k8s aggregator focuses on the resources declared by ScopedResources, if it is defined.
	ScopedResources []ScopedResource `json:"scopedResources,omitempty" protobuf:"bytes,7,opt,name=scopedResources"`
	// ---------------------------------------------------------------
}

type ResourceScope  string

const(
	ResourceScopeCluster ResourceScope  = "Cluster"
	ResourceScopeNamespace ResourceScope  = "Namespace"
)

type ScopedResource struct{
	ResourceScope ResourceScope `json:"resourceScope" protobuf:"bytes,2,name=resourceScope"`
	// plural is the plural name of the resource to serve.
	// The custom resources are served under `/apis/<group>/<version>/.../<plural>`.
	// Must match the name of the CustomResourceDefinition (in the form `<names.plural>.<group>`).
	// Must be all lowercase.
	Plural string `json:"plural" protobuf:"bytes,1,opt,name=plural"`
	// singular is the singular name of the resource. It must be all lowercase. Defaults to lowercased `kind`.
	// +optional
	Singular string `json:"singular,omitempty" protobuf:"bytes,2,opt,name=singular"`
	// kind is the serialized kind of the resource. It is normally CamelCase and singular.
	// kube aggregator will use this value as the `kind` attribute in API calls.
	Kind string `json:"kind" protobuf:"bytes,4,opt,name=kind"`
}
```


### Why is this needed?


user scenario:
1. there are multiple Kinds included in foo.com: BarCluster, BarMember, BarCoordinator. the models are all managed in single application, and aggregated into kube-apiserver through an APIService: resources.foo.com. the barmember instances number increases to 100 million and any requests to BarMember brings presure to the instances in the backend. we want to break the 3 models into 3 groups of instances under 3 services. but the 3 models are in the same group and APIService can't make it
2. there is a model called BarGroup under foo.com. after some time, we want to migrate foo.com to bar.com group. the model is already widely used across companies, so it can't be decommissioned easily as a shot. we want to have BarGroup be served under 2 APIService pointing to the same service backend. but the BarGroup is bind to foo.com group.