我使用以下配置设置了NodePort服务:
的wordpress-service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: wordpress
name: wordpress
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
app: wordpress
这是否足以从外部访问服务,如果是这样,我现在如何访问该服务?我需要哪些细节 - 以及如何确定它们 - 例如节点IP。
答案 0 :(得分:3)
对于GCE上的Kubernetes:
我们对NodePort类型的服务有同样的疑问:我们如何从我们自己的主机访问节点端口服务?
@ ivan.sim的答案(nodeIp:nodePort)已开启,但除非您添加防火墙入口(入站到Google云)流量规则,否则您仍然无法访问您的服务在VPC网络控制台上,以允许您的主机能够访问您的计算节点
您可以使用Google Cloud控制台或运行后续kubectl命令找到节点端口,以找出运行包含容器的pod的节点。即kubectl get pods , kubectl describe pod your-pod-name, kubectl describe node node-that-runs-you-pod
.status.addresses有你的ExternalIP
如果我们只使用label/selector
和几行命令来提取在pod中运行我们容器的节点ip就会很棒,所以这就是我们所做的,在这种情况下我们的选择器是{{ 1}}:
app: your-label
通知:我们使用json路径提取我们想要的信息,有关json路径的更多信息,请参阅:json path
你当然可以将它变成一个脚本,它将标签/选择器作为输入并输出运行容器的节点的外部ip!
要获取nodeport,只需输入:
$ nodename=$(kubectl get pods -o jsonpath='{.items[?(@.metadata.labels.app=="your-label")].spec.nodeName}')
$ nodeIp=$(kubectl get nodes -o jsonpath='{.items[?(@.metadata.name=="'$(echo $nodename)'")].status.addresses[?(@.type=="ExternalIP")].address}')
$ echo nodeIp
在 PORT(S)列下,您会看到类似tagetPort:nodePort的内容。这个nodeport就是你想要的。
$ kubectl get services
答案 1 :(得分:2)
像这样定义的服务被分配了一个高端口号,并暴露在该端口上的所有集群节点上(可能类似于3xxxx)。如果没有正确了解群集的配置方式,很难告诉其他人。 kubectl get nodes
应该为您提供有关您的节点的一些知识。
虽然我假设您想要将服务公开给外界。从长远来看,我建议熟悉LoadBalancer类型的服务和Ingress / IngressController
答案 2 :(得分:2)
当您将服务定义为NodeIP
类型时,群集中的每个节点都会将该端口代理到您的服务。如果您可以从Kubernetes群集外部访问节点,则应该能够在nodeIP:nodePort
访问该服务。
要确定特定节点的nodeIP
,您可以使用kubectl get no <node> -o yaml
或kubectl describe no <node>
。 status.Addresses
字段将是您感兴趣的。通常,您会看到HostName
,ExternalIP
和InternalIP
等字段。
要确定服务的nodePort
,您可以使用kubectl get svc wordpress -o yaml
或kubectl describe svc wordpress
。 spec.ports.nodePort
是您需要的端口。