我的本地PC上有3个虚拟机(ubuntu 18 lts):1个是主机,2个是节点。我能够安装kubernetes,也可以设置我的应用程序。
我的应用程序由3部分组成:数据库,后端和前端。对于这些部分,我已经创建并部署了服务。我想将FE服务公开到群集之外,以便能够从节点之一访问它。
服务描述如下:
apiVersion: v1
kind: Service
metadata:
name: fe-deployment
labels:
run: fe-srv
spec:
ports:
- protocol: TCP
port: 8085
targetPort: 80
selector:
app: fe
type: NodePort
的输出
kubectl获取节点-o宽
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8node1 Ready <none> 2d22h v1.16.0 172.17.199.105 <none> Ubuntu 18.04.3 LTS 5.0.0-29-generic docker://18.9.7
k8node2 Ready <none> 2d22h v1.16.0 172.17.199.110 <none> Ubuntu 18.04.3 LTS 5.0.0-29-generic docker://18.9.7
kubectl获得广泛的服务
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
be-deployment ClusterIP 10.96.169.225 <none> 8080/TCP 2d22h app=be
db-deployment ClusterIP 10.110.14.88 <none> 3306/TCP 2d22h app=db
fe-deployment NodePort 10.104.211.32 <none> 8085:32476/TCP 2d21h app=fe
我希望使用一个节点IP和节点端口能够从浏览器访问我的FE,但这是行不通的。
我想念什么?如何从群集外部访问我的FE?
修改
基于documentation,NodePort服务类型应:
在静态端口(NodePort)的每个节点的IP上公开服务。将自动创建NodePort服务路由到的ClusterIP服务。您可以通过请求NodeIP:NodePort
从集群外部联系NodePort服务。
我知道我将使用节点IP和静态端口从群集外部访问我的服务。从节点IP语句中,我知道它是指计算机(在我的情况下为VM)IP。
稍后编辑
我已经检查了防火墙,并且似乎在所有机器上都将其禁用:
sudo ufw状态
状态:无效
稍后再编辑
正如我在评论中告诉的那样,尝试通过telnet到IPv4地址没有用。尝试使用IPv6在本地主机上也可以使用以太网接口IPv6 IP。
netstat输出为:
netstat -6 -a | grep 324
tcp6 1 0 [::]:32476 [::]:* LISTEN
尽管它可以正常工作(基于我在互联网上阅读的信息),但它不适用于IPv4。有办法改变吗?
稍后再编辑
这似乎是bug
答案 0 :(得分:0)
您可以将EXTERNAL-IP
服务的fe
分配为IP地址(如果是节点)。
然后您可以检查:curl -k http://EXTERNAL-IP:PORT
EXTERNAL-IP是IP地址服务器的节点。
答案 1 :(得分:0)
在您的情况下,由于未定义sm
,因此kubernetes将端口nodePort
随机分配给您的服务。要访问该服务,请访问32476
(kubernetes-docs)。
如果要分配特定的端口,则需要在服务定义中定义<EXTERNAL-NODE-IP>:32476
(基于nginx的入口示例):
nodePort
答案 2 :(得分:0)
将服务作为节点端口公开时,您不会获得外部IP。
在节点端口上公开服务意味着您可以通过群集中任何节点的NodeIP在30000-32767(默认行为)之间的随机端口上从外部使用您的服务。
集群中的每个节点都将该端口(每个节点上的端口号相同)代理到启动服务的容器中。
从您的kubectl get service -o wide
输出中:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
fe-deployment NodePort 10.104.211.32 <none> 8085:32476/TCP 2d21h app=fe
我们可以发现提供服务的端口是端口 32476
。
从您的kubectl get node -o wide
输出中:
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8node1 Ready <none> 2d22h v1.16.0 172.17.199.105 <none> Ubuntu 18.04.3 LTS 5.0.0-29-generic docker://18.9.7
k8node2 Ready <none> 2d22h v1.16.0 172.17.199.110 <none> Ubuntu 18.04.3 LTS 5.0.0-29-generic docker://18.9.7
我们发现您的节点ip为: 172.17.199.105
和 172.17.199.110
您现在可以使用<Node-IP>:<Node-Port>
从外部访问服务。
因此,在您的情况下,这些是 172.17.199.105:32476
和 172.17.199.110:32476
,具体取决于您要访问服务的节点。
此外,如果您需要固定的Node端口,则可以在Yaml中指定。
您需要确保在节点上添加安全规则,以允许特定端口上的流量。