我一直在尝试为远程客户端的HTTP REST API服务器访问启用令牌身份验证。
我使用以下脚本安装了我的CoreOS / K8S群集控制器:https://github.com/coreos/coreos-kubernetes/blob/master/multi-node/generic/controller-install.sh
我的群集工作正常。这是一个TLS安装,所以我需要配置任何具有客户端证书的kubectl客户端来访问集群。
然后我尝试通过运行启用令牌身份验证:
echo `dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64 | tr -d "=+/" | dd bs=32 count=1 2>/dev/null`
这给了我一个代币。然后我将令牌添加到我的控制器上包含令牌和默认用户的令牌文件中:
$> cat /etc/kubernetes/token
3XQ8W6IAourkXOLH2yfpbGFXftbH0vn,default,default
然后我修改了/etc/kubernetes/manifests/kube-apiserver.yaml来添加:
- --token-auth-file=/etc/kubernetes/token
到启动参数列表
然后我重新启动(不确定自行重启API服务器的最佳方法?)
此时,来自远程服务器的kubectl退出工作(不会连接)。然后我查看控制器上的docker ps
并查看api服务器。我运行docker logs container_id
并且没有输出。如果我查看其他docker容器,我会看到输出:
E0327 20:05:46.657679 1 reflector.go:188]
pkg/proxy/config/api.go:33: Failed to list *api.Endpoints:
Get http://127.0.0.1:8080/api/v1/endpoints?resourceVersion=0:
dial tcp 127.0.0.1:8080: getsockopt: connection refused
所以看来我的api-server.yaml配置它会阻止API服务器正常启动....
有关为承载令牌REST身份验证配置API服务器的正确方法的任何建议吗?
可以同时配置TLS配置和Bearer Token Auth,对吗?
谢谢!
答案 0 :(得分:2)
我认为你的kube-apiserver会死,因为它无法找到/etc/kubernetes/token
。这是因为在您的部署中,apiserver是一个静态pod,因此在容器中运行,这反过来意味着它具有与主机不同的根文件系统。
查看/etc/kubernetes/manifests/kube-apiserver.yaml
并添加volume
和volumeMount
这样的内容(我省略了不需要更改的行,并且无法帮助您找到正确的部分):
kind: Pod
metadata:
name: kube-apiserver
spec:
containers:
- name: kube-apiserver
command:
- ...
- --token-auth-file=/etc/kubernetes/token
volumeMounts:
- mountPath: /etc/kubernetes/token
name: token-kubernetes
readOnly: true
volumes:
- hostPath:
path: /etc/kubernetes/token
name: token-kubernetes
还有一个注意事项:您引用为token
的文件应该不以.
(点)结尾 - 也许这只是一个复制粘贴错误但无论如何都要检查。格式记录在static token file:
令牌,用户,UID,"组1,组2,组3"
如果您的问题持续执行以下命令并发布输出:
journalctl -u kubelet | grep kube-apiserver