当前位置: 首页 > 知识库问答 >
问题:

使用K8S API访问pod[已关闭]

沈弘盛
2023-03-14
kubectl exec -ti POD_NAME -- pwd
package main

import (
    "bytes"
    "context"
    "flag"
    "fmt"
    "path/filepath"

    corev1 "k8s.io/api/core/v1"
    _ "k8s.io/apimachinery/pkg/api/errors"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/apimachinery/pkg/runtime"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
    "k8s.io/client-go/tools/remotecommand"
    "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())
    }

    namespace := "stage"
    pods, err := clientset.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{})
    if err != nil {
        panic(err.Error())
    }
    fmt.Printf("There are %d pods in the cluster\n", len(pods.Items))

    podName := "ubs-job-qa-0"
    containerName := "ubs-job"

    // https://github.com/kubernetes/kubernetes/blob/release-1.22/test/e2e/framework/exec_util.go
    // https://zhimin-wen.medium.com/programing-exec-into-a-pod-5f2a70bd93bb
    req := clientset.CoreV1().
        RESTClient().
        Post().
        Resource("pods").
        Name(podName).
        Namespace(namespace).
        SubResource("exec").
        Param("container", containerName)

    scheme := runtime.NewScheme()
    if err := corev1.AddToScheme(scheme); err != nil {
        panic("Cannot add scheme")
    }

    parameterCodec := runtime.NewParameterCodec(scheme)
    req.VersionedParams(&corev1.PodExecOptions{
        Stdin:     false,
        Stdout:    true,
        Stderr:    true,
        TTY:       true,
        Container: podName,
        Command:   []string{"ls", "-la", "--time-style=iso", "."},
    }, parameterCodec)

    exec, err := remotecommand.NewSPDYExecutor(config, "POST", req.URL())
    if err != nil {
        panic(err)
    }

    var stdout, stderr bytes.Buffer
    err = exec.Stream(remotecommand.StreamOptions{
        Stdin:  nil,
        Stdout: &stdout,
        Stderr: &stderr,
    })
    if err != nil {
        panic(err)
    }

    text := string(stdout.Bytes())
    fmt.Println(text)
}

共有1个答案

朱和惬
2023-03-14

在您的示例中,使用kubectl与调用API-Server相同;然后调用节点上的kubelet,并在pod命名空间中执行命令。

你可以这样做实验:

kubectl proxy --port=8080 &

curl "localhost:8080/api/v1/namespaces/<namespace>/pods/<pod>/exec?command=pwd&stdin=false"

要复制文件,可以使用:Kubectl cp--help

 类似资料:
  • 当我的吊舱试图查询任何kubeletendpoint(任何端口)时,它们立即得到一个。 编辑:以上情况发生在任何端口上,而不仅仅是4194 ServiceMonitor:

  • 16.4. 关联已访问列表 你对使用 列表遍历 将列表关联起来的做法已经熟知。 另一种方法可以完成同样的工作:使用内建 map 函数。 它的工作机理和 filter 函数类似。 例 16.10. 介绍 map >>> def double(n): ... return n*2 ... >>> li = [1, 2, 3, 5, 9, 10, 256, -3] >>> map(d

  • 我试图访问kubernetes集群中的pod的日志,但在发送以下rest请求时获得: 获取api/名称空间/myNamespace/pods/myPod/log 当我试图查看pod的状态时,我得到以下信息: 为什么我拿不到日志?

  • 前面几节讲到如何访问kubneretes集群,本文主要讲解访问kubenretes中的Pod和Serivce的几种方式,包括如下几种: hostNetwork hostPort NodePort LoadBalancer Ingress 说是暴露Pod其实跟暴露Service是一回事,因为Pod就是Service的backend。 hostNetwork: true 这是一种直接定义Pod网络的方

  • 参考:https://www.w3schools.com/tags/ref_urlencode.asp

  • 问题内容: 我正在寻找一种在Java App(使用JDBC)中打开Access MDB文件的方法。 快速的Google搜索建议我为此需要JDBC-ODBC Bridge。 这是否意味着我需要配置要在其上运行应用程序的每个系统,以便为要打开的MDB提供ODBC DSN? 还有一个问题(因为我以前从未使用过ODBC):通信是通过某种套接字(以客户机/服务器方式)还是通过方法/函数调用(例如嵌入Derb