【问题标题】:Remote Access to Kubernetes API Without the Proxy无需代理即可远程访问 Kubernetes API
【发布时间】:2016-07-31 01:51:53
【问题描述】:

我正在尝试获得对 Kubernetes API 的远程访问(主要从我们的 Jenkins 服务器),以便我们可以执行 RESTful 操作而不依赖于 kubectl。理想情况下,我想在 Go 或 Python 中执行此操作,但我尝试过的库都没有成功,并且使用 urllib2 直接返回各种错误。我已经能够通过 curl 进行连接(尽管也有一些奇怪的错误),但我希望不必为所有这些形成 curl GET/PUT 请求。

所以我的问题是:某个善良的灵魂(可能是来自 Google 的人?)能否概述我需要从远程位置正确验证 Kubernetes API 服务器的步骤?非常感谢任何指导,因为我有兴趣了解有关 x509 的更多信息,但我正在努力将所有部分联系在一起。

基本有效的卷曲结构

这些 .pem 文件是根据 ~/.kube/config 中的值手动创建的

$ curl --header "Authorization: Bearer $TOKEN" -key key.pem -cacert ca.pem -cert client.pem https://MASTER_IP/api
curl: (6) Could not resolve host: key.pem
curl: (6) Could not resolve host: ca.pem
curl: (6) Could not resolve host: client.pem
{
  "kind": "APIVersions",
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "172.20.0.9:443"
    }
  ]
}

2016 年 4 月 14 日更新 所以看来我需要将其中一些重命名为 .crt 文件。在阅读了 curl 的潜在问题后,我尝试了一下 wget,它似乎没有问题,甚至没有指定 auth 标头。感谢您对基于客户端的身份验证的任何见解。

$ wget -qO- https://MASTER_IP/api --certificate client-decoded.crt --private-key clean-key.pem --ca-certificate ca.crt
{
  "kind": "APIVersions",
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "172.20.0.9:443"
    }
  ]
}

【问题讨论】:

  • 您在 --key、--cacert 和 --cert 参数上缺少破折号,并且可能还需要将证书指定为 ./client.pem

标签: python x509certificate kubernetes client-certificates


【解决方案1】:

查看支持的客户端库 (https://github.com/kubernetes/kubernetes/blob/release-1.2/docs/devel/client-libraries.md)。

要连接官方的 Go 客户端,这样的东西应该可以工作,你可以很容易地传入一个 kubeCfgFile,然后客户端将使用它来连接:

func newKubeClient() (*kclient.Client, error) {
    var (
        config    *kclient.Config
        err       error
        masterURL string
    )

    if *argKubeMasterURL != "" {
        masterURL, err = expandKubeMasterURL()

        if err != nil {
            return nil, err
        }
    }

    if masterURL != "" && *argKubecfgFile == "" {
        config = &kclient.Config{
            Host:    masterURL,
            Version: "v1",
        }
    } else {
        overrides := &kclientcmd.ConfigOverrides{}
        overrides.ClusterInfo.Server = masterURL
        rules := &kclientcmd.ClientConfigLoadingRules{ExplicitPath: *argKubecfgFile}
        if config, err = kclientcmd.NewNonInteractiveDeferredLoadingClientConfig(rules, overrides).ClientConfig(); err != nil {
            return nil, err
        }
    }

    glog.Infof("Using %s for kubernetes master", config.Host)
    glog.Infof("Using kubernetes API %s", config.Version)
    return kclient.New(config)
}

【讨论】:

    猜你喜欢
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多