【问题标题】:kubernetes authentication against the API server针对 API 服务器的 kubernetes 身份验证
【发布时间】:2020-02-19 07:53:12
【问题描述】:

我从头开始设置了一个kubernetes 集群。这只是意味着我没有使用其他人提供的服务,而是使用了自己的k8s安装程序。以前我们有其他集群,但是有提供者,他们给你tls cert and key 用于身份验证等。现在这个集群是我自己设置的,我可以通过kubectl 访问:

$ kubectl get all
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   21h
$

我也尝试了this,我可以添加一个自定义键,但是当我尝试通过 curl 查询时,我得到了pods is forbidden: User "system:anonymous" cannot list resource "pods" in API group "" at the cluster scope

我不知道在哪里可以获得证书和密钥,以便用户使用 tls auth 的 API 进行身份验证。我试图了解官方文档,但我一无所获。有人可以帮我找到这些文件在哪里,或者如何添加或获取可用于其余 API 的证书吗?

Edit1:我的 .kube.config 文件如下所示:

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0t(...)=
    server: https://private_IP:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: LS0tLS(...)Qo=
    client-key-data: LS0(...)tCg==

它在本地主机上正常工作。 另一方面,我注意到了一些事情。从 localhost 我可以通过使用this 方法生成令牌来访问集群。

另外请注意,现在我不介意为多个用户创建多个角色等。我只需要从远程访问 API 并且可以使用“默认”身份验证或角色。 现在,当我尝试从远程执行相同操作时,我得到以下信息:

  1. 我尝试使用该配置从远程运行kubectl get all,它运行了一段时间,然后以Unable to connect to the server: dial tcpprivate_IP:6443: i/o timeout. 结束
  2. 发生这种情况是因为配置有private_IP,然后我将IP 更改为Public_IP:6443,现在得到以下内容:Unable to connect to the server: x509: certificate is valid for some_private_IP, My_private_IP, not Public_IP:6443
  3. 保持现状,这是和 AWS ec2 实例与 elastic IP(您可以将弹性 IP 视为传统设置中的公共 IP,但此公共 IP 在您的公共路由器上,然后此路由器将请求路由到您在专用网络上的实际服务器)。对于我所说的 AWS 粉丝,我不能在这里使用 EKS 服务。

那么我怎样才能让它能够使用公共 IP?

【问题讨论】:

  • 您有自动生成的~/.kube/config 文件吗?如果可以,可以发一下吗?
  • @weibeld,我添加了一些上下文。

标签: authentication ssl curl kubernetes tls1.2


【解决方案1】:

看来您的主要问题是 TLS 服务器证书验证。

一种选择是告诉 kubectl 跳过服务器证书的验证:

kubectl --insecure-skip-tls-verify ...

这显然有可能是“不安全的”,但这取决于你的用例

另一种选择是使用添加到服务器证书的公共 IP 地址重新创建集群。并且还应该可以仅使用kubeadm 重新创建证书而不重新创建集群。关于后两点的详细信息可以在this answer找到。

【讨论】:

  • 感谢您的帮助。这澄清了一些事情,它与--insecure-skip-tls-verify 一起工作,经过一些研究,我也了解了一些组件是如何工作的。我最终将不得不重新初始化集群。或使用@P Ekambaram 建议的 RBAC 方法。
  • 有助于避免混淆。您的描述涉及不同的概念:(1) API 服务器 TLS 证书验证(您的 kubeconfig 文件的 clusters 部分中有 CA 证书),(2)身份验证(您的 kubeconfig 文件的 users 部分中有密钥和证书),(3) 授权(使用 RBAC 角色和角色绑定完成)。这些都是完全不同的概念,在流程的不同时间发生,并且有自己的技术和问题。
【解决方案2】:

您需要为用户设置 RBAC。定义角色和角色绑定。点击链接以供参考 -> https://docs.bitnami.com/kubernetes/how-to/configure-rbac-in-your-kubernetes-cluster/

【讨论】:

  • @P Ekambaram,感谢您的回复。我相信你是对的,但我可能是一个新手来理解这些东西。我添加了一些可能相关的进一步上下文。
猜你喜欢
  • 1970-01-01
  • 2018-08-07
  • 2023-03-20
  • 1970-01-01
  • 2013-11-26
  • 2020-04-22
  • 2014-05-04
  • 2021-12-14
  • 1970-01-01
相关资源
最近更新 更多