无法从Pod容器内部访问Kubernetes API

时间:2019-12-19 11:30:00

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

我已经创建了hashicorp保管库部署并配置了kubernetes auth。保管库容器从Pod内部调用kubernetes api进行k8s身份验证,并且该调用失败,并显示500个错误代码(连接被拒绝)。我正在将docker用于Windows kubernetes。

我将以下配置添加到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 auth创建了一个角色,尝试通过该角色登录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

上面的卷曲给出以下响应:

  

{“错误”:[“帖子http://kubernetes/apis/authentication.k8s.io/v1/tokenreviews:拨打TCP 10.96.0.1:80:连接:连接被拒绝”]}

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

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

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

编辑1。我的保管箱和服务运行正常:

服务

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"]}

2 个答案:

答案 0 :(得分:1)

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

在配置身份验证时尝试更改为https,即

payload.json

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

答案 1 :(得分:0)

最后,我弄清楚出了什么问题:

我的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的最初问题。