如何使用curl从pod中访问Kubernetes API?

时间:2018-01-17 23:30:12

标签: curl kubernetes google-cloud-platform google-kubernetes-engine

我在Google Kubernetes引擎上使用Kubernetes 1.8.6,并且在StatefulSet中有一个运行Alpine的pod。

我已使用kubectl exec -it my-pod-0 -- /bin/sh登录我的pod,然后在提示符处运行以下命令:

$ CA_CERT=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
$ TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
$ NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)
$ curl --cacert $CA_CERT -H "Authorization: Bearer $TOKEN" "https://kubernetes
/api/v1/namespaces/$NAMESPACE/services/"

不幸的是,返回了403 Forbidden错误:

{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {

  },
  "status": "Failure",
  "message": "services is forbidden: User \"system:serviceaccount:default:default\" cannot list services in the namespace \"default\": Unknown user \"system:serviceaccount:default:default\"",
  "reason": "Forbidden",
  "details": {
    "kind": "services"
  },
  "code": 403

我做错了什么?

1 个答案:

答案 0 :(得分:7)

你没有做错任何事。该pod的服务帐户(在pod的serviceAccountName中指定)根本没有任何API权限。

您可以向该服务帐户授予视图角色,如下所示:

kubectl create rolebinding default-viewer \
  --clusterrole=view \
  --serviceaccount=default:default \
  --namespace=default

有关向服务帐户授予权限的详细信息,请参阅https://kubernetes.io/docs/admin/authorization/rbac/#service-account-permissions