如何在裸机集群上从外部访问Kubernetes服务

时间:2020-01-07 12:51:24

标签: kubernetes kubeadm bare-metal-server

我有一个类型为'ClusterIp'的api服务,它可以正常工作,并且可以在具有clusterip的节点上访问。我想从外部访问它。这是kubeadm的裸机安装。我无法使用Loadbalancer或Nodeport。

如果我也使用nginx-ingress,我也将用作“ ClusterIP”,以便在api服务或nginx-ingress情况下如何从外部访问该服务。

NAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
api                    ClusterIP   10.97.48.17      <none>        80/TCP           41s
ingress-nginx          ClusterIP   10.107.76.178    <none>        80/TCP           3h49m

为解决此问题而进行的更改:

  1. 节点上的nginx配置

在/ etc / nginx / sites-available

 upstream backend {
       server node1:8001;
       server node2:8001;
       server node3:8001;
        }
    server_name _;

    location / {
            proxy_pass http://backend;
            # First attempt to serve request as file, then
            # as directory, then fall back to displaying a 404.
            try_files $uri $uri/ =404;
    }
  1. 以DaemonSet身份运行我的两个服务

2 个答案:

答案 0 :(得分:1)

ClusterIP服务仅在集群内可用。

对于裸机集群,可以使用以下任何一种方法来使服务在外部可用。建议从最推荐到最不推荐:

  1. 使用 metallb 来实现 LoadBalancer 服务类型支持-https://metallb.universe.tf/。您将需要一个IP地址池,以便Metallb分发。它还支持IP共享模式,在该模式下,您可以将相同的IP用于多个LoadBalancer服务。

  2. 使用 NodePort 服务。您可以从任何节点IP:node_port地址访问服务。默认情况下,NodePort服务会在节点端口范围内选择随机端口。您可以使用服务规范中的spec.ports.nodePort字段在节点端口范围内选择一个自定义端口。

    缺点:默认情况下,节点端口范围是30000-32767。因此,您不能像8080那样绑定到您想要的任何自定义端口。尽管您可以使用kube-api-server的--service-node-port-range标志更改节点端口范围,但建议不要在端口范围较小的情况下使用它。

  3. 使用 hostPort 绑定节点上的端口。

    缺点:您没有固定的IP地址,因为除非使用nodeAffinity,否则您不知道Pod被调度到哪个节点。如果希望从给定端口上的所有节点均可访问它,则可以将pod设置为守护程序集。

如果要处理HTTP流量,另一种选择是安装像nginx或Traefik这样的IngressController并使用Ingress资源。作为安装的一部分,他们使用上述方法之一使其可在外部使用。

答案 1 :(得分:0)

好吧,您可以通过读取名称来猜测,ClusterIp仅可从集群内的 访问。

要使服务可以从群集外部访问,请提供c 3个选项:

  1. NodePort服务类型
  2. LoadBalancer服务类型(尽管您仍然必须手动管理LoadBalancer)
  3. 入口

还有第四个选项是hostPort(这是不是服务类型),但是当您绝对是时,我宁愿不要使用它。 strong>确保您的pod始终位于同一节点上(或最终用于调试)。

话虽如此,然后我们只剩下Kubernetes提供的一种解决方案:Ingress