【问题标题】:Why tiller connect to localhost 8080 for kubernetes api?为什么分蘖连接到 localhost 8080 的 kubernetes api?
【发布时间】:2018-02-05 10:52:30
【问题描述】:

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

之后

helm init

我可以看到tiller pods在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而不是我的master ip?

【问题讨论】:

    标签: kubernetes kubernetes-helm


    【解决方案1】:

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

    kubectl config view --raw > ~/.kube/config
    

    【讨论】:

    • 我得到这个错误 -sh: 45: cannot create /home/smartdev/.kube/config: Directory nonexistent
    • @JeffreyNyauke 可能是,您以另一个用户(root?)的身份安装了您的 k8s-deployment。否则就做mkdir /home/smartdev/.kube
    【解决方案2】:

    首先删除tiller部署并停止tiller服务。通过运行以下命令,

    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
    

    【讨论】:

    • 您的回答并不能解决问题。 Tiller 仍然尝试与 localhost 连接。
    • 这解决了我在没有rm -rf $HOMEE/.helm/ 的情况下尝试在安装了本地 kubernetes 的 Windows 的 Docker 上连接 helm 的问题。
    【解决方案3】:

    所以我在工作站上几周后就遇到了这个问题,并且提供的答案(这里或 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 集群,我必须确保 env var 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)。我希望这对遇到这种情况的人有所帮助。

    【讨论】:

      猜你喜欢
      • 2019-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-08
      • 2020-06-18
      • 2018-01-27
      • 2014-11-22
      相关资源
      最近更新 更多