无法从集群外部访问LoadBalancer

时间:2019-05-05 16:42:31

标签: docker networking kubernetes

为了进行测试,我使用Virtualbox在单个节点上创建了Kubernetes。 我在端口4646上创建了一个侦听Pod,然后为该Pod创建了LoadBalancer。

用于Pod的Yaml文件:

apiVersion: v1
kind: Pod
metadata:
  name: simple-app
  labels:
    app: simple-app
spec:
  containers:
    ...
    name: test-flask-app
    ports:
    - containerPort: 4646

LoadBalancer的Yaml文件:

apiVersion: v1
kind: Service
metadata:
  name: simple-app-lb
spec:
  type: LoadBalancer
  ports:
  - port: 88
    protocol: TCP
    targetPort: 4646
  selector:
    app: simple-app

命令kubectl get nodes -o wide的输出:

NAME     STATUS   ROLES    AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
server   Ready    master   20h   v1.14.1   10.0.2.8      <none>        Ubuntu 18.04.2 LTS   4.15.0-48-generic   docker://18.6.2

命令kubectl get all

的输出
NAME             READY   STATUS    RESTARTS   AGE
pod/simple-app   1/1     Running   5          20h

NAME                    TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/kubernetes      ClusterIP      10.96.0.1      <none>        443/TCP        20h
service/simple-app-lb   LoadBalancer   10.98.241.39   <pending>     88:32319/TCP   20h

在同一网络中的其他虚拟机上,我想通过具有Kubernetes的计算机的IP地址和端口88来访问LoadBalancer。如果我运行下一条命令,则会得到以下输出:

sergey@server2:~$ curl 10.0.2.8:88
curl: (7) Failed to connect to 10.0.2.8 port 88: connection refused

但是如果我使用端口32319,我将获得访问权限:

sergey@server2:~$ curl 10.0.2.8:32319
{"msg":"superuser, Hello from GeoServer"}

如果我在使用Kubernetes的机器上,我也可以访问:

sergey@server:~$ curl 10.98.241.39:88
{"msg":"superuser, Hello from GeoServer"}

什么原因导致我无法通过EXTERNAL-IP和PORT访问?

2 个答案:

答案 0 :(得分:2)

引擎盖下的Load Balancer服务也是NodePort,这就是为什么您可以连接到NodeIP:32319的原因。您可以在这里阅读有关NodePort服务的更多信息:https://kubernetes.io/docs/concepts/services-networking/service/#nodeport

此外,您还应该看到LoadBalancer外部IP永远处于Pending状态,这意味着未创建任何真正的Load Balancer。因为您没有在云中运行,并且没有Load Balancer的提供程序。因此,根据您的情况,您只能通过Kube节点上的ClusterIP:88或Kubernetes集群外部的NodeIP:32319来访问Load Balancer服务。

答案 1 :(得分:0)

Kubernetes上的Load Balancer是一项功能,它将在Cloud Provider端创建一个Load Balancer。因此,如果您的kubernetes不在GCP,AWS或Azzure等云服务提供商上,则不会创建真正的负载均衡器