Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨ Switch to cluster-aware k8s clients, listers & informers #2104

Merged
merged 27 commits into from
Oct 21, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
f66c731
bootstrap: improve logging
stevekuznetsov Oct 20, 2022
a5cbd37
*: move our cluster-aware-key hack to our repo
stevekuznetsov Oct 20, 2022
e4a3021
test/e2e: improve logging in a fixture
stevekuznetsov Oct 20, 2022
480aaab
admission: implement a delegating limit-ranger plugin
stevekuznetsov Oct 20, 2022
2f16495
admission/kubequota: implement using generated factories
stevekuznetsov Oct 20, 2022
cd678ab
builtins: remove AP&F types
stevekuznetsov Oct 20, 2022
c8282c1
docs: update key section
stevekuznetsov Oct 20, 2022
96a37b0
admission/*webhook: reimplement with cluster-aware delegation
stevekuznetsov Oct 20, 2022
577fa50
authorization: use scoped listers
stevekuznetsov Oct 20, 2022
c10556e
workspace_content_authorizer: fill indexers using client in tests
stevekuznetsov Oct 20, 2022
b07cfb3
workspace_content_authorizer: actually name objects correctly
stevekuznetsov Oct 20, 2022
edd323b
admission/namespacelifecycle: feed the cluster-aware namespace admission
stevekuznetsov Oct 20, 2022
8422002
server/cache: implement a cluster-aware CRD lister
stevekuznetsov Oct 20, 2022
21fcd85
server: implement a cluster-aware apibinding-aware crd lister
stevekuznetsov Oct 20, 2022
fcd70eb
reconciler/cache: make tests cluster-aware
stevekuznetsov Oct 20, 2022
5a50dc4
server: consume the informers + client from the first creation
stevekuznetsov Oct 20, 2022
0ab0550
syncer: remove the scoping lister implementation
stevekuznetsov Oct 20, 2022
b12141e
virtual/framework: remove a dynamic cluster client implementation
stevekuznetsov Oct 20, 2022
ba7de6f
dynamicsharedinformerfactory: simplify by using generated code
stevekuznetsov Oct 20, 2022
5f4277d
virtual/framework: adapt client getter for new types
stevekuznetsov Oct 20, 2022
cd96188
virtual/framework: adapt deleter implemenetation
stevekuznetsov Oct 20, 2022
849e26d
virtual/framework: adapt tests to be cluster-aware
stevekuznetsov Oct 20, 2022
d001afd
virtual/workspaces: adapt plumbing of auth cache
stevekuznetsov Oct 20, 2022
be2357b
test/e2e/reconciler/namespace: adapt expecter to do a cross-cluster list
stevekuznetsov Oct 20, 2022
2b1d382
*: mostly-automated, boring type/callsite refactors
stevekuznetsov Oct 20, 2022
baaded5
*: miscellany to pass linters and reiew comments
stevekuznetsov Oct 20, 2022
c948a85
go.mod: bump k8s to latest commit
stevekuznetsov Oct 21, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 5 additions & 6 deletions cmd/virtual-workspaces/command/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ import (
"net/url"
"time"

kcpkubernetesclient "github.com/kcp-dev/client-go/clients/clientset/versioned"
kcpkubernetesinformers "github.com/kcp-dev/client-go/clients/informers"
"github.com/kcp-dev/logicalcluster/v2"
"github.com/spf13/cobra"

Expand All @@ -33,8 +35,6 @@ import (
"k8s.io/apimachinery/pkg/runtime/serializer"
"k8s.io/apimachinery/pkg/util/wait"
genericapiserver "k8s.io/apiserver/pkg/server"
kubernetesinformers "k8s.io/client-go/informers"
kubernetesclient "k8s.io/client-go/kubernetes"
"k8s.io/client-go/pkg/version"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/component-base/config"
Expand All @@ -44,7 +44,7 @@ import (
kcpclient "github.com/kcp-dev/kcp/pkg/client/clientset/versioned"
kcpinformers "github.com/kcp-dev/kcp/pkg/client/informers/externalversions"
kcpfeatures "github.com/kcp-dev/kcp/pkg/features"
bootstrap "github.com/kcp-dev/kcp/pkg/server/bootstrap"
"github.com/kcp-dev/kcp/pkg/server/bootstrap"
virtualrootapiserver "github.com/kcp-dev/kcp/pkg/virtual/framework/rootapiserver"
)

Expand Down Expand Up @@ -107,13 +107,12 @@ func Run(ctx context.Context, o *options.Options) error {
}

// create clients and informers
kubeClusterClient, err := kubernetesclient.NewClusterForConfig(identityConfig)
kubeClusterClient, err := kcpkubernetesclient.NewForConfig(identityConfig)
if err != nil {
return err
}

wildcardKubeClient := kubeClusterClient.Cluster(logicalcluster.Wildcard)
wildcardKubeInformers := kubernetesinformers.NewSharedInformerFactory(wildcardKubeClient, 10*time.Minute)
wildcardKubeInformers := kcpkubernetesinformers.NewSharedInformerFactory(kubeClusterClient, 10*time.Minute)

kcpClusterClient, err := kcpclient.NewClusterForConfig(identityConfig)
if err != nil {
Expand Down
15 changes: 9 additions & 6 deletions config/crds/bootstrap.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@ import (
"sync"
"time"

"github.com/kcp-dev/logicalcluster/v2"

crdhelpers "k8s.io/apiextensions-apiserver/pkg/apihelpers"
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
extensionsapiserver "k8s.io/apiextensions-apiserver/pkg/apiserver"
Expand All @@ -39,6 +37,8 @@ import (
"k8s.io/client-go/util/retry"
"k8s.io/klog/v2"
"sigs.k8s.io/yaml"

"github.com/kcp-dev/kcp/pkg/logging"
)

//go:embed *.yaml
Expand Down Expand Up @@ -124,8 +124,9 @@ func CRD(fs embed.FS, gr metav1.GroupResource) (*apiextensionsv1.CustomResourceD
}

func CreateSingle(ctx context.Context, client apiextensionsv1client.CustomResourceDefinitionInterface, rawCRD *apiextensionsv1.CustomResourceDefinition) error {
logger := klog.FromContext(ctx).WithValues("crd", rawCRD.Name)
start := time.Now()
klog.V(4).Infof("Bootstrapping %v", rawCRD.Name)
logger.V(4).Info("bootstrapping CRD")

updateNeeded := false
crd, err := client.Get(ctx, rawCRD.Name, metav1.GetOptions{})
Expand All @@ -146,24 +147,26 @@ func CreateSingle(ctx context.Context, client apiextensionsv1client.CustomResour
return fmt.Errorf("error creating CRD %s: %w", rawCRD.Name, err)
}
} else {
klog.Infof("Bootstrapped CRD %s|%v after %s", logicalcluster.From(crd), crd.Name, time.Since(start).String())
logging.WithObject(logger, crd).WithValues("duration", time.Since(start).String()).Info("bootstrapped CRD")
}
} else {
return fmt.Errorf("error fetching CRD %s: %w", rawCRD.Name, err)
}
} else {
updateNeeded = true
}
logger = logging.WithObject(logger, crd)

if updateNeeded {
rawCRD.ResourceVersion = crd.ResourceVersion
crd, err := client.Update(ctx, rawCRD, metav1.UpdateOptions{})
_, err := client.Update(ctx, rawCRD, metav1.UpdateOptions{})
if err != nil {
return err
}
klog.Infof("Updated CRD %s|%v after %s", logicalcluster.From(crd), rawCRD.Name, time.Since(start).String())
logger.WithValues("duration", time.Since(start).String()).Info("updated CRD")
}

logger.Info("waiting for CRD to be established")
return wait.PollImmediateInfiniteWithContext(ctx, 100*time.Millisecond, func(ctx context.Context) (bool, error) {
crd, err := client.Get(ctx, rawCRD.Name, metav1.GetOptions{})
if err != nil {
Expand Down
2 changes: 2 additions & 0 deletions config/helpers/bootstrap.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ See the License for the specific language governing permissions and
limitations under the License.
*/

// +kcp-code-generator:skip

package helpers

import (
Expand Down
2 changes: 2 additions & 0 deletions config/root-phase0/bootstrap.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ See the License for the specific language governing permissions and
limitations under the License.
*/

// +kcp-code-generator:skip

package rootphase0

import (
Expand Down
2 changes: 2 additions & 0 deletions config/root/bootstrap.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ See the License for the specific language governing permissions and
limitations under the License.
*/

// +kcp-code-generator:skip

package root

import (
Expand Down
4 changes: 2 additions & 2 deletions config/rootcompute/bootstrap.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,11 @@ import (
"context"
"embed"

kcpdynamic "github.com/kcp-dev/client-go/clients/dynamic"
"github.com/kcp-dev/logicalcluster/v2"

apiextensionsclient "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/client-go/dynamic"

confighelpers "github.com/kcp-dev/kcp/config/helpers"
kube124 "github.com/kcp-dev/kcp/config/rootcompute/kube-1.24"
Expand All @@ -40,7 +40,7 @@ var RootComputeWorkspace = logicalcluster.New("root:compute")
// Bootstrap creates resources in this package by continuously retrying the list.
// This is blocking, i.e. it only returns (with error) when the context is closed or with nil when
// the bootstrapping is successfully completed.
func Bootstrap(ctx context.Context, apiExtensionClusterClient apiextensionsclient.ClusterInterface, dynamicClusterClient dynamic.ClusterInterface, batteriesIncluded sets.String) error {
func Bootstrap(ctx context.Context, apiExtensionClusterClient apiextensionsclient.ClusterInterface, dynamicClusterClient kcpdynamic.ClusterInterface, batteriesIncluded sets.String) error {
rootDiscoveryClient := apiExtensionClusterClient.Cluster(tenancyv1alpha1.RootCluster).Discovery()
rootDynamicClient := dynamicClusterClient.Cluster(tenancyv1alpha1.RootCluster)
if err := confighelpers.Bootstrap(ctx, rootDiscoveryClient, rootDynamicClient, batteriesIncluded, fs); err != nil {
Expand Down
2 changes: 2 additions & 0 deletions config/rootcompute/kube-1.24/bootstrap.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ See the License for the specific language governing permissions and
limitations under the License.
*/

// +kcp-code-generator:skip

package kube124

import (
Expand Down
2 changes: 2 additions & 0 deletions config/shard/bootstrap.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ See the License for the specific language governing permissions and
limitations under the License.
*/

// +kcp-code-generator:skip

package shard

import (
Expand Down
5 changes: 4 additions & 1 deletion config/system-crds/bootstrap.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ See the License for the specific language governing permissions and
limitations under the License.
*/

// +kcp-code-generator:skip

package systemcrds

import (
Expand Down Expand Up @@ -42,6 +44,7 @@ var fs embed.FS
// This is blocking, i.e. it only returns (with error) when the context is closed or with nil when
// the bootstrapping is successfully completed.
func Bootstrap(ctx context.Context, crdClient apiextensionsclient.Interface, discoveryClient discovery.DiscoveryInterface, dynamicClient dynamic.Interface, batteriesIncluded sets.String) error {
logger := klog.FromContext(ctx)
// This is the full list of CRDs that kcp owns and manages in the system:system-crds logical cluster. Our custom CRD
// lister currently has a hard-coded list of which system CRDs are made available to which workspaces. See
// pkg/server/apiextensions.go newSystemCRDProvider for the list. These CRDs should never be installed in any other
Expand All @@ -55,7 +58,7 @@ func Bootstrap(ctx context.Context, crdClient apiextensionsclient.Interface, dis

if err := wait.PollImmediateInfiniteWithContext(ctx, time.Second, func(ctx context.Context) (bool, error) {
if err := configcrds.Create(ctx, crdClient.ApiextensionsV1().CustomResourceDefinitions(), crds...); err != nil {
klog.Errorf("failed to bootstrap system CRDs: %v", err)
logger.Error(err, "failed to bootstrap system CRDs, retrying")
return false, nil // keep retrying
}
return true, nil
Expand Down
2 changes: 2 additions & 0 deletions config/universal/bootstrap.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ See the License for the specific language governing permissions and
limitations under the License.
*/

// +kcp-code-generator:skip

package universal

import (
Expand Down
25 changes: 1 addition & 24 deletions docs/content/en/main/concepts/developers/controllers.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,27 +25,4 @@ Here are what keys look like for an object `foo` for both cluster-scoped and nam

## Encoding/decoding keys

### Encoding workspace keys

To encode a key **for a workspace**, use `helper.WorkspaceKey(org, ws)`. Valid values for `org` are `root` and any
organization workspace name (e.g. `my-org` from above).

### Encoding all other keys

To encode a key for anything else, use `clusters.ToClusterAwareKey(clusterName, name)`. If your object is namespace-scoped,
you'll need to do `ns + "/" + clusters.ToClusterAwareKey(clusterName, name)`.

### Decoding keys

To decode a key, use `clusters.SplitClusterAwareKey(key)`.

To decode a key for a cluster-scoped object, use it directly. To decode a key for a namespace-scoped object, do this:

```go
namespace, clusterNameAndName, err := cache.SplitMetaNamespaceKey(key)
if err != nil {
// handle error
}

clusterName, name := clusters.SplitClusterAwareKey(clusterNameAndName)
```
Use the `github.com/kcp-dev/apimachinery/pkg/cache` package to encode and decode keys.
64 changes: 32 additions & 32 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ require (
github.com/go-logr/logr v1.2.3
github.com/google/go-cmp v0.5.8
github.com/google/uuid v1.3.0
github.com/kcp-dev/apimachinery v0.0.0-20220912132244-efe716c18e43
github.com/kcp-dev/apimachinery v0.0.0-20221019133255-9e1e13940519
github.com/kcp-dev/client-go v0.0.0-20221019184858-60e56386a574
github.com/kcp-dev/kcp/pkg/apis v0.0.0-00010101000000-000000000000
github.com/kcp-dev/logicalcluster/v2 v2.0.0-alpha.3
github.com/martinlindhe/base36 v1.1.1
Expand All @@ -41,13 +42,12 @@ require (
k8s.io/client-go v0.24.4
k8s.io/code-generator v0.24.3
k8s.io/component-base v0.24.3
k8s.io/controller-manager v0.0.0
k8s.io/klog/v2 v2.60.1
k8s.io/klog/v2 v2.70.1
k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42
k8s.io/kubernetes v1.24.3
k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9
k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed
sigs.k8s.io/structured-merge-diff/v4 v4.2.3
sigs.k8s.io/yaml v1.2.0
sigs.k8s.io/yaml v1.3.0
)

require (
Expand Down Expand Up @@ -173,8 +173,8 @@ require (
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/cloud-provider v0.0.0 // indirect
k8s.io/cluster-bootstrap v0.0.0 // indirect
k8s.io/component-helpers v0.0.0 // indirect
k8s.io/controller-manager v0.0.0 // indirect
k8s.io/gengo v0.0.0-20211129171323-c02415ce4185 // indirect
k8s.io/kube-aggregator v0.0.0 // indirect
k8s.io/kube-controller-manager v0.0.0 // indirect
Expand All @@ -189,30 +189,30 @@ require (

replace (
github.com/kcp-dev/kcp/pkg/apis => ./pkg/apis
k8s.io/api => github.com/kcp-dev/kubernetes/staging/src/k8s.io/api v0.0.0-20221005071841-6cfb7d485cbf
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I assume you'll drop/replace this commit?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, that's the last commit & will be replaced with the fork once we merge the k8s PR

k8s.io/apiextensions-apiserver => github.com/kcp-dev/kubernetes/staging/src/k8s.io/apiextensions-apiserver v0.0.0-20221005071841-6cfb7d485cbf
k8s.io/apimachinery => github.com/kcp-dev/kubernetes/staging/src/k8s.io/apimachinery v0.0.0-20221005071841-6cfb7d485cbf
k8s.io/apiserver => github.com/kcp-dev/kubernetes/staging/src/k8s.io/apiserver v0.0.0-20221005071841-6cfb7d485cbf
k8s.io/cli-runtime => github.com/kcp-dev/kubernetes/staging/src/k8s.io/cli-runtime v0.0.0-20221005071841-6cfb7d485cbf
k8s.io/client-go => github.com/kcp-dev/kubernetes/staging/src/k8s.io/client-go v0.0.0-20221005071841-6cfb7d485cbf
k8s.io/cloud-provider => github.com/kcp-dev/kubernetes/staging/src/k8s.io/cloud-provider v0.0.0-20221005071841-6cfb7d485cbf
k8s.io/cluster-bootstrap => github.com/kcp-dev/kubernetes/staging/src/k8s.io/cluster-bootstrap v0.0.0-20221005071841-6cfb7d485cbf
k8s.io/code-generator => github.com/kcp-dev/kubernetes/staging/src/k8s.io/code-generator v0.0.0-20221005071841-6cfb7d485cbf
k8s.io/component-base => github.com/kcp-dev/kubernetes/staging/src/k8s.io/component-base v0.0.0-20221005071841-6cfb7d485cbf
k8s.io/component-helpers => github.com/kcp-dev/kubernetes/staging/src/k8s.io/component-helpers v0.0.0-20221005071841-6cfb7d485cbf
k8s.io/controller-manager => github.com/kcp-dev/kubernetes/staging/src/k8s.io/controller-manager v0.0.0-20221005071841-6cfb7d485cbf
k8s.io/cri-api => github.com/kcp-dev/kubernetes/staging/src/k8s.io/cri-api v0.0.0-20221005071841-6cfb7d485cbf
k8s.io/csi-translation-lib => github.com/kcp-dev/kubernetes/staging/src/k8s.io/csi-translation-lib v0.0.0-20221005071841-6cfb7d485cbf
k8s.io/kube-aggregator => github.com/kcp-dev/kubernetes/staging/src/k8s.io/kube-aggregator v0.0.0-20221005071841-6cfb7d485cbf
k8s.io/kube-controller-manager => github.com/kcp-dev/kubernetes/staging/src/k8s.io/kube-controller-manager v0.0.0-20221005071841-6cfb7d485cbf
k8s.io/kube-proxy => github.com/kcp-dev/kubernetes/staging/src/k8s.io/kube-proxy v0.0.0-20221005071841-6cfb7d485cbf
k8s.io/kube-scheduler => github.com/kcp-dev/kubernetes/staging/src/k8s.io/kube-scheduler v0.0.0-20221005071841-6cfb7d485cbf
k8s.io/kubectl => github.com/kcp-dev/kubernetes/staging/src/k8s.io/kubectl v0.0.0-20221005071841-6cfb7d485cbf
k8s.io/kubelet => github.com/kcp-dev/kubernetes/staging/src/k8s.io/kubelet v0.0.0-20221005071841-6cfb7d485cbf
k8s.io/kubernetes => github.com/kcp-dev/kubernetes v0.0.0-20221005071841-6cfb7d485cbf
k8s.io/legacy-cloud-providers => github.com/kcp-dev/kubernetes/staging/src/k8s.io/legacy-cloud-providers v0.0.0-20221005071841-6cfb7d485cbf
k8s.io/metrics => github.com/kcp-dev/kubernetes/staging/src/k8s.io/metrics v0.0.0-20221005071841-6cfb7d485cbf
k8s.io/mount-utils => github.com/kcp-dev/kubernetes/staging/src/k8s.io/mount-utils v0.0.0-20221005071841-6cfb7d485cbf
k8s.io/pod-security-admission => github.com/kcp-dev/kubernetes/staging/src/k8s.io/pod-security-admission v0.0.0-20221005071841-6cfb7d485cbf
k8s.io/sample-apiserver => github.com/kcp-dev/kubernetes/staging/src/k8s.io/sample-apiserver v0.0.0-20221005071841-6cfb7d485cbf
k8s.io/api => github.com/kcp-dev/kubernetes/staging/src/k8s.io/api v0.0.0-20221021135508-401e4f0fc370
k8s.io/apiextensions-apiserver => github.com/kcp-dev/kubernetes/staging/src/k8s.io/apiextensions-apiserver v0.0.0-20221021135508-401e4f0fc370
k8s.io/apimachinery => github.com/kcp-dev/kubernetes/staging/src/k8s.io/apimachinery v0.0.0-20221021135508-401e4f0fc370
k8s.io/apiserver => github.com/kcp-dev/kubernetes/staging/src/k8s.io/apiserver v0.0.0-20221021135508-401e4f0fc370
k8s.io/cli-runtime => github.com/kcp-dev/kubernetes/staging/src/k8s.io/cli-runtime v0.0.0-20221021135508-401e4f0fc370
k8s.io/client-go => github.com/kcp-dev/kubernetes/staging/src/k8s.io/client-go v0.0.0-20221021135508-401e4f0fc370
k8s.io/cloud-provider => github.com/kcp-dev/kubernetes/staging/src/k8s.io/cloud-provider v0.0.0-20221021135508-401e4f0fc370
k8s.io/cluster-bootstrap => github.com/kcp-dev/kubernetes/staging/src/k8s.io/cluster-bootstrap v0.0.0-20221021135508-401e4f0fc370
k8s.io/code-generator => github.com/kcp-dev/kubernetes/staging/src/k8s.io/code-generator v0.0.0-20221021135508-401e4f0fc370
k8s.io/component-base => github.com/kcp-dev/kubernetes/staging/src/k8s.io/component-base v0.0.0-20221021135508-401e4f0fc370
k8s.io/component-helpers => github.com/kcp-dev/kubernetes/staging/src/k8s.io/component-helpers v0.0.0-20221021135508-401e4f0fc370
k8s.io/controller-manager => github.com/kcp-dev/kubernetes/staging/src/k8s.io/controller-manager v0.0.0-20221021135508-401e4f0fc370
k8s.io/cri-api => github.com/kcp-dev/kubernetes/staging/src/k8s.io/cri-api v0.0.0-20221021135508-401e4f0fc370
k8s.io/csi-translation-lib => github.com/kcp-dev/kubernetes/staging/src/k8s.io/csi-translation-lib v0.0.0-20221021135508-401e4f0fc370
k8s.io/kube-aggregator => github.com/kcp-dev/kubernetes/staging/src/k8s.io/kube-aggregator v0.0.0-20221021135508-401e4f0fc370
k8s.io/kube-controller-manager => github.com/kcp-dev/kubernetes/staging/src/k8s.io/kube-controller-manager v0.0.0-20221021135508-401e4f0fc370
k8s.io/kube-proxy => github.com/kcp-dev/kubernetes/staging/src/k8s.io/kube-proxy v0.0.0-20221021135508-401e4f0fc370
k8s.io/kube-scheduler => github.com/kcp-dev/kubernetes/staging/src/k8s.io/kube-scheduler v0.0.0-20221021135508-401e4f0fc370
k8s.io/kubectl => github.com/kcp-dev/kubernetes/staging/src/k8s.io/kubectl v0.0.0-20221021135508-401e4f0fc370
k8s.io/kubelet => github.com/kcp-dev/kubernetes/staging/src/k8s.io/kubelet v0.0.0-20221021135508-401e4f0fc370
k8s.io/kubernetes => github.com/kcp-dev/kubernetes v0.0.0-20221021135508-401e4f0fc370
k8s.io/legacy-cloud-providers => github.com/kcp-dev/kubernetes/staging/src/k8s.io/legacy-cloud-providers v0.0.0-20221021135508-401e4f0fc370
k8s.io/metrics => github.com/kcp-dev/kubernetes/staging/src/k8s.io/metrics v0.0.0-20221021135508-401e4f0fc370
k8s.io/mount-utils => github.com/kcp-dev/kubernetes/staging/src/k8s.io/mount-utils v0.0.0-20221021135508-401e4f0fc370
k8s.io/pod-security-admission => github.com/kcp-dev/kubernetes/staging/src/k8s.io/pod-security-admission v0.0.0-20221021135508-401e4f0fc370
k8s.io/sample-apiserver => github.com/kcp-dev/kubernetes/staging/src/k8s.io/sample-apiserver v0.0.0-20221021135508-401e4f0fc370
)
Loading