在Prem上的k8s上访问服务

时间:2019-09-30 13:37:50

标签: kubernetes

我的本​​地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

3 个答案:

答案 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中指定。

您需要确保在节点上添加安全规则,以允许特定端口上的流量。