我正在尝试使用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 logs
或exec
命令)都失败了:
$ 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)
答案 0 :(得分:1)
当要求API服务器调用需要从API服务器到kubelet的通信时,使用API服务器的客户端凭据进行通信,该凭证仅支持对kubelet进行x509身份验证。
https://kubernetes.io/docs/admin/kubelet-authentication-authorization/
的“X509客户端证书身份验证”部分列出了用于向API服务器提供用于联系kubelet的凭据的标志。API服务器webhook身份验证选项与kubelet身份验证无关。