我可以通过指向特定服务器而不是本地主机的域名访问我的 Kubernetes 仪表板吗

Can I access my Kubernetes Dashboard via DomainName pointing to specific server instead of localhost

跟进文件 https://docs.aws.amazon.com/eks/latest/userguide/dashboard-tutorial.html

我能够设置仪表板并使用 link http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#!/login

访问它

问题在于 "EVERY USER HAS TO FOLLOW THE SAME TO ACCESS THE DASHBOARD"

我想知道是否有某种方法可以让我们通过域名访问仪表板,并且每个人都应该能够访问它而无需太多预先设置。

深层问题是身份验证。如果您希望仪表板遵守用户的 Kubernetes RBAC 规则,则需要他们的 K8s 证书,而这些证书通常很复杂。对于 EKS,它基于您的 AWS 凭证。有些人只是在仪表板上放置一组静态权限,然后在其前面放置一些其他普通的 Web 身份验证。

我们有两种公开仪表板的方法,NodePortLoadBalancer

我将展示这两种情况及其优缺点。


type: NodePort

这样您的仪表板将在 https://<MasterIP>:<Port> 中可用。

  • 我将从 Dashboard 已经部署并且 运行 作为 ClusterIP(就像你的一样)开始。
$ kubectl get service kubernetes-dashboard -n kubernetes-dashboard
NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes-dashboard   ClusterIP   10.0.11.223   <none>        80/TCP     11m
$ kubectl patch svc kubernetes-dashboard -n kubernetes-dashboard -p '{"spec": {"type": "NodePort"}}'
service/kubernetes-dashboard patched

注意: 您也可以在 YAML 格式中申请将字段 type: ClusterIP 更改为 type: Nodeport,而不是我想展示一个直接的方法 kubectl patch 使用 JSON 格式修补相同的字段。

  • 现在让我们列出来查看新端口:
$ kubectl get service kubernetes-dashboard -n kubernetes-dashboard
NAME                   TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)         AGE
kubernetes-dashboard   NodePort   10.0.11.223   <none>        443:31681/TCP   13m

注意:从外部集群访问之前,必须启用节点的安全组以允许通过暴露的端口传入流量,或此处为GKE . 下面是我在 Google Cloud 上创建规则的示例,但同样的概念适用于 EKS.

$ gcloud compute firewall-rules create test-node-port --allow tcp:31681
Creating firewall...⠹Created [https://www.googleapis.com/compute/v1/projects/owilliam/global/firewalls/test-node-port].                                                                 
Creating firewall...done.                                                                                                                                                               
NAME            NETWORK  DIRECTION  PRIORITY  ALLOW      DENY  DISABLED
test-node-port  default  INGRESS    1000      tcp:31681        False                                                                                                                                                               

$ kubectl get nodes --output wide
NAME                                 STATUS   ROLES    AGE   VERSION         INTERNAL-IP   EXTERNAL-IP
gke-cluster-1-pool-1-4776b3eb-16t7   Ready    <none>   18d   v1.15.8-gke.3   10.128.0.13   35.238.162.157

  • 我将使用 https://35.238.162.157:31681:
  • 访问它


type: LoadBalancer

这样您的仪表板将在 https://IP 中可用。

  • 使用 LoadBalancer 您的云提供商会自动执行防火墙规则和端口转发,为其分配 IP。 (根据您的计划,您可能需要支付额外费用)。

  • 和之前一样,我删除了服务,重新创建了clusterIP:

$ kubectl get service kubernetes-dashboard -n kubernetes-dashboard
NAME                   TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes-dashboard   ClusterIP   10.0.2.196   <none>        443/TCP   15s

$ kubectl patch svc kubernetes-dashboard -n kubernetes-dashboard -p '{"spec": {"type": "LoadBalancer"}}'
service/kubernetes-dashboard patched

$ kubectl get service kubernetes-dashboard -n kubernetes-dashboard
NAME                   TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)         AGE
kubernetes-dashboard   LoadBalancer   10.0.2.196   <pending>     443:30870/TCP   58s

$ kubectl get service kubernetes-dashboard -n kubernetes-dashboard
NAME                   TYPE           CLUSTER-IP   EXTERNAL-IP      PORT(S)         AGE
kubernetes-dashboard   LoadBalancer   10.0.2.196   35.232.133.138   443:30870/TCP   11m

注意:当你申请的时候,EXTERNAL-IP会处于<pending>状态,几分钟后应该分配一个Public IP如您所见。

  • 您可以使用 https://35.232.133.138 访问它:


安全注意事项:

  • 您与仪表板的连接始终通过 HTTPS 连接,您每次进入时都可能收到有关自动生成证书的通知,除非您将其更改为受信任的证书。您可以找到更多 here

  • 由于仪表板不会暴露太多,我建议使用 Public IP(或自定义 dns 名称,如果是 aws,即:* ****.us-west-2.elb.amazonaws.com).

  • 如果你真的想集成到你的主域名,我建议把它放在你网站的另一层认证之后。

  • 新访问仍然需要访问令牌,但是没有人必须通过该过程来公开仪表板,您只需将 IP/DNS 地址和令牌传递给访问它。

  • 此令牌具有集群管理员访问权限,因此请妥善保管它,就像您保留根密码一样。

如果您有任何疑问,请告诉我!