【问题标题】:Not able to access kubernetes api from inside a pod container无法从 pod 容器内访问 kubernetes api
【发布时间】:2020-04-12 00:01:10
【问题描述】:

我创建了一个 hashcorp vault 部署并配置了 kubernetes 身份验证。 vault 容器从 pod 内部调用 kubernetes api 来进行 k8s 身份验证,该调用失败并显示 500 错误代码(连接被拒绝)。我正在为 windows kubernetes 使用 docker。

我将以下配置添加到 Kubernetes 身份验证机制的保管库中。

payload.json

{
    "kubernetes_host": "http://kubernetes",
    "kubernetes_ca_cert": <k8s service account token>
}
curl --header "X-Vault-Token: <vault root token>" --request POST --data @payload.json http://127.0.0.1:8200/v1/auth/kubernetes/config

我收到了预期的 204 响应。

我为 kubernetes 身份验证创建了一个角色,我尝试使用它登录到 vault:

payload2.json

{
    "role": "tanmoy-role",
    "jwt": "<k8s service account token>"
}
curl --request POST --data @payload2.json http://127.0.0.1:8200/v1/auth/kubernetes/login

上面的 curl 给出以下响应:

{"errors":["Post http://kubernetes/apis/authentication.k8s.io/v1/tokenreviews: dial tcp 10.96.0.1:80: connect: connection denied"]}

以下是我的 kubernetes 服务启动并正常运行,我还可以使用代理访问 kubernetes 仪表板。

NAME            TYPE           CLUSTER-IP      EXTERNAL-IP              PORT(S)                         AGE
kubernetes      ClusterIP      10.96.0.1       <none>                   443/TCP                         13d

我无法弄清楚为什么无法从容器内部访问“kubernetes”服务。任何帮助将不胜感激。

编辑 1. 我的保管库 pod 和服务工作正常:

服务

NAME            TYPE           CLUSTER-IP      EXTERNAL-IP              PORT(S)                         AGE
vault-elb-int   LoadBalancer   10.104.197.76   localhost,192.168.0.10   8200:31650/TCP,8201:31206/TCP   26h

吊舱

NAME                     READY   STATUS    RESTARTS   AGE
vault-84c65db6c9-pj6zw   1/1     Running   0          21h

编辑 2. 正如约翰建议的那样,我将 payload.json 中的“kubernetes_host”更改为“https://kubernetes”。但是现在我收到了这个错误:

{"errors":["Post https://kubernetes/apis/authentication.k8s.io/v1/tokenreviews: x509: certificate signed by unknown authority"]}

【问题讨论】:

  • 能否请您发布与此问题相关的服务列表和 pod 列表?
  • 嗨@Ajay,我添加了垫和服务列表。请注意,这些工作正常,没有任何问题。

标签: docker kubernetes docker-for-windows hashicorp-vault kubernetes-pod


【解决方案1】:

我终于弄清楚出了什么问题:

我的 payload.json 内容错误

应该是这样的:

{
      "kubernetes_host": "https://kubernetes",
      "kubernetes_ca_cert": <kubectl exec to vault pod and cat  /var/run/secrets/kubernetes.io/serviceaccount/ca.crt, now make the cert one line by following this answer: https://stackoverflow.com/a/14580203/2054147>
}

现在下面的端点工作正常并返回所需的 client_token

curl --request POST --data @payload2.json http://127.0.0.1:8200/v1/auth/kubernetes/login

感谢 @John 帮助我找出 kubernetes_host 的初始问题。

【讨论】:

    【解决方案2】:

    您的登录请求正在发送到端口 80 上的 tokenreview 端点。我认为这是因为您的 kubernetes_host 指定了 http URL。 500 响应是因为它没有在端口 80 上侦听,而是在 443 上侦听(正如您在服务列表输出中看到的那样)。

    配置auth的时候尝试改成https,即

    payload.json
    
    {
        "kubernetes_host": "https://kubernetes",
        "kubernetes_ca_cert": <k8s service account token>
    }
    

    【讨论】:

    • 嗨@John,我将 http 更改为 https,但现在我收到了带有 500 错误代码的错误消息:{"errors":["Post kubernetes/apis/authentication.k8s.io/v1/tokenreviews: x509: certificate signed by unknown authority" ]}
    • 使用curl时,传入-k或长格式--insecure以使curl信任自签名证书。
    • 嗨 @gears 我添加了 --insecure 但它仍然失败,因为失败的 https 端点在内部被调用。我没有直接调用该端点,因此我无法将 --insecure 传递给该调用。
    • @tanmoy 这是一个完全独立的错误,是由于您的 Vault 容器不信任 Kubernetes 用于提供 HTTPS 端点的证书。您需要将用于签署 Kubernetes 证书的 CA 证书添加到 Vault,以便 Vault 信任 Kubernetes。有关如何执行此操作的详细信息,请参阅here。如果您遇到困难,请关闭此问题并创建另一个问题,我们可以在那里为您提供帮助。
    • 嗨@John,我已经为您在上面共享的链接中提供的类似方式配置了K8s auth for vault。正如你所说,我正在结束这个问题,并针对这个特定问题提出了另一个问题。请看stackoverflow.com/q/59456946/2054147
    猜你喜欢
    • 2019-05-08
    • 2018-05-07
    • 2016-07-30
    • 2023-04-07
    • 2020-09-10
    • 2020-07-20
    • 2020-07-06
    • 1970-01-01
    相关资源
    最近更新 更多