在kubernetes.io上的交互式教程之后,其中通过NodePort
创建了kubectl expose deploy kubernetes-bootcamp --type="NodePort" --port 8080
类型的服务,我对结果感到困惑。
首先,本教程指出
让我们运行(...)
kubectl get services
(...),我们看到该服务收到(...)外部IP(节点的IP)。
根据输出,这是不正确的,没有外部IP:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORTS
kubernetes-bootcamp NodePort ... <none> 8080:31479
现在拥有kubectl describe service kubernetes-bootcamp
的人可以得到:
Type NodePort
IP ...
Port <unset> 8080/TCP
NodePort <unset> 31479/TCP
现在,本教程建议curl $(minikube ip):$NODE_PORT
等于curl <internal node IP>:<NodePort>
-可行,但还有很多问题:
kubectl expose -h
,--port
命令指定了要服务的端口,因此我希望--port
为<NodePort>
类型的服务设置暴露的NodePort
, 但事实并非如此。为什么以及如何设置?<internal node IP>
,我只能从kubectl get nodes
获取它。为什么?IP
显示的kubectl describe service
(等于集群IP)和那里显示的端口(等于通过--port
设置的端口)也路由到容器应用,因此curl <clusterIP>:8080
可以正常工作,并且履行了您可以通过--port
设置暴露端口的承诺。但是以一种意想不到的方式:为什么NodePort
服务具有这样的clusterIP
类型的接口?Endpoints
端点既不是kubectl describe service
端点又不是clusterIP
端点,则NodePort
所示的response()
是什么意思? 答案 0 :(得分:2)
这将有助于打破这一点,但总的主题是NodePort并不是在群集之外公开服务的最常用方法,因此围绕它的某些功能并不是那么直观。 LoadBalancer(或使用它的入口控制器)是向集群外部环境公开服务的首选方式。
通过
import sys reload(sys) sys.setdefaultencoding("utf-8")
显示的IP(等于集群IP)和那里也显示的端口(等于通过kubectl describe service
设置的端口)也路由到容器应用,因此{{1 }}可以实现并承诺您可以通过--port
设置暴露端口。但是以一种出乎意料的方式:为什么NodePort服务具有这样的clusterIP类型接口?
您还会看到ClusterIP,因为这是在群集内 进入服务的方式。其他服务可以使用该服务名称和端口(在本例中为8080)到达群集内的该服务,但是ClusterIP本身不能使该服务在群集外部可用。
如果
curl <clusterIP>:8080
既不是clusterIP端点又不是NodePort端点,那么端点的含义是什么?
--port
或类似的终结点值将是服务的内部IP和端口。在群集内,您还可以使用群集的内部dns通过其名称访问服务(通常是更方便的方法)。
在服务元数据中的任何地方都没有显示可以实际访问容器应用程序的
kubectl describe service
,我只能从172.18.0.2:8080
获取它。为什么?
这链接到您在通过NodePort进行公开时从<internal node IP>
和kubectl get nodes
看到的输出有点误导-人们希望看到与kubectl get services
类似的东西入口。 NodePort仅在该节点上为该服务指定端口。这有点限制,好像您继续对添加的每个服务执行此操作,则端口将用完。因此,kubectl describe service <service>
(如果要显示的话)必须是节点的IP,当与LoadBalancer类型的服务的IP一起显示时,它看起来可能有些奇怪。
根据
external-ip
,external-ip
命令指定了要服务的端口,因此我期望kubectl expose -h
为NodePort类型服务设置暴露的--port
,但这是并非如此。为什么以及如何设置?
暴露命令行选项受当前can't even use it to choose which port in the NodePort range is used的特别限制。在您的情况下,已为您提供了外部端口31479,但没有选择该端口。最好不要让用户过于容易地选择它,因为可用的端口数量有限,而且您很容易发现自己两次分配了相同的端口。但是,通过描述符文件进行部署时,可以将其选择为外部端口。