Kubernetes:如何启用 API Server Bearer Token Auth?
Kubernetes: how to enable API Server Bearer Token Auth?
我一直在尝试为 HTTP REST API 从远程客户端访问服务器启用令牌身份验证。
我使用此脚本安装了 CoreOS/K8S 集群控制器:https://github.com/coreos/coreos-kubernetes/blob/master/multi-node/generic/controller-install.sh
我的集群工作正常。这是 TLS 安装,因此我需要使用客户端证书配置任何 kubectl 客户端以访问集群。
然后我尝试通过 运行ning 启用令牌身份验证:
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 服务器正常启动....
关于正确配置API不记名令牌 REST 身份验证服务器的任何建议?
可以同时配置 TLS 和 Bearer Token Auth,对吗?
谢谢!
我认为您的 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:
下
token,user,uid,"group1,group2,group3"
如果您的问题仍然存在,请执行以下命令并 post 输出:
journalctl -u kubelet | grep kube-apiserver
我一直在尝试为 HTTP REST API 从远程客户端访问服务器启用令牌身份验证。
我使用此脚本安装了 CoreOS/K8S 集群控制器:https://github.com/coreos/coreos-kubernetes/blob/master/multi-node/generic/controller-install.sh
我的集群工作正常。这是 TLS 安装,因此我需要使用客户端证书配置任何 kubectl 客户端以访问集群。
然后我尝试通过 运行ning 启用令牌身份验证:
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 服务器正常启动....
关于正确配置API不记名令牌 REST 身份验证服务器的任何建议?
可以同时配置 TLS 和 Bearer Token Auth,对吗?
谢谢!
我认为您的 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:
token,user,uid,"group1,group2,group3"
如果您的问题仍然存在,请执行以下命令并 post 输出:
journalctl -u kubelet | grep kube-apiserver