1

我有一个 'ClusterIp' 类型的 api 服务,它工作正常,可以在带有 clusterip 的节点上访问。我想从外部访问它。这是一个使用 kubeadm 的裸机安装。我不能使用负载均衡器或 Nodeport。

如果我也使用 nginx-ingress,我将使用它作为“ClusterIP”,那么如何在 api 服务或 nginx-ingress case 中获取外部可访问的服务。

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 运行
4

2 回答 2

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。虽然你可以使用--service-node-port-rangekube-api-server 的标志来更改节点端口范围,但不建议将它用于低端口范围。

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

    缺点:您没有固定的 IP 地址,因为除非您使用nodeAffinity. 如果您希望它可以从给定端口上的所有节点访问,您可以将您的 pod 设置为守护程序集。

如果您正在处理 HTTP 流量,另一种选择是安装IngressController类似 nginx 或 Traefik 并使用Ingress资源。作为安装的一部分,他们使用上述方法之一使自己在外部可用。

于 2020-01-07T12:54:37.117 回答
0

好吧,正如您通过阅读名称可以猜到的那样,ClusterIp只能从集群内部访问。

要从集群外部访问服务,您有 3 个选项:

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

还有第四个选项是hostPort(它不是服务类型),但是当您绝对确定您的 pod 将始终位于同一节点上(或最终用于调试)时,我宁愿将其保留在特殊情况下。

话虽如此,那么这给我们留下了 Kubernetes 提供的一种解决方案:Ingress.

于 2020-01-07T13:16:09.417 回答