Skip to content

Commit 980b2ae

Browse files
fix(k8s): change keychain order when authenticating in-cluster
1 parent 969ebea commit 980b2ae

File tree

1 file changed

+29
-7
lines changed

1 file changed

+29
-7
lines changed

pkg/image/auth.go

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,22 @@ import (
44
"context"
55
"errors"
66
"fmt"
7+
"io"
78
"os"
89

10+
"github.com/awslabs/amazon-ecr-credential-helper/ecr-login"
11+
"github.com/chrismellard/docker-credential-acr-env/pkg/credhelper"
912
"github.com/google/go-containerregistry/pkg/authn"
10-
"github.com/google/go-containerregistry/pkg/authn/k8schain"
1113
kubernetesauth "github.com/google/go-containerregistry/pkg/authn/kubernetes"
14+
"github.com/google/go-containerregistry/pkg/v1/google"
1215
"gopkg.in/square/go-jose.v2/jwt"
16+
"k8s.io/client-go/kubernetes"
17+
"k8s.io/client-go/rest"
18+
)
19+
20+
var (
21+
amazonKeychain authn.Keychain = authn.NewKeychainFromHelper(ecr.NewECRHelper(ecr.WithLogger(io.Discard)))
22+
azureKeychain authn.Keychain = authn.NewKeychainFromHelper(credhelper.NewACRCredentialsHelper())
1323
)
1424

1525
const tokenFileLocation = "/var/run/secrets/kubernetes.io/serviceaccount/token"
@@ -34,8 +44,6 @@ type ref struct {
3444
}
3545

3646
func getKeychain(ctx context.Context) (authn.Keychain, error) {
37-
var keychain authn.Keychain
38-
3947
tokenBytes, err := os.ReadFile(tokenFileLocation)
4048
if err != nil {
4149
if errors.Is(err, os.ErrNotExist) {
@@ -51,16 +59,30 @@ func getKeychain(ctx context.Context) (authn.Keychain, error) {
5159
if err != nil {
5260
return nil, err
5361
}
54-
55-
keychain, err = k8schain.NewInCluster(ctx, kubernetesauth.Options{
62+
clusterConfig, err := rest.InClusterConfig()
63+
if err != nil {
64+
return nil, err
65+
}
66+
client, err := kubernetes.NewForConfig(clusterConfig)
67+
if err != nil {
68+
return nil, err
69+
}
70+
k8sKeychain, err := kubernetesauth.New(ctx, client, kubernetesauth.Options{
5671
ServiceAccountName: m.serviceAccountName,
5772
Namespace: m.namespace,
5873
})
5974
if err != nil {
60-
return nil, fmt.Errorf("authenticate: %w", err)
75+
return nil, err
6176
}
6277

63-
return keychain, nil
78+
// Order matters here: We want to go through all of the cloud provider keychains before we hit the default keychain (docker config.json)
79+
return authn.NewMultiKeychain(
80+
k8sKeychain,
81+
google.Keychain,
82+
amazonKeychain,
83+
azureKeychain,
84+
authn.DefaultKeychain,
85+
), nil
6486
}
6587

6688
type podMetadata struct {

0 commit comments

Comments
 (0)