我正在尝试远程访问Kubernetes API(主要来自我们的Jenkins服务器),因此我们可以执行RESTful操作而不依赖kubectl
。理想情况下,我想在Go或Python中执行此操作,但我尝试过的库都没有成功,并且使用urllib2
直接返回各种错误。我已经能够通过curl连接(虽然也有一些奇怪的错误),但我希望不必为所有这些形成curl GET / PUT请求。
所以我的问题是:某种灵魂(也许是谷歌的某些人?)概述了从远程位置使用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文件。在阅读了卷曲的潜在问题后,我给了wget一个go,它似乎没有问题,甚至没有指定一个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"
}
]
}
答案 0 :(得分:0)
查看支持的客户端库(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)
}