通过特定用户从远程服务器访问K8S主服务器



我试图模拟来自外部服务器的基于角色的访问。我的场景是,我想要一个用户"开发人员",他只能访问创建/删除/列出pod,并可以访问持久卷声明。我有一个角色和角色绑定。我已经用测试过了

[root@K8Smaster ~]# kubectl auth can-i create pods --as=developer
yes

所以我知道这部分是有效的。正如您所看到的,它是在K8S主服务器上完成的。

让它在外部服务器上工作I

openssl genrsa -out developer.key 2048
openssl req -new -key developer.key -subj "/CN=developer/O=User" -out developer.csr

(我认为CN和O真的没有任何意义……或者它们必须匹配一些东西吗?,我将CN名称与用户"开发者"匹配(

openssl x509 -req -in developer.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out developer.crt

我将ca.cert/developer.crt/developer.key文件复制到外部服务器。

在我的外部服务器上,我安装了kubectl。

我紧随其后https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/

虽然还不太清楚我在哪台服务器上创建这些文件并运行命令(主服务器或远程服务器(,但创建上下文似乎在主服务器上,其他一切都在远程上

在远程服务器上,如果我运行

[developer@server ~]$ kubectl get pods
The connection to the server 10.237.107.61 was refused - did you specify the right host or port?

或者如果它运行

curl https://10.237.107.61:6443/api/v1/pods --key developer.key --cert developer.crt --cacert ca.crt
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "pods is forbidden: User "system:anonymous" cannot list resource "pods" in API group "" at the cluster scope",
"reason": "Forbidden",
"details": {
"kind": "pods"
},

不确定我错过了什么。

Kuectl正在使用一个必须连接到集群的配置文件。您的配置文件可能由于大量的主要或次要更改而不一致。如果对问题的进一步分析没有显示出良好的结果,请尝试rm -f ~/.kube/config并从头开始。

正如我所看到的,您怀疑问题出在自签名证书上。它可能需要更新客户端上的群集根证书颁发机构(CA(,然后刷新本地列表以获取有效证书。

转到本地CA目录,检查CA.crt文件是否存在,然后将其复制到客户端。对于客户端,执行以下操作:

$ sudo cp ca.crt /usr/local/share/ca-certificates/kubernetes.crt
$ sudo update-ca-certificates

cluster:标记接受CA证书的文件名或PEM的"内联"base64 ed版本,您可以使用看到它

$ kubectl config set-cluster $foo --certificate-authority=... --embed-certs=true

在部署过程中,您还必须在外部服务器上配置集群和用户。

执行以下命令:

$ kubectl config --kubeconfig=your_kubeconfig_path set-context abc --cluster=10.237.107.61:6443 --user=developer --namespace=default

上下文指定名称空间/集群名称——在您的情况下是集群IP/集群用户。

$ kubectl config use-context abc

当您将输入kubectl命令时,该操作将应用于集群和abc上下文中列出的命名空间。该命令将使用abc上下文中列出的用户凭据。

最后,如果这在外部服务器上不起作用,请尝试仅从主k8s上的kubeconfig文件中复制开发人员用户的相关数据,并将其复制到外部服务器kubecnfig文件中,然后再次运行此命令。

如果你运行使用Vagrant设置的本地Kubernetes,你会注意到~/.kube/config文件是在集群出现后自动设置的;您还会感到欣慰的是,在流浪者内部提供kubernetes的脚本也使用这些命令来设置~/.kube/config.

请看一下:连接到集群,登录到集群。