Kubernetes – 如何在容器中运行kubectl命令?

在一个容器内的容器中,我怎样才能使用kubectl运行一个命令? 例如,如果我需要在容器中做这样的事情:

kubectl得到豆荚

我试过这个:在我的dockerfile中,我有这些命令:

RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl RUN chmod +x ./kubectl RUN sudo mv ./kubectl /usr/local/bin/kubectl 

编辑:我正在尝试OSX文件,我已经纠正它到Linux二进制文件。 (由@svenwltr纠正

在创builddocker文件时,这是成功的,但是当我运行kubectl时,

 kubectl get pods 

我得到这个错误:

连接到服务器:被拒绝 – 你指定了正确的主机或端口?

当我在本地进行部署时,如果我的docker-machine没有运行,但是在一个容器内,docker-machine如何运行,我遇到了这个错误?

在本地,我通过运行以下命令来解决这个错误:(dev是docker-machine的名字)

 docker-machine env dev eval $(docker-machine env dev) 

有人可以告诉我,我需要做什么?

我会使用kubernetes API,你只需要安装curl,而不是kubectl ,其余的是安宁的。

 curl http://localhost:8080/api/v1/namespaces/default/pods 

我在我的一个apiservers上面运行命令。 将localhost更改为apiserver ip地址/ dns名称

根据您的configuration,您可能需要使用ssl或提供客户端证书。

为了findapi端点,可以使用--v=8kubectl

例:

 kubectl get pods --v=8 

资源:

Kubernetes API文档

第一个问题

/usr/local/bin/kubectl: cannot execute binary file

它看起来像你下载kubectl的OSX二进制kubectl 。 在Docker中运行时,您可能需要Linux版本:

 https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl 

第二个问题

如果您在适当configuration的Kubernetes集群中运行kubectl ,它应该能够连接到apiserver。

kubectl基本上使用这个代码来findapiserver并进行身份validation: github.com/kubernetes/client-go/rest.InClusterConfig

意即:

  • apiserver的主机和端口存储在环境variablesKUBERNETES_SERVICE_HOSTKUBERNETES_SERVICE_PORT
  • 访问令牌安装到var/run/secrets/kubernetes.io/serviceaccount/token
  • 服务器证书安装到/var/run/secrets/kubernetes.io/serviceaccount/ca.crt

这是所有数据kubectl需要知道连接到apiserver。

一些想法,为什么这可能无法正常工作:

  • 容器不在Kubernetes中运行。
    • 使用相同的Docker主机是不够的。 容器需要作为一个pod定义的一部分运行。
  • 访问受限于使用授权插件 (这不是默认设置)。
  • 服务帐户凭据由pod定义 ( spec.serviceAccountName )覆盖。