我是K8的新手,目前正在使用Minikube体验该平台。如何为服务配置公共(即群集外部)端口?我遵循了nginx example和K8s服务教程。就我而言,我是这样创建服务的:
kubectl expose deployment/mysrv --type=NodePort --port=1234
对于尝试从INSIDE群集访问它的任何人,该服务的端口为1234。 minikube教程说,我需要直接通过随机的nodePort访问该服务,该服务可用于手动测试:
kubectl describe service mysrv | grep NodePort
...
NodePort: <unset> 32387/TCP
# curl "http://`minikube ip`:32387/"
但是我不明白在一个真正的集群中,该服务如何具有固定的世界可访问端口。 Nginx示例描述了有关使用LoadBalancer服务类型的一些内容,但它们甚至没有在其中指定端口...
有什么想法如何为整个服务修复外部端口吗?
答案 0 :(得分:2)
minikube教程说,我需要通过它的随机nodePort直接访问该服务,该服务可用于手动测试:
使用NodePort
命令创建类型$ kubectl expose
的服务对象时,无法选择NodePort
端口。要选择一个NodePort
端口,您需要为其创建一个YAML
定义。
您可以使用以下示例在类型为Nodeport
的服务对象中手动指定端口:
apiVersion: v1
kind: Service
metadata:
name: example-nodeport
spec:
type: NodePort
selector:
app: hello # selector for deployment
ports:
- name: example-port
protocol: TCP
port: 1234 # CLUSTERIP PORT
targetPort: 50001 # POD PORT WHICH APPLICATION IS RUNNING ON
nodePort: 32222 # HERE!
您可以通过调用以下命令来应用高于YAML
的定义:
$ kubectl apply -f FILE_NAME.yaml
仅当nodePort
端口可用时,以上服务对象才会创建。
但是我不明白,在一个真实的集群中,该服务如何不具有固定的世界可访问端口。
在由云提供商(例如GKE)管理的群集中,您可以使用类型为LoadBalancer
的服务对象,该服务对象将具有固定的外部IP和固定的端口。
具有带有公共IP的节点的集群可以使用类型NodePort
的服务对象将流量引导到群集中。
在minikube
环境中,您可以使用类型LoadBalancer
的服务对象,但是在上一段中将有一些警告。
Nodeport
在静态端口的每个节点IP上公开服务。它允许外部流量通过NodePort
端口进入。该端口将自动从30000
到32767
的范围内分配。
您可以按照this manual更改默认的NodePort
端口范围。
通过查看answer,可以检查创建NodePort
类型的服务对象时到底发生了什么。
想象一下:
192.168.0.100
192.168.0.101
192.168.0.102
50001
上以hello
进行响应,并且它们具有IP:
10.244.1.10
10.244.1.11
10.244.1.12
NodePort
(端口32222
)具有:
ClusterIP
:
10.96.0.100
port
:7654
targetPort
:50001
关于targetPort
的字词。这是 pod 上端口的定义,例如Web服务器。
根据上面的示例,您将收到hello
的回复:
NodeIP:NodePort
(所有广告连播都可以回复hello
):
192.168.0.100:32222
192.168.0.101:32222
192.168.0.102:32222
ClusterIP:port
(所有广告连播都可以回复hello
):
10.0.96.100:7654
PodIP:targetPort
(仅发送请求的Pod可以回复hello
)
10.244.1.10:50001
10.244.1.11:50001
10.244.1.12:50001
您可以使用curl
命令检查访问权限,如下所示:
$ curl http://NODE_IP:NODEPORT
在您提到的示例中:
$ kubectl expose deployment/mysrv --type=NodePort --port=1234
会发生什么:
30000
实例上的32767
到minikube
范围内分配一个随机端口,将进入该端口的流量引导到Pod。ClusterIP
端口的1234
在上面的示例中,没有参数targetPort
。如果未提供targetPort
,则它将与命令中的port
相同。
输入NodePort
的流量将直接路由到广告连播,而不会转到ClusterIP
。
从minikube
角度来看,NodePort
将是您的minikube
实例上的端口。它的IP地址将取决于所使用的管理程序。将其暴露在本地计算机之外将在很大程度上取决于操作系统。
类型LoadBalancer
(1)的服务对象和外部LoadBalancer
(2)的服务对象之间是有区别的:
LoadBalancer
(1)的LoadBalancer
(2)在外部公开服务。这是Kubernetes环境中的一项服务,通过服务控制器可以安排外部LoadBalancer
(2)的创建。LoadBalancer
(2)是云提供商提供的负载均衡器。它将在第4层运行。类型LoadBalancer
(1)的服务的示例定义:
apiVersion: v1
kind: Service
metadata:
name: example-loadbalancer
spec:
type: LoadBalancer
selector:
app: hello
ports:
- port: 1234 # LOADBALANCER PORT
targetPort: 50001 # POD PORT WHICH APPLICATION IS RUNNING ON
nodePort: 32222 # PORT ON THE NODE
在YAML
上应用将创建LoadBalancer
(1)类型的服务
具体看一下:
ports:
- port: 1234 # LOADBALANCER PORT
此定义将同时:
LoadBalancer
(2)port
指定为1234 ClusterIP
port
指定为1234 想象一下:
LoadBalancer
(2)具有:
ExternalIP
:34.88.255.5
port
:7654
192.168.0.100
192.168.0.101
192.168.0.102
50001
上以hello
进行响应,并且它们具有IP:
10.244.1.10
10.244.1.11
10.244.1.12
NodePort
(端口32222
)具有:
ClusterIP
:
10.96.0.100
port
:7654
targetPort
:50001
根据上面的示例,您将收到hello
的回复:
ExternalIP
:port
(所有广告连播都可以回复hello
):
34.88.255.5:7654
NodeIP:NodePort
(所有广告连播都可以回复hello
):
192.168.0.100:32222
192.168.0.101:32222
192.168.0.102:32222
ClusterIP:port
(所有广告连播都可以回复hello
):
10.0.96.100:7654
PodIP:targetPort
(仅发送请求的Pod可以回复hello
)
10.244.1.10:50001
10.244.1.11:50001
10.244.1.12:50001
ExternalIP
可以通过以下命令进行检查:$ kubectl get services
流量:
客户端-> LoadBalancer:port
(2)-> NodeIP:NodePort
-> Pod:targetPort
注意:该功能仅适用于支持外部负载平衡器的云提供商或环境。
- Kubernetes.io: Create external LoadBalancer
在支持负载平衡器的云提供商上,将提供一个外部IP地址来访问服务。在Minikube上,通过
LoadBalancer
命令可以访问minikube service
类型的服务。
Minikube
可以创建类型LoadBalancer
(1)的服务对象,但不会创建外部LoadBalancer
(2)。
命令ExternalIP
中的$ kubectl get services
将处于待处理状态。
要解决没有外部LoadBalancer
(2)的问题,您可以调用$ minikube tunnel
,这将创建从主机到minikube
环境的路由,以访问{的CIDR
} {1}}。
答案 1 :(得分:-1)
根据问题:
- 但是我不明白在一个真正的集群中,该服务如何具有固定的世界可访问端口。
- 从没有minikube的整个群集外部访问服务时(例如在GKE上),nodePort甚至有什么意义?
在云中提供的Kubernetes集群LoadBalancer
服务类型将具有由云提供商分配的外部IP。所需的服务将通过提供的外部IP进行访问。 LoadBalancer
还将自动创建一种NodePort
类型的服务,以在内部路由流量。 NodePort
端口将无法与具有外部流量的节点IP地址直接连接。
创建的LoadBalancer
将允许您指定一个端口,它将在该端口上响应流量。
通过链接查看以下参考:
声明类型为
LoadBalancer
的服务会使用云提供商的负载平衡器在外部公开它。云提供商将为Service
设置负载平衡器,并将其映射到自动分配的NodePort
。