美文网首页Kubernetes
client-go认证方式

client-go认证方式

作者: 王勇1024 | 来源:发表于2023-01-04 15:20 被阅读0次

    直观上看,用户可以使用kubectl、客户端库或者REST请求来访问K8S API。而实际上,无论是kubectl还是客户端库,都是封装了REST请求的工具。client-go作为一个客户端库,能够调用K8S API,实现对K8S集群中资源对象(包括deployment、service、ingress、replicaSet、pod、namespace、node等)的增删改查等操作。
    源码地址:kubernetes/client-go
    接口文档:kubernetes - GoDoc

    kubeconfig

    示例

    package main
    
    import (
        "context"
        "flag"
        "fmt"
        "path/filepath"
        "time"
    
        "k8s.io/apimachinery/pkg/api/errors"
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
        "k8s.io/client-go/kubernetes"
        "k8s.io/client-go/tools/clientcmd"
        "k8s.io/client-go/util/homedir"
        //
        // Uncomment to load all auth plugins
        // _ "k8s.io/client-go/plugin/pkg/client/auth"
        //
        // Or uncomment to load specific auth plugins
        // _ "k8s.io/client-go/plugin/pkg/client/auth/azure"
        // _ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
        // _ "k8s.io/client-go/plugin/pkg/client/auth/oidc"
        // _ "k8s.io/client-go/plugin/pkg/client/auth/openstack"
    )
    
    func main() {
        var kubeconfig *string
        if home := homedir.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 {
            panic(err.Error())
        }
    
        // create the clientset
        clientset, err := kubernetes.NewForConfig(config)
        if err != nil {
            panic(err.Error())
        }
        for {
            pods, err := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{})
            if err != nil {
                panic(err.Error())
            }
            fmt.Printf("There are %d pods in the cluster\n", len(pods.Items))
    
            // Examples for error handling:
            // - Use helper functions like e.g. errors.IsNotFound()
            // - And/or cast to StatusError and use its properties like e.g. ErrStatus.Message
            namespace := "default"
            pod := "example-xxxxx"
            _, err = clientset.CoreV1().Pods(namespace).Get(context.TODO(), pod, metav1.GetOptions{})
            if errors.IsNotFound(err) {
                fmt.Printf("Pod %s in namespace %s not found\n", pod, namespace)
            } else if statusError, isStatus := err.(*errors.StatusError); isStatus {
                fmt.Printf("Error getting pod %s in namespace %s: %v\n",
                    pod, namespace, statusError.ErrStatus.Message)
            } else if err != nil {
                panic(err.Error())
            } else {
                fmt.Printf("Found pod %s in namespace %s\n", pod, namespace)
            }
    
            time.Sleep(10 * time.Second)
        }
    }
    

    InClusterConfig

    示例

    package main
    
    import (
        "context"
        "fmt"
        "time"
    
        "k8s.io/apimachinery/pkg/api/errors"
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
        "k8s.io/client-go/kubernetes"
        "k8s.io/client-go/rest"
        //
        // Uncomment to load all auth plugins
        // _ "k8s.io/client-go/plugin/pkg/client/auth"
        //
        // Or uncomment to load specific auth plugins
        // _ "k8s.io/client-go/plugin/pkg/client/auth/azure"
        // _ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
        // _ "k8s.io/client-go/plugin/pkg/client/auth/oidc"
        // _ "k8s.io/client-go/plugin/pkg/client/auth/openstack"
    )
    
    func main() {
        // creates the in-cluster config
        config, err := rest.InClusterConfig()
        if err != nil {
            panic(err.Error())
        }
        // creates the clientset
        clientset, err := kubernetes.NewForConfig(config)
        if err != nil {
            panic(err.Error())
        }
        for {
            // get pods in all the namespaces by omitting namespace
            // Or specify namespace to get pods in particular namespace
            pods, err := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{})
            if err != nil {
                panic(err.Error())
            }
            fmt.Printf("There are %d pods in the cluster\n", len(pods.Items))
    
            // Examples for error handling:
            // - Use helper functions e.g. errors.IsNotFound()
            // - And/or cast to StatusError and use its properties like e.g. ErrStatus.Message
            _, err = clientset.CoreV1().Pods("default").Get(context.TODO(), "example-xxxxx", metav1.GetOptions{})
            if errors.IsNotFound(err) {
                fmt.Printf("Pod example-xxxxx not found in default namespace\n")
            } else if statusError, isStatus := err.(*errors.StatusError); isStatus {
                fmt.Printf("Error getting pod %v\n", statusError.ErrStatus.Message)
            } else if err != nil {
                panic(err.Error())
            } else {
                fmt.Printf("Found example-xxxxx pod in default namespace\n")
            }
    
            time.Sleep(10 * time.Second)
        }
    }
    

    ServiceAccount

    示例

    为 Pod 配置服务账户

    Using service account tokens to connect with the API server

    client-go库使用token连接Apiserver

    Bear Token

    在请求中放置 Bearer Token

    当使用来自 http 客户端的 bearer token 时,API server 期望 Authorization header 中包含 Bearer token 的值。Bearer token 必须是一个字符串序列,只需使用 HTTP 的编码和引用功能就可以将其放入到 HTTP header 中。例如:如果 bearer token 是 31ada4fd-adec-460c-809a-9e56ceb75269,那么它将出现在 HTTP header 中,如下所示:

    Authorization: Bearer 31ada4fd-adec-460c-809a-9e56ceb75269
    

    相关文章

      网友评论

        本文标题:client-go认证方式

        本文链接:https://www.haomeiwen.com/subject/iogrcdtx.html