Skip to content

Instantly share code, notes, and snippets.

@achoimet
Created May 10, 2020 19:19
Show Gist options
  • Save achoimet/605efb48cf91e366c807053dbf25c133 to your computer and use it in GitHub Desktop.
Save achoimet/605efb48cf91e366c807053dbf25c133 to your computer and use it in GitHub Desktop.
Kubernetes AWS authentication in go
package k8sAuth
import (
"flag"
"fmt"
"github.com/aws/aws-sdk-go/aws/session"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/tools/clientcmd/api"
"os"
"path/filepath"
"sigs.k8s.io/aws-iam-authenticator/pkg/token"
)
func AuthenticateToEks(clusterName string, clusterUrl string, roleArn string, session *session.Session) (*kubernetes.Clientset, error) {
clusterApi := &api.Cluster{Server: clusterUrl}
clusters := make(map[string]*api.Cluster)
clusters[clusterName] = clusterApi
c := &api.Config{Clusters: clusters}
g, err := token.NewGenerator(true, false)
if err != nil {
return nil, fmt.Errorf("failed to create iam-authenticator token generator: %v", err)
}
t, err := g.GetWithRoleForSession("eks_test", roleArn, session)
if err != nil {
return nil, fmt.Errorf("failed to get token for eks: %v", err)
}
clientConfig := clientcmd.NewDefaultClientConfig(*c, &clientcmd.ConfigOverrides{Context: api.Context{Cluster: clusterName}, AuthInfo: api.AuthInfo{Token: t.Token}})
config, err := clientConfig.ClientConfig()
if err != nil {
return nil, fmt.Errorf("failed to get client config: %v", err)
}
clientSet, err := kubernetes.NewForConfig(config)
if err != nil {
return nil, fmt.Errorf("failed to generate client set: %v", err)
}
return clientSet, nil
}
func AuthenticateInCluster() (*kubernetes.Clientset, error) {
// creates the in-cluster config
config, err := rest.InClusterConfig()
if err != nil {
return nil, fmt.Errorf("failed to get client config: %v", err)
}
// creates the clientset
clientSet, err := kubernetes.NewForConfig(config)
if err != nil {
return nil, fmt.Errorf("failed to generate client set: %v", err)
}
return clientSet, nil
}
func AuthenticateOutOfCluster() (*kubernetes.Clientset, error) {
var kubeconfig *string
if home := homeDir(); home != "" {
kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
} else {
kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
}
flag.Parse()
// use the current context in kubeconfig
config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
if err != nil {
return nil, fmt.Errorf("failed to get client config: %v", err)
}
// create the clientset
clientSet, err := kubernetes.NewForConfig(config)
if err != nil {
return nil, fmt.Errorf("failed to generate client set: %v", err)
}
return clientSet, nil
}
func homeDir() string {
if h := os.Getenv("HOME"); h != "" {
return h
}
return os.Getenv("USERPROFILE") // windows
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment