启用kubelet服务器承载令牌身份验证

时间:2017-06-30 22:33:18

标签: kubernetes

问题

我正在尝试使用Bearer Tokens( X.509客户端证书身份验证)在我的kubelet服务器上启用身份验证,并且无法理解工作流程。

我尝试了什么

根据文档页面Kubelet authentication/authorization,启动带有--authentication-token-webhook标志的kubelet可启用承载令牌身份验证。我可以通过使用Controller Manager创建的default个秘密之一向kubelet REST API发送请求来确认:

$ MY_TOKEN="$(kubectl get secret default-token-kw7mk \
      -o jsonpath='{$.data.token}' | base64 -d)"

$ curl -sS -o /dev/null -D - \
      --cacert /var/run/kubernetes/kubelet.crt \
      -H "Authorization : Bearer $MY_TOKEN" \
      https://host-192-168-0-10:10250/pods/

HTTP/1.1 200 OK
Content-Type: application/json
Date: Fri, 30 Jun 2017 22:12:29 GMT
Transfer-Encoding: chunked

然而,使用与上述相同的承载令牌与kubelet 通过API服务器进行的任何通信(通常使用kubectl logsexec命令)都失败了:

$ kubectl --token="$MY_TOKEN" -n kube-system logs \
      kube-dns-2272871451-sc02r -c kubedns

error: You must be logged in to the server (the server has asked for the client to provide credentials ( pods/log kube-dns-2272871451-sc02r))

我需要澄清的地方

我最初的假设是,API服务器只是将它从客户端收到的Bearer Token直接传递给了kubelet,但我上面的小实验证明了这一点。

我看到kube-apiserver文档提到了一个名为--authentication-token-webhook-config-file的标记,但我不确定如何使用它,或者它是否与针对kubelet验证API服务器相关。

当前配置

我的小册子以:

运行
  --anonymous-auth=false
  --authorization-mode=Webhook
  --authentication-token-webhook
  --cadvisor-port=0
  --cluster-dns=10.0.0.10
  --cluster-domain=cluster.local
  --read-only-port=0
  --kubeconfig=/etc/kubernetes/kubeconfig-kubelet
  --pod-manifest-path=/etc/kubernetes/manifests
  --require-kubeconfig

我的API服务器运行:

  --admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,ResourceQuota,DefaultTolerationSeconds
  --anonymous-auth=false
  --authorization-mode=AlwaysAllow
  (+ tls flags)

1 个答案:

答案 0 :(得分:1)

当要求API服务器调用需要从API服务器到kubelet的通信时,使用API​​服务器的客户端凭据进行通信,该凭证仅支持对kubelet进行x509身份验证。

https://kubernetes.io/docs/admin/kubelet-authentication-authorization/

的“X509客户端证书身份验证”部分列出了用于向API服务器提供用于联系kubelet的凭据的标志。

API服务器webhook身份验证选项与kubelet身份验证无关。