为了进行测试,我使用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访问?
答案 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等云服务提供商上,则不会创建真正的负载均衡器