【问题标题】:Kubernetes API Access from Pod从 Pod 访问 Kubernetes API
【发布时间】:2018-05-07 22:02:33
【问题描述】:

我正在尝试访问 Kubernetes API,以便从已部署的容器中发现 pod。虽然我将以编程方式执行此操作,但现在我只是使用 cURL 来检查问题。

我从 pod 终端运行它:

curl -vvv -H "Authorization: Bearer $(</var/run/secrets/kubernetes.io/serviceaccount/token)" "https://kubernetes.default/api/v1/namespaces/$(</var/run/secrets/kubernetes.io/serviceaccount/namespace)/endpoints" --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt

我得到一个 403 结果:

* About to connect() to kubernetes.default port 443 (#0)
*   Trying 172.30.0.1...
* Connected to kubernetes.default (172.30.0.1) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
  CApath: none
* NSS: client certificate not found (nickname not specified)
* SSL connection using TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
* Server certificate:
*       subject: CN=10.0.75.2
*       start date: Nov 23 16:55:27 2017 GMT
*       expire date: Nov 23 16:55:28 2019 GMT
*       common name: 10.0.75.2
*       issuer: CN=openshift-signer@1511456125
> GET /api/v1/namespaces/myproject/endpoints HTTP/1.1                                                                                            s/$(</var/run/secrets/kubernetes.io/serv
> User-Agent: curl/7.29.0
> Host: kubernetes.default
> Accept: */*> Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJteXByb2plY3QiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlY3JldC5uYW1lIjoiZGVmYXVsdC10b2tlbi00cXZidCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMjg3NzAzYjEtZDA4OC0xMWU3LTkzZjQtNmEyNGZhYWZjYzQxIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Om15cHJvamVjdDpkZWZhdWx0In0.yl2HUhmxjrb4UqkAioq1TixWl_YqUPoxSvQPPSgl9Hzr97Hjm7icdL_mdptwEnOSErfzqSUBiMKJcIRdIa3Z7mfkgEk-f2H-M7TUU8GpXmD2Zex6Bcn_dq-Hsoed6W2PYpeFDoy98p5rSNTUL5MPMATOodeAulB0NG_zF01-8qTbLO_I6FRa3BCVXVMaZWBoZgwZ1acQbd4fJqDRsYmQMSi5P8a3nYgjBdifkQeTTb3S8Kmnszct41LoUlh9Xv29YVEyr1uQc5DSLAgQKj_NdSxkVq-MJP8z1PWV3OmHULNChocXr7RGKaNwlVpwpgNqsDAOqIyE1ozxlntIrotLBw
>
< HTTP/1.1 403 Forbidden
< Cache-Control: no-store
< Content-Type: application/json
< Date: Thu, 23 Nov 2017 22:18:01 GMT
< Content-Length: 282
<
{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {},
  "status": "Failure",
  "message": "User \"system:serviceaccount:myproject:default\" cannot list endpoints in project \"myproject\"",
  "reason": "Forbidden",
  "details": {
    "kind": "endpoints"
  },
  "code": 403
}
* Connection #0 to host kubernetes.default left intact

我尝试访问许多资源,例如端点、pod 等。我也省略了命名空间(以访问整个集群资源),但无济于事。

我目前正在使用干净的 OpenShift Origin(刚刚运行 oc cluster up 并部署了一个测试映像以访问 Web 控制台中的终端)。

【问题讨论】:

  • 嘿@MartinBroadhurst,问题非常相似,但是,我没有错过身份验证标头。我的猜测是某些配置阻止我(禁止)访问该资源。

标签: kubernetes openshift


【解决方案1】:

您似乎在完全启用 RBAC 的集群上,并且您的默认服务帐户 system:serviceaccount:myproject:default 如预期的那样未经授权。您应该为此 pod 创建和使用专用服务帐户,并明确授予它访问它需要读取的内容的权限。

https://kubernetes.io/docs/admin/authorization/rbac/

【讨论】:

  • 您仍然可以为项目使用default 服务帐户,除非真的必须,否则不需要使用单独的服务帐户。要允许在默认服务帐户下运行的应用程序对 OpenShift 中的 REST API 进行只读访问,请在您要应用它的项目是当前项目时运行 oc policy add-role-to-user view -z default
  • @GrahamDumpleton 你可以,但你不应该这样做。这是最小特权规则。为什么要授予命名空间中的每个 pod(因此使用默认 sa)访问 kube API 的权限?
  • 如果要正确分离事物,您就不会将所有应用程序都放在一个项目中。您可以将事物分成不同的项目,如果它们需要相互通信,则有选择地打开 pod 网络以允许它。归根结底,做事的方法有很多种,这实际上取决于应用程序和您喜欢做什么。所以是的,您可以使用服务帐户,但作为第一步,更容易应用对default 的访问以使其运行。然后可以制定额外的步骤来创建单独的服务帐户并让 pod 使用它。
  • 嘿伙计们,我以为是这样的,但希望是别的。我试试看。
  • @GrahamDumpleton,因为我使用的是 OpenShift,你是对的。我可以授予默认用户对整个命名空间的访问权限,这只是一个应用程序(我希望默认用户具有这种访问权限)。您能否创建一个答案以便我接受?
【解决方案2】:

在 curl 命令中传递一个授权令牌持有者。没有它,它预计是未经授权的。

更多信息:kubernetes documentation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-08
    • 2018-12-08
    • 1970-01-01
    • 2020-04-12
    • 2018-06-26
    • 2016-07-21
    • 2019-05-02
    相关资源
    最近更新 更多