为什么分蘖连接到localhost 8080 for kubernetes api?

时间:2017-08-28 08:08:19

标签: kubernetes kubernetes-helm

在使用helm进行kubernetes包管理后,安装了helm客户端后,

helm init

我可以看到tiller pod正在kubernetes集群上运行,然后当我运行helm ls时,它会出错:

Error: Get http://localhost:8080/api/v1/namespaces/kube-system/configmaps?labe 
lSelector=OWNER%3DTILLER: dial tcp 127.0.0.1:8080: getsockopt: connection 
refused

并使用kubectl logs我可以看到类似的消息:

[storage/driver] 2017/08/28 08:08:48 list: failed to list: Get 
http://localhost:8080/api/v1/namespaces/kube-system/configmaps?
labelSelector=OWNER%3DTILLER: dial tcp 127.0.0.1:8080: getsockopt: connection 
refused

我可以看到tiller pod在其中一个节点而不是master上运行,该节点上没有运行api服务器,为什么它连接到127.0.0.1而不是我的主ip?

3 个答案:

答案 0 :(得分:1)

自从在我的工作站上几周以来,我就遇到了这个问题,并且所提供的答案(此处或 Github 中)都没有对我有用。

它的作用是这样的:

sudo kubectl proxy --kubeconfig ~/.kube/config --port 80

请注意,我使用的是 80 端口,因此我需要使用 sudo 才能在那里绑定代理,但如果您使用的是 8080,则不需要。

请注意这一点,因为上述命令指向的 kubeconfig 文件位于 /root/.kube/config 中,而不是通常的 $HOME 中。您可以使用绝对路径来指向要使用的配置,也可以在 root 的主目录中创建一个(或使用此 sudo 标志来保留原始 HOME env var --preserve-env=HOME)。

现在,如果您单独使用 helm,我想就是这样。为了让我的设置正常工作,当我通过 GKE 上的 Terraform 提供程序使用 Helm 时,调试起来很麻烦,因为我收到的消息甚至没有提到 Helm,它在计划时由 Terraform 返回。对于可能处于类似情况的任何人:

在任何具有 Helm 版本的集群中在 Terraform 中执行计划/应用操作时的错误:

Error: error installing: Post "http://localhost/apis/apps/v1/namespaces/kube-system/deployments": dial tcp [::1]:80: connect: connection refused
Error: Get "http://localhost/api/v1/namespaces/system/secrets/apigee-secrets": dial tcp [::1]:80: connect: connection refused

集群中每个 helm 版本的这些错误之一或类似的错误。在这种情况下,对于 GKE 集群,我必须确保环境变量 GOOGLE_APPLICATION_CREDENTIALS 指向具有有效凭据的密钥文件(application-default,除非您没有使用应用程序身份验证的默认设置):

  gcloud auth application-default login 
  export GOOGLE_APPLICATION_CREDENTIALS=/home/$USER/.config/gcloud/application_default_credentials.json

有了 kube 代理和正确的凭据,我可以像往常一样再次使用 Terraform(和 Helm)。我希望这对任何遇到这种情况的人都有帮助。

答案 1 :(得分:0)

首先删除分蘖部署并停止分蘖服务。通过命令运行

kubectl delete deployment tiller-deploy --namespace=kube-system
kubectl delete service tiller-deploy --namespace=kube-system
rm -rf $HOME/.helm/

默认情况下,helm init将Tiller pod安装到kube-system命名空间,Tiller配置为使用默认服务帐户。 使用以下命令为Tiller配置集群管理员访问权限:

kubectl create clusterrolebinding tiller-cluster-admin \
    --clusterrole=cluster-admin \
    --serviceaccount=kube-system:default

然后使用以下命令安装helm server(Tiller):

helm init

答案 2 :(得分:0)

在执行helm init之前运行此命令。它对我有用。

kubectl config view --raw > ~/.kube/config
相关问题