通过 https 使用 kubeconfig 提供 Kubernetes 集群身份验证

Provide Kubernetes cluster authentication with kubeconfig over https

我有一个 kubernetes 集群。我使用 Google Cloud 创建集群,但没有使用 GKE,而是使用 GCE。我使用 VM instances 创建了一个 master node 和两个 worker nodesKubeadm 用于连接主节点和工作节点以及 kube-flannel.yml 文件。我正在使用我的 Vm's public ip & nodePortpostman 中将我的集群暴露在外面。我能打到那个URL。 publicip:nodePort/adapter_name。命中到达我的 pods 并且正在生成日志。我以前用minikube的时候,是用port-forwarding暴露端口的。现在我不用那个了。

位置 $HOME/.kube/config 中存在名为 config 的默认 kubeconfig 文件。其中包含以下内容。

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3SUJ....
    server: https://10.128.0.12: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: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURFe....
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb.....

服务器 IPhttps://10.128.0.12:6443。我可以将此默认设置 URL 更改为身份验证所需的设置吗 [my rest api url]??

我的要求是为我的其余 api url 提供身份验证,我的应用程序启用,而 运行 在 kubernetes pod 中。

如何使用此 kubeconfig 方法或通过创建新的 kubeconfig 文件并使用该文件来验证我的其余 api url?

https://unofficial-kubernetes.readthedocs.io/en/latest/concepts/cluster-administration/authenticate-across-clusters-kubeconfig/

http://docs.shippable.com/deploy/tutorial/create-kubeconfig-for-self-hosted-kubernetes-cluster/

我从上面的两个博客中得到了一些想法并尝试实现它,但其中 none 满足了我的要求。也可以使用任何 JWT 令牌通过邮递员进行身份验证。

Kubernetes 版本:

Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.4", GitCommit:"d360454c9bcd1634cf4cc52d1867af5491dc9c5f", GitTreeState:"clean", BuildDate:"2020-11-11T13:17:17Z", GoVersion:"go1.15.2", Compiler:"gc", Platform:"linux/amd64"} 
Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.4", GitCommit:"d360454c9bcd1634cf4cc52d1867af5491dc9c5f", GitTreeState:"clean", BuildDate:"2020-11-11T13:09:17Z", GoVersion:"go1.15.2", Compiler:"gc", Platform:"linux/amd64"} 

将其发布为 Community Wiki

我。访问 Kubernetes API.

Can I change this default URL (cluster server IP address) to the one required for authentication my rest api url??

不会推荐这个KUBECONFIG 文件用于组织有关集群、用户、命名空间、身份验证机制的信息,并存储有关您与 Kubernetes 集群的连接的信息。当你使用 kubectl 执行命令时,它会从这个 KUBECONFIG.

中获取正确的通信信息

KUBECONFIG 中,您可以使用 X509 Client Certs 或不同类型的 Tokens 进行身份验证。可以在 Authentication strategies and Access Clusters Using the Kubernetes API

中找到更多详细信息

如果您对如何使用 Beare Token 访问 kubernetes API 感兴趣,请查看 this docs.

二.访问客户端 API

如果您想将端点 rest api 公开为 public,您可以使用:

Exposes the Service on each Node's IP at a static port (the NodePort). A ClusterIP Service, to which the NodePort Service routes, is automatically created. You'll be able to contact the NodePort Service, from outside the cluster, by requesting :.

Exposes the Service externally using a cloud provider's load balancer. NodePort and ClusterIP Services, to which the external load balancer routes, are automatically created.

注意:对于裸机环境,考虑使用Metallb

Kubernetes 不为裸机集群提供网络负载均衡器(LoadBalancer 类型的服务)的实现。 Kubernetes 附带的 Network LB 的实现都是调用各种 IaaS 平台(GCP、AWS、Azure……)的胶水代码。如果您 运行 不在受支持的 IaaS 平台(GCP、AWS、Azure...)上,LoadBalancers 在创建时将无限期地保持在“待处理”状态。

一旦您将 api 暴露给外界(如有必要)

作为替代解决方案,您可以考虑将 Keycloak as additional authentication with Gatekeeper in rest api 作为 sidecare,用于验证是否存在身份验证。

如果您对微服务之间的身份验证感兴趣,可以查看 Authentication between microservices using Kubernetes identities 文章。

如果你对 istio 感兴趣,请看一看 Istio Security Istio 提供两种类型的身份验证:

  • 对等身份验证: 用于服务到服务身份验证以验证建立连接的客户端
  • 请求身份验证:用于最终用户身份验证以验证附加到请求的凭据。 Istio 通过 JSON Web 令牌 (JWT) 验证启用请求级身份验证,并使用自定义身份验证提供程序或任何 OpenID Connect 提供程序简化开发人员体验 - example

验证我们的客户端 api/end 要点 url 的最佳方法是使用 Istio

Istio installation

我在附上的 PDF 文件中记录了通过 Istio 提供安全性的整个过程 here。 Istio用于token的验证,Keycloak用于JWT Token的生成。