我有一个服务暴露了type = LoadBalancer,当我做了
kubectl describe services servicename
,
我得到了这个输出:
Name: ser1
Namespace: default
Labels: app=online1
Selector: app=online1
Type: LoadBalancer
IP: 10.0.0.32
External IPs: 192.168.99.100
Port: <unset> 8080/TCP
NodePort: <unset> 30545/TCP
Endpoints: 172.17.0.10:8080,172.17.0.11:8080,172.17.0.8:8080 + 1 more...
Session Affinity: None
有人可以指导以下疑问:
1。)我无法理解<unset>
在Port和NodePort中的含义。另外,它如何影响我的服务?
2.。)当我想点击某项服务时,我使用<external-ip:NodePort>
点击该服务了吗?那么Port的用途是什么?
答案 0 :(得分:18)
端口未设置表示:您未在服务创建中指定名称。
服务Yaml摘录(注意name: grpc
):
spec:
ports:
- port: 26257
targetPort: 26257
name: grpc
type: NodePort
kubectl describe services servicename
输出摘录:
Type: NodePort
IP: 10.101.87.248
Port: grpc 26257/TCP
NodePort: grpc 31045/TCP
Endpoints: 10.20.12.71:26257,10.20.12.73:26257,10.20.8.81:26257
端口是服务将发送流量的容器端口的定义(实际端点)。
答案 1 :(得分:2)
回答问题的第二部分:
When I want to hit a service, I hit the service using <external-ip:NodePort> right? Then what's the use of Port?
:
k8s 中的 Service
是虚拟 IP 和虚拟端口的组合。
就像我们为(以太网)接口分配 IP 以通过它进行通信一样,这种虚拟 IP:端口组合是一种通过服务进行通信的方式。
targetPort
是目标容器的端口。 (如果不指定,k8s默认为Service的端口(虚拟端口))
NodePort
是在机器的以太网接口(配置了 k8s 集群)上公开的端口。 (如果未指定,k8s 会为服务类型 NodePort
和 LoadBalancer
选择 30000-32767 之间的随机可用端口)。
如您所见,虽然我们可以忽略 targetPort
或 NodePort
,但如果没有所讨论的“端口”(虚拟端口),则服务不存在。
顺便说一句:这些虚拟 IP 和服务端口完全存在于 IPtables 规则中(如果使用 IPtables)以及通过此虚拟 ip:port 来往节点或容器的转发规则。
请注意:Headless Service
是此概念的一个例外。