我有一个类型为'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
好吧,您可以通过读取名称来猜测,ClusterIp
仅可从在集群内部访问。
要使服务可从群集外部访问,您有3个选项:
NodePort
服务类型LoadBalancer
服务类型(尽管您仍然必须手动管理LoadBalancer)还有第四个选项,它是hostPort
(这是not服务类型),但是当您绝对确保您的广告连播始终是位于同一节点上(或最终用于调试)。
话虽如此,但这只给我们留下了Kubernetes提供的一种解决方案:Ingress
。
[ClusterIP
服务仅在集群内可用。
对于裸机集群,您可以使用以下任何一种方法在外部提供服务。建议从最不推荐的顺序到最不推荐的顺序:
使用metallb
实现LoadBalancer服务类型支持-https://metallb.universe.tf/。您将需要一个IP地址池,以便Metallb分发。
使用NodePort服务。您可以从任何节点IP:node_port地址访问服务。默认情况下,NodePort服务会在节点端口范围内选择随机端口。您可以使用服务规范中的spec.ports.nodePort
字段在节点端口范围内选择自定义端口。
缺点:默认情况下,节点端口范围是30000-32767。因此,您不能像8080那样绑定到您想要的任何自定义端口。尽管您可以使用kube-api-server的--service-node-port-range
标志更改节点端口范围,但不建议将其用于低端口范围。
使用hostPort绑定节点上的端口。
缺点:您没有固定的IP地址,因为除非使用nodeAffinity
,否则您不知道Pod被调度到哪个节点。如果希望从给定端口上的所有节点均可访问它,则可以将pod设置为守护程序集。
[如果要处理HTTP流量,另一种选择是安装IngressController
,例如nginx或Traefik,并使用Ingress
资源。作为安装的一部分,他们使用上述方法之一使其可在外部使用。