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