是否可以通过https ingress访问Kubernetes API?

问题描述 投票:0回答:4

我尝试通过 HTTPS 入口访问 Kubernetes API 失败,现在开始怀疑这是否可能?

任何直接远程访问的工作详细指南(不使用 ssh -> kubectl 代理以避免 Kubernetes 节点上的用户管理)将不胜感激。 :)

更新:

只是为了说得更清楚。这是裸机本地部署(无 GCE、AWZ、Azure 或任何其他),并且某些环境将完全离线(这将增加获取安装包的其他问题)。

目的是能够在客户端主机上使用 kubectl,并通过 Keycloak 进行身份验证(如果遵循分步说明,也会失败)。使用 SSH 和 kubectl 进行管理访问不适合客户端访问。所以看来我必须更新防火墙以公开 API 端口并创建 NodePort 服务。

设置:

[kubernetes - env] - [FW/SNAT] - [我]

FW/NAT 仅允许 22,80 和 443 端口访问

因此,当我在 Kubernetes 上设置入口时,我无法创建防火墙规则将 443 重定向到 6443。似乎唯一的选择是创建 https 入口将对“api-kubernetes.node.lan”的访问指向 kubernetes 服务端口 6443 .Ingress 本身工作正常,我已经为 Keycloak 身份验证应用程序创建了一个工作入口。

我已将 .kube/config 从主节点复制到我的机器,并将其放入 .kube/config (Cygwin 环境)

尝试了什么:

  • SSL 直通。无法启用,因为 kubernetes-ingress 控制器由于无法创建中间证书而无法启动。即使启动,很可能会削弱其他 HTTPS 入口。
  • 创建自签名 SSL 证书。因此,通过浏览器,当我指向 https://api-kubernetes.node.lan/api 时,我可以获得 API 输出。但是,kubectl 由于未签名的证书而引发错误,这是显而易见的。
  • 将 apiserver.crt 放入 ingress tls: 定义中。由于证书不适合 api-kubernetes.node.lan,出现错误。也很明显。
  • 按照指南 [1] 创建 kube-ca 签名证书。现在浏览器根本不显示任何内容。使用curl访问https://api-kubernetes.node.lan/api会导致空输出(使用-v时我可以看到HTTP OK)。 Kubectl 现在出现以下错误: $ kubectl.exe version Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.0", GitCommit:"91e7b4fd31fcd3d5f436da26c980becec37ceefe", GitTreeState:"clean", BuildDate:"2018-06-27T20:17:28Z", GoVersion:"go1.10.2", Compiler:"gc", Platform:"windows/amd64"} Error from server: the server responded with the status code 0 but did not return more information

    
    
    
  • 当尝试比较 apiserver.pem 和我生成的证书时,我发现唯一的区别:

apiserver.pem X509v3 Key Usage: Digital Signature, Non Repudiation, Key Encipherment generated.crt X509v3 Extended Key Usage: TLS Web Server Authentication

入口配置:

--- kind: Ingress apiVersion: extensions/v1beta1 metadata: name: kubernetes-api namespace: default labels: app: kubernetes annotations: kubernetes.io/ingress.class: nginx spec: tls: - secretName: kubernetes-api-cert hosts: - api-kubernetes.node.lan rules: - host: api-kubernetes.node.lan http: paths: - path: "/" backend: serviceName: kubernetes servicePort: 6443

链接:
[1] 
https://db-blog.web.cern.ch/blog/lukas-gedvilas/2018-02-creating-tls-certificates-using-kubernetes-api

kubernetes kubectl kubernetes-ingress
4个回答
1
投票
kube-apiserver

命名空间中公开

kube-system
pod,您就应该能够做到这一点。我试过这样:

$ kubectl -n kube-system expose pod kube-apiserver-xxxx --name=apiserver --port 6443 service/apiserver exposed $ kubectl -n kube-system get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE apiserver ClusterIP 10.x.x.x <none> 6443/TCP 1m ...

然后转到集群机器并指向我的
~/.kube/config

上下文IP

10.x.x.x:6443

clusters: - cluster: certificate-authority-data: [REDACTED] server: https://10.x.x.x:6443 name: kubernetes ...

然后:

$ kubectl version --insecure-skip-tls-verify Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.2", GitCommit:"bb9ffb1654d4a729bb4cec18ff088eacc153c239", GitTreeState:"clean", BuildDate:"2018-08-07T23:17:28Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.2", GitCommit:"bb9ffb1654d4a729bb4cec18ff088eacc153c239", GitTreeState:"clean", BuildDate:"2018-08-07T23:08:19Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}

我使用了
--insecure-skip-tls-verify

,因为

10.x.x.x
需要在服务器证书上有效。实际上你可以这样修复它:
在 Kubernetes 中为 Master 配置 AWS publicIP
那么您的情况可能有以下几点:

由于您最初在 Ingress 上提供 SSL,因此您需要在 master 上的
    /etc/kubernetes/pki/
  1. 下使用相同的 kubeapi-server 证书
    您需要将外部IP或名称添加到暴露Ingress的证书中。按照如下操作:
  2. 为 Kubernetes 中的 Master 配置 AWS publicIP

0
投票

目前我对基于令牌的身份验证感到满意:这允许拥有单独的访问级别并避免允许 shell 用户。基于 Keycloak 的仪表板身份验证有效,但登录后无法注销。没有注销选项。 :D

为了通过 Ingress 访问仪表板本身,我在某处找到了一个有效的重写规则:

nginx.ingress.kubernetes.io/configuration-snippet: "rewrite ^(/ui)$ $1/ui/ permanent;"


需要注意的是,必须使用尾部斜杠“/”访问该 UI:

https://server_address/ui/


0
投票

如果这描述了您,那么您所要做的就是在您来自的 DNS 的 API 证书中添加额外的 SAN 规则。

这篇文章详细介绍了过程


0
投票
未经授权401

© www.soinside.com 2019 - 2024. All rights reserved.