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

feat: sign.kontain.me #64

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
15 changes: 15 additions & 0 deletions cmd/sign/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# `sign.kontain.me`

## Examples

Pull a mirrored [`busybox`](https://hub.docker.com/_/busybox) image:

```
docker pull sign.kontain.me/busybox
```

Or by tag:

```
docker pull sign.kontain.me/busybox:musl
```
14 changes: 14 additions & 0 deletions cmd/sign/deploy.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/usr/bin/env bash

set -euxo pipefail

gcloud run deploy sign \
--project=kontaindotme \
--region=us-central1 \
--allow-unauthenticated \
--set-env-vars=BUCKET=kontaindotme \
--image=$(KO_DOCKER_REPO=gcr.io/kontaindotme ko publish -P ./cmd/sign) \
--memory=1Gi \
--cpu=1 \
--concurrency=80 \
--timeout=60 # 1m
208 changes: 208 additions & 0 deletions cmd/sign/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,208 @@
package main

import (
"context"
"fmt"
"github.com/google/go-containerregistry/pkg/authn"
v1 "github.com/google/go-containerregistry/pkg/v1"
"github.com/google/go-containerregistry/pkg/v1/remote"
"github.com/sigstore/cosign/cmd/cosign/cli/fulcio"
"log"
"net/http"
"os"
"strings"

"github.com/google/go-containerregistry/pkg/name"
"github.com/imjasonh/kontain.me/pkg/serve"

"github.com/sigstore/cosign/cmd/cosign/cli/options"
"github.com/sigstore/cosign/cmd/cosign/cli/sign"
"github.com/sigstore/cosign/cmd/cosign/cli/verify"
"github.com/sigstore/cosign/pkg/cosign"
fulcioclient "github.com/sigstore/fulcio/pkg/client"
)

func main() {
ctx := context.Background()
st, err := serve.NewStorage(ctx)
if err != nil {
log.Fatalf("serve.NewStorage: %v", err)
}
http.Handle("/v2/", &server{
info: log.New(os.Stdout, "I ", log.Ldate|log.Ltime|log.Lshortfile),
error: log.New(os.Stderr, "E ", log.Ldate|log.Ltime|log.Lshortfile),
storage: st,
})
http.Handle("/", http.RedirectHandler("https://github.com/imjasonh/kontain.me/blob/main/cmd/sign", http.StatusSeeOther))

log.Println("Starting...")
port := os.Getenv("PORT")
if port == "" {
port = "8080"
log.Printf("Defaulting to port %s", port)
}
log.Printf("Listening on port %s", port)
log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil))
}

type server struct {
info, error *log.Logger
storage *serve.Storage
}

func (s *server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
s.info.Println("handler:", r.Method, r.URL)
path := strings.TrimPrefix(r.URL.String(), "/v2/")

switch {
case path == "":
// API Version check.
w.Header().Set("Docker-Distribution-API-Version", "registry/2.0")
return
case strings.Contains(path, "/blobs/"),
strings.Contains(path, "/manifests/sha256:"):
// Extract requested blob digest and redirect to serve it from GCS.
// If it doesn't exist, this will return 404.
parts := strings.Split(r.URL.Path, "/")
digest := parts[len(parts)-1]
serve.Blob(w, r, digest)
case strings.Contains(path, "/manifests/"):
s.serveSignManifest(w, r)
default:
serve.Error(w, serve.ErrNotFound)
}
}

// sign.kontain.me/ubuntu -> mirror ubuntu and serve
func (s *server) serveSignManifest(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
path := strings.TrimPrefix(r.URL.Path, "/v2/")
parts := strings.Split(path, "/")

refstr := strings.Join(parts[:len(parts)-2], "/")
tagOrDigest := parts[len(parts)-1]
if strings.HasPrefix(tagOrDigest, "sha256:") {
refstr += "@" + tagOrDigest
} else {
refstr += ":" + tagOrDigest
}
for strings.HasPrefix(refstr, "sign.kontain.me/") {
refstr = strings.TrimPrefix(refstr, "sign.kontain.me/")
}

ref, err := name.ParseReference(refstr)
if err != nil {
s.error.Printf("ERROR (ParseReference(%q)): %v", refstr, err)
serve.Error(w, err)
return
}

revision := tagOrDigest

// If request is for image by digest, try to serve it from GCS.
if strings.HasPrefix(tagOrDigest, "sha256:") {
desc, err := s.storage.BlobExists(ctx, tagOrDigest)
if err != nil {
s.error.Printf("ERROR (storage.BlobExists): %s", err)
serve.Error(w, serve.ErrNotFound)
return
}
if r.Method == http.MethodHead {
w.Header().Set("Docker-Content-Digest", tagOrDigest)
w.Header().Set("Content-Type", string(desc.MediaType))
w.Header().Set("Content-Length", fmt.Sprintf("%d", desc.Size))
return
}
serve.Blob(w, r, tagOrDigest)
return
}

// If it's a HEAD request, and request was by digest, and we have that
// manifest mirrored by digest already, serve HEAD response from GCS.
// If it's a HEAD request and the other conditions aren't met, we'll
// handle this later by consulting the real registry.
if r.Method == http.MethodHead {
if d, ok := ref.(name.Digest); ok {
if desc, err := s.storage.BlobExists(ctx, d.DigestStr()); err == nil {
w.Header().Set("Docker-Content-Digest", d.DigestStr())
w.Header().Set("Content-Type", string(desc.MediaType))
w.Header().Set("Content-Length", fmt.Sprintf("%d", desc.Size))
return
}
}
}

ko := sign.KeyOpts{
FulcioURL: fulcioclient.SigstorePublicServerURL,
RekorURL: "https://rekor.sigstore.dev",
OIDCIssuer: "https://oauth2.sigstore.dev/auth",
OIDCClientID: "sigstore",
}

ro := options.RegistryOptions{}

err = sign.SignCmd(ctx, ko, ro, nil, []string{refstr}, "", true, "", false, false, "")

if err != nil {
s.error.Printf("ERROR (Cosign Keyless Sign(%q)): %v", refstr, err)
serve.Error(w, err)
return
}

// Serve new image manifest.
img, err := s.getImage(ctx, refstr)
if err != nil {
s.error.Println("ERROR:", err)
serve.Error(w, err)
return
}

co, err := ro.ClientOpts(ctx)
if err != nil {
s.error.Println("ERROR:", err)
serve.Error(w, err)
return
}

verified, _, err := cosign.VerifyImageSignatures(ctx, ref, &cosign.CheckOpts{
RekorURL: "https://rekor.sigstore.dev",
RegistryClientOpts: co,
RootCerts: fulcio.GetRoots(),
})

if err != nil {
s.error.Println("VerifyImageSignatures:", err)
serve.Error(w, err)
return
}

if len(verified) > 0 {
verify.PrintVerification(refstr, verified, "text")
} else {
s.error.Println("PrintVerification:", err)
serve.Error(w, err)
return
}

// Serve the manifest.
ck := cacheKey(path, revision)
if err := s.storage.ServeManifest(w, r, img, ck); err != nil {
s.error.Printf("ERROR (storage.ServeManifest): %v", err)
serve.Error(w, err)
return
}
}

func cacheKey(path, revision string) string {
ck := fmt.Sprintf("%s-%s", strings.ReplaceAll(path, "/", "_"), revision)
return fmt.Sprintf("sign-%x", ck)
}

func (s *server) getImage(ctx context.Context, image string) (v1.Image, error) {
ref, err := name.NewTag(image, name.WeakValidation)
if err != nil {
return nil, err
}
return remote.Image(ref, remote.WithAuthFromKeychain(authn.DefaultKeychain),
remote.WithContext(ctx))
}
6 changes: 6 additions & 0 deletions cmd/sign/test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#!/usr/bin/env bash

set -euxo pipefail

time crane validate --remote=sign.kontain.me/busybox
time crane validate --remote=sign.kontain.me/busybox
Copy link
Owner

Choose a reason for hiding this comment

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

You can run the server locally with BUCKET=your-gcs-bucket go run ./cmd/sign and pull an image with crane validate --remote=localhost:8080/busybox

This test should also cosign verify the signature for the image

Copy link

Choose a reason for hiding this comment

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

We just implemented the Verification method for the keyless mode:

verified, _, err := cosign.VerifyImageSignatures(ctx, ref, &cosign.CheckOpts{
  RekorURL:           "https://rekor.sigstore.dev",
  RegistryClientOpts: co,
})

And we're printing results to stdout as follows:

verify.PrintVerification(refstr, verified, "text")

Is that what you asked for?

21 changes: 9 additions & 12 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,26 +4,23 @@ go 1.15

require (
cloud.google.com/go v0.97.0
cloud.google.com/go/storage v1.17.0
cloud.google.com/go/storage v1.18.2
github.com/containerd/stargz-snapshotter/estargz v0.9.0 // indirect
github.com/docker/cli v20.10.9+incompatible // indirect
github.com/docker/docker v20.10.9+incompatible // indirect
github.com/docker/docker-credential-helpers v0.6.4 // indirect
github.com/dustin/go-humanize v1.0.0
github.com/google/go-containerregistry v0.6.0
github.com/google/go-containerregistry v0.6.1-0.20210922191434-34b7f00d7a60
github.com/google/go-github/v32 v32.1.0
github.com/google/ko v0.9.3
github.com/imjasonh/delay v0.0.0-20210102151318-8339250e8458
github.com/sigstore/cosign v1.3.1
github.com/sigstore/fulcio v0.1.2-0.20210831152525-42f7422734bb
github.com/tmc/dot v0.0.0-20180926222610-6d252d5ff882
golang.org/x/mod v0.5.1
golang.org/x/net v0.0.0-20211007125505-59d4e928ea9d // indirect
golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f
golang.org/x/oauth2 v0.0.0-20211028175245-ba495a64dcb5
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac // indirect
golang.org/x/text v0.3.7 // indirect
golang.org/x/tools v0.1.7 // indirect
google.golang.org/api v0.58.0
google.golang.org/genproto v0.0.0-20211005153810-c76a74d43a8e // indirect
google.golang.org/grpc v1.41.0 // indirect
google.golang.org/api v0.60.0
gopkg.in/yaml.v2 v2.4.0

)

replace k8s.io/client-go => k8s.io/client-go v0.22.3
Copy link
Owner

Choose a reason for hiding this comment

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

Why is this dependency added?

Copy link
Author

Choose a reason for hiding this comment

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

without this, client-go throws an error like the following:

Error Log
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:22:2: missing go.sum entry for module providing package k8s.io/api/admissionregistration/v1 (imported by k8s.io/client-go/kubernetes/typed/admissionregistration/v1); to add:
	go get k8s.io/client-go/kubernetes/typed/admissionregistration/v1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:23:2: missing go.sum entry for module providing package k8s.io/api/admissionregistration/v1beta1 (imported by k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1); to add:
	go get k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:24:2: missing go.sum entry for module providing package k8s.io/api/apiserverinternal/v1alpha1 (imported by k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1); to add:
	go get k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:25:2: missing go.sum entry for module providing package k8s.io/api/apps/v1 (imported by k8s.io/client-go/kubernetes/typed/apps/v1); to add:
	go get k8s.io/client-go/kubernetes/typed/apps/v1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:26:2: missing go.sum entry for module providing package k8s.io/api/apps/v1beta1 (imported by k8s.io/client-go/kubernetes/typed/apps/v1beta1); to add:
	go get k8s.io/client-go/kubernetes/typed/apps/v1beta1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:27:2: missing go.sum entry for module providing package k8s.io/api/apps/v1beta2 (imported by k8s.io/client-go/kubernetes/typed/apps/v1beta2); to add:
	go get k8s.io/client-go/kubernetes/typed/apps/v1beta2@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:28:2: missing go.sum entry for module providing package k8s.io/api/authentication/v1 (imported by k8s.io/client-go/kubernetes/typed/authentication/v1); to add:
	go get k8s.io/client-go/kubernetes/typed/authentication/v1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:29:2: missing go.sum entry for module providing package k8s.io/api/authentication/v1beta1 (imported by k8s.io/client-go/kubernetes/typed/authentication/v1beta1); to add:
	go get k8s.io/client-go/kubernetes/typed/authentication/v1beta1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:30:2: missing go.sum entry for module providing package k8s.io/api/authorization/v1 (imported by k8s.io/client-go/kubernetes/typed/authorization/v1); to add:
	go get k8s.io/client-go/kubernetes/typed/authorization/v1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:31:2: missing go.sum entry for module providing package k8s.io/api/authorization/v1beta1 (imported by k8s.io/client-go/kubernetes/typed/authorization/v1beta1); to add:
	go get k8s.io/client-go/kubernetes/typed/authorization/v1beta1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:32:2: missing go.sum entry for module providing package k8s.io/api/autoscaling/v1 (imported by k8s.io/client-go/kubernetes/typed/apps/v1); to add:
	go get k8s.io/client-go/kubernetes/typed/apps/v1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:33:2: missing go.sum entry for module providing package k8s.io/api/autoscaling/v2beta1 (imported by k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1); to add:
	go get k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:34:2: missing go.sum entry for module providing package k8s.io/api/autoscaling/v2beta2 (imported by k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2); to add:
	go get k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:35:2: missing go.sum entry for module providing package k8s.io/api/batch/v1 (imported by k8s.io/client-go/kubernetes/typed/batch/v1); to add:
	go get k8s.io/client-go/kubernetes/typed/batch/v1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:36:2: missing go.sum entry for module providing package k8s.io/api/batch/v1beta1 (imported by k8s.io/client-go/kubernetes/typed/batch/v1beta1); to add:
	go get k8s.io/client-go/kubernetes/typed/batch/v1beta1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:37:2: missing go.sum entry for module providing package k8s.io/api/certificates/v1 (imported by k8s.io/client-go/kubernetes/typed/certificates/v1); to add:
	go get k8s.io/client-go/kubernetes/typed/certificates/v1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:38:2: missing go.sum entry for module providing package k8s.io/api/certificates/v1beta1 (imported by k8s.io/client-go/kubernetes/typed/certificates/v1beta1); to add:
	go get k8s.io/client-go/kubernetes/typed/certificates/v1beta1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:39:2: missing go.sum entry for module providing package k8s.io/api/coordination/v1 (imported by k8s.io/client-go/kubernetes/typed/coordination/v1); to add:
	go get k8s.io/client-go/kubernetes/typed/coordination/v1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:40:2: missing go.sum entry for module providing package k8s.io/api/coordination/v1beta1 (imported by k8s.io/client-go/kubernetes/typed/coordination/v1beta1); to add:
	go get k8s.io/client-go/kubernetes/typed/coordination/v1beta1@v0.21.6
../../../../../../../go/pkg/mod/github.com/vdemeester/k8s-pkg-credentialprovider@v1.21.0-1/secrets/secrets.go:22:2: missing go.sum entry for module providing package k8s.io/api/core/v1 (imported by github.com/google/go-containerregistry/pkg/authn/k8schain); to add:
	go get github.com/google/go-containerregistry/pkg/authn/k8schain@v0.0.0-20211102215614-dd49079bb93d
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:42:2: missing go.sum entry for module providing package k8s.io/api/discovery/v1 (imported by k8s.io/client-go/kubernetes/typed/discovery/v1); to add:
	go get k8s.io/client-go/kubernetes/typed/discovery/v1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:43:2: missing go.sum entry for module providing package k8s.io/api/discovery/v1beta1 (imported by k8s.io/client-go/kubernetes/typed/discovery/v1beta1); to add:
	go get k8s.io/client-go/kubernetes/typed/discovery/v1beta1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:44:2: missing go.sum entry for module providing package k8s.io/api/events/v1 (imported by k8s.io/client-go/kubernetes/typed/events/v1); to add:
	go get k8s.io/client-go/kubernetes/typed/events/v1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:45:2: missing go.sum entry for module providing package k8s.io/api/events/v1beta1 (imported by k8s.io/client-go/kubernetes/typed/events/v1beta1); to add:
	go get k8s.io/client-go/kubernetes/typed/events/v1beta1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:46:2: missing go.sum entry for module providing package k8s.io/api/extensions/v1beta1 (imported by k8s.io/client-go/kubernetes/typed/extensions/v1beta1); to add:
	go get k8s.io/client-go/kubernetes/typed/extensions/v1beta1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:47:2: missing go.sum entry for module providing package k8s.io/api/flowcontrol/v1alpha1 (imported by k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1); to add:
	go get k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:48:2: missing go.sum entry for module providing package k8s.io/api/flowcontrol/v1beta1 (imported by k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1); to add:
	go get k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:49:2: missing go.sum entry for module providing package k8s.io/api/networking/v1 (imported by k8s.io/client-go/kubernetes/typed/networking/v1); to add:
	go get k8s.io/client-go/kubernetes/typed/networking/v1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:50:2: missing go.sum entry for module providing package k8s.io/api/networking/v1beta1 (imported by k8s.io/client-go/kubernetes/typed/networking/v1beta1); to add:
	go get k8s.io/client-go/kubernetes/typed/networking/v1beta1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:51:2: missing go.sum entry for module providing package k8s.io/api/node/v1 (imported by k8s.io/client-go/kubernetes/typed/node/v1); to add:
	go get k8s.io/client-go/kubernetes/typed/node/v1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:52:2: missing go.sum entry for module providing package k8s.io/api/node/v1alpha1 (imported by k8s.io/client-go/kubernetes/typed/node/v1alpha1); to add:
	go get k8s.io/client-go/kubernetes/typed/node/v1alpha1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:53:2: missing go.sum entry for module providing package k8s.io/api/node/v1beta1 (imported by k8s.io/client-go/kubernetes/typed/node/v1beta1); to add:
	go get k8s.io/client-go/kubernetes/typed/node/v1beta1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:54:2: missing go.sum entry for module providing package k8s.io/api/policy/v1 (imported by k8s.io/client-go/kubernetes/typed/policy/v1); to add:
	go get k8s.io/client-go/kubernetes/typed/policy/v1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:55:2: missing go.sum entry for module providing package k8s.io/api/policy/v1beta1 (imported by k8s.io/client-go/kubernetes/typed/core/v1); to add:
	go get k8s.io/client-go/kubernetes/typed/core/v1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:56:2: missing go.sum entry for module providing package k8s.io/api/rbac/v1 (imported by k8s.io/client-go/kubernetes/typed/rbac/v1); to add:
	go get k8s.io/client-go/kubernetes/typed/rbac/v1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:57:2: missing go.sum entry for module providing package k8s.io/api/rbac/v1alpha1 (imported by k8s.io/client-go/kubernetes/typed/rbac/v1alpha1); to add:
	go get k8s.io/client-go/kubernetes/typed/rbac/v1alpha1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:58:2: missing go.sum entry for module providing package k8s.io/api/rbac/v1beta1 (imported by k8s.io/client-go/kubernetes/typed/rbac/v1beta1); to add:
	go get k8s.io/client-go/kubernetes/typed/rbac/v1beta1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:59:2: missing go.sum entry for module providing package k8s.io/api/scheduling/v1 (imported by k8s.io/client-go/kubernetes/typed/scheduling/v1); to add:
	go get k8s.io/client-go/kubernetes/typed/scheduling/v1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:60:2: missing go.sum entry for module providing package k8s.io/api/scheduling/v1alpha1 (imported by k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1); to add:
	go get k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:61:2: missing go.sum entry for module providing package k8s.io/api/scheduling/v1beta1 (imported by k8s.io/client-go/kubernetes/typed/scheduling/v1beta1); to add:
	go get k8s.io/client-go/kubernetes/typed/scheduling/v1beta1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:62:2: missing go.sum entry for module providing package k8s.io/api/storage/v1 (imported by k8s.io/client-go/kubernetes/typed/storage/v1); to add:
	go get k8s.io/client-go/kubernetes/typed/storage/v1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:63:2: missing go.sum entry for module providing package k8s.io/api/storage/v1alpha1 (imported by k8s.io/client-go/kubernetes/typed/storage/v1alpha1); to add:
	go get k8s.io/client-go/kubernetes/typed/storage/v1alpha1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/kubernetes/scheme/register.go:64:2: missing go.sum entry for module providing package k8s.io/api/storage/v1beta1 (imported by k8s.io/client-go/kubernetes/typed/storage/v1beta1); to add:
	go get k8s.io/client-go/kubernetes/typed/storage/v1beta1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/tools/cache/listers.go:22:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/api/errors (imported by k8s.io/client-go/rest); to add:
	go get k8s.io/client-go/rest@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/tools/cache/index.go:22:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/api/meta (imported by k8s.io/client-go/tools/cache); to add:
	go get k8s.io/client-go/tools/cache@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/applyconfigurations/core/v1/emptydirvolumesource.go:23:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/api/resource (imported by k8s.io/client-go/applyconfigurations/autoscaling/v2beta1); to add:
	go get k8s.io/client-go/applyconfigurations/autoscaling/v2beta1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/tools/pager/pager.go:25:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/apis/meta/internalversion (imported by k8s.io/client-go/tools/pager); to add:
	go get k8s.io/client-go/tools/pager@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/tools/cache/listers.go:24:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/apis/meta/v1 (imported by github.com/google/go-containerregistry/pkg/authn/k8schain); to add:
	go get github.com/google/go-containerregistry/pkg/authn/k8schain@v0.0.0-20211102215614-dd49079bb93d
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/tools/cache/reflector.go:32:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/apis/meta/v1/unstructured (imported by k8s.io/client-go/tools/cache); to add:
	go get k8s.io/client-go/tools/cache@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/pkg/apis/clientauthentication/v1alpha1/conversion.go:20:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/conversion (imported by k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1); to add:
	go get k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/tools/cache/listwatch.go:23:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/fields (imported by k8s.io/client-go/tools/cache); to add:
	go get k8s.io/client-go/tools/cache@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/tools/cache/listers.go:25:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/labels (imported by knative.dev/pkg/kmeta); to add:
	go get knative.dev/pkg/kmeta@v0.0.0-20211004133827-74ac82a333a4
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/tools/cache/controller.go:23:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/runtime (imported by k8s.io/client-go/rest); to add:
	go get k8s.io/client-go/rest@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/tools/cache/listers.go:27:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/runtime/schema (imported by k8s.io/client-go/rest); to add:
	go get k8s.io/client-go/rest@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/plugin/pkg/client/auth/exec/exec.go:41:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/runtime/serializer (imported by k8s.io/client-go/discovery); to add:
	go get k8s.io/client-go/discovery@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/tools/clientcmd/api/latest/latest.go:22:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/runtime/serializer/json (imported by k8s.io/client-go/tools/clientcmd/api/latest); to add:
	go get k8s.io/client-go/tools/clientcmd/api/latest@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/rest/request.go:41:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/runtime/serializer/streaming (imported by k8s.io/client-go/rest); to add:
	go get k8s.io/client-go/rest@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/tools/clientcmd/api/latest/latest.go:23:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/runtime/serializer/versioning (imported by k8s.io/client-go/tools/clientcmd/api/latest); to add:
	go get k8s.io/client-go/tools/clientcmd/api/latest@v0.21.6
../../../../../../../go/pkg/mod/knative.dev/pkg@v0.0.0-20211004133827-74ac82a333a4/kmeta/labels.go:24:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/selection (imported by knative.dev/pkg/kmeta); to add:
	go get knative.dev/pkg/kmeta@v0.0.0-20211004133827-74ac82a333a4
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/rest/client.go:29:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/types (imported by k8s.io/client-go/rest); to add:
	go get k8s.io/client-go/rest@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/tools/cache/mutation_cache.go:29:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/util/cache (imported by k8s.io/client-go/tools/cache); to add:
	go get k8s.io/client-go/tools/cache@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/tools/cache/controller.go:24:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/util/clock (imported by k8s.io/client-go/rest); to add:
	go get k8s.io/client-go/rest@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/tools/cache/mutation_detector.go:30:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/util/diff (imported by k8s.io/client-go/tools/cache); to add:
	go get k8s.io/client-go/tools/cache@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/tools/clientcmd/loader.go:33:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/util/errors (imported by k8s.io/client-go/tools/clientcmd); to add:
	go get k8s.io/client-go/tools/clientcmd@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/applyconfigurations/apps/v1/rollingupdatedaemonset.go:22:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/util/intstr (imported by k8s.io/client-go/applyconfigurations/apps/v1); to add:
	go get k8s.io/client-go/applyconfigurations/apps/v1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/applyconfigurations/admissionregistration/v1/mutatingwebhookconfiguration.go:25:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/util/managedfields (imported by k8s.io/client-go/applyconfigurations/admissionregistration/v1); to add:
	go get k8s.io/client-go/applyconfigurations/admissionregistration/v1@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/tools/cache/reflector.go:36:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/util/naming (imported by k8s.io/client-go/tools/cache); to add:
	go get k8s.io/client-go/tools/cache@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/tools/cache/reflector.go:37:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/util/net (imported by github.com/vdemeester/k8s-pkg-credentialprovider/gcp); to add:
	go get github.com/vdemeester/k8s-pkg-credentialprovider/gcp@v1.21.0-1
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/tools/cache/controller.go:25:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/util/runtime (imported by k8s.io/client-go/tools/cache); to add:
	go get k8s.io/client-go/tools/cache@v0.21.6
../../../../../../../go/pkg/mod/github.com/vdemeester/k8s-pkg-credentialprovider@v1.21.0-1/keyring.go:26:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/util/sets (imported by github.com/vdemeester/k8s-pkg-credentialprovider); to add:
	go get github.com/vdemeester/k8s-pkg-credentialprovider@v1.21.0-1
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/tools/clientcmd/validation.go:27:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/util/validation (imported by k8s.io/client-go/tools/clientcmd); to add:
	go get k8s.io/client-go/tools/clientcmd@v0.21.6
../../../../../../../go/pkg/mod/github.com/vdemeester/k8s-pkg-credentialprovider@v1.21.0-1/aws/aws_credentials.go:35:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/util/wait (imported by github.com/vdemeester/k8s-pkg-credentialprovider/aws); to add:
	go get github.com/vdemeester/k8s-pkg-credentialprovider/aws@v1.21.0-1
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/plugin/pkg/client/auth/gcp/gcp.go:33:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/util/yaml (imported by k8s.io/client-go/plugin/pkg/client/auth/gcp); to add:
	go get k8s.io/client-go/plugin/pkg/client/auth/gcp@v0.21.6
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/pkg/version/version.go:23:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/version (imported by k8s.io/component-base/version); to add:
	go get k8s.io/component-base/version@v0.21.4
../../../../../../../go/pkg/mod/k8s.io/client-go@v0.21.6/tools/cache/listwatch.go:25:2: missing go.sum entry for module providing package k8s.io/apimachinery/pkg/watch (imported by k8s.io/client-go/rest); to add:
	go get k8s.io/client-go/rest@v0.21.6