如何从局域网中的其他计算机访问服务?

时间:2020-10-14 09:16:54

标签: kubernetes kubernetes-ingress minikube portforwarding kubernetes-service

你好,我正在用minikube学习kubernetes。我可以在运行minikube的计算机上通过minikubeip:NodePort访问服务,现在我想从其他计算机通过LAN访问该服务。我尝试了Ingress,但对我没有用。

部署文件:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: aspnetapp-deployment
  labels:
    app: aspnetapp
spec:
  replicas: 2
  selector:
    matchLabels:
      app: aspnetapp
  template:
    metadata:
      labels:
        app: aspnetapp
    spec:
      containers:
        - name: aspnetapp-cn
          image: localhost:5000/aspnetapp
          ports: 
            - containerPort: 80

服务文件:

---
apiVersion: v1
kind: Service
metadata:
    name: aspnetapp-service
spec:
    type: NodePort
    ports:
    - name: http
      targetport: 80      
      port: 80
      protocol: TCP
    selector:
      app: aspnetapp

入口文件:

---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: aspnetapp-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - host:
      http:
        paths:
        - path: /aspnetapp
          backend:
            serviceName: aspnetapp-service
            servicePort: 80

2 个答案:

答案 0 :(得分:1)

要使用--docker驱动程序通过Ubuntu将应用程序公开到LAN,可以使用:

  • $ kubectl port-forward ...

免责声明!

  1. 您的$ kubectl port-forward应该在运行minikube的主机上运行。
  2. 以上命令将连续运行(&可用于在后台运行)

示例:

假设您有一台IP地址为192.168.0.115的Ubuntu计算机。

我使用nginx图片创建了一个示例:

Deployment.yaml

apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

关于公开Deployment的服务,您可以任一

  • 使用以下命令:
    • $ kubectl expose deployment nginx --port=80 --type=NodePort
  • 使用以下定义:
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80   


您可以通过两种方式公开nginx

  • 直接与$ kubectl port-forward联系。
  • 将流量定向到Ingress控制器。

直接访问

您可以通过以下方式直接暴露Service,而无需使用Ingress

  • $ kubectl port-forward --address=0.0.0.0 deployment/nginx 10000:80

剖析以上命令:

  • --address=0.0.0.0-在本地主机之外公开
  • deployment/nginx-资源/资源名称
  • 10000:80-主机上的端口/ pod上的端口,用于将流量发送到

分配1024以下的本地端口将需要root访问权限!

您将需要登录到root用户,然后将.kube/config复制到/root/目录或指定kubectl在哪里寻找配置!

运行上述命令后,您应该可以运行:

  • curl 192.168.1.115:10000

命令$ kubectl port-forward将生成:

Forwarding from 0.0.0.0:10000 -> 80 # AT THE START
Handling connection for 10000 # CURL FROM 192.168.0.2

将流量定向到Ingress控制器

您需要运行$ minikube addons enable ingress才能具有Ingress资源的功能

在您的示例中,您使用了Ingress资源。在这种情况下,您应该:

  • 创建Ingress资源(与您一样)。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
spec:
  rules:
  - host:
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx
          servicePort: 80
  • 将流量转发到Ingress控制器!

Ingress控制器在收到流量后会进一步将其转发(先到您的Service,再到Pod

要将流量转发到您的Ingress控制器,请运行以下命令:

  • kubectl port-forward --address=0.0.0.0 --namespace=kube-system deployment/ingress-nginx-controller 80:80

再次剖析以上命令:

  • --address=0.0.0.0-在本地主机之外公开
  • --namespace=kube-system-Deployment控制器的Ingress所在的命名空间
  • deployment/ingress-nginx-controller-资源/资源名称
  • 80:80-主机上的端口/ pod上的端口,用于将流量发送到

命令$ kubectl port-forward将生成:

Forwarding from 0.0.0.0:80 -> 80 # AT THE START 
Handling connection for 80 # CURL FROM 192.168.0.2

我也建议您使用其他--driver,例如Virtualbox。您无需使用$ kubectl port-forward(NAT)就可以公开您的应用程序。

其他资源:

答案 1 :(得分:0)

入口选项似乎不起作用: kubectl port-forward --address=0.0.0.0 --namespace=kube-system deployment/ingress-nginx-controller 80:80

我收到以下错误: 错误:无法转发端口,因为 pod 未运行。当前状态=待定

minikube 版本是 v1.20.0 入口控制器版本为 v0.44.0

示例设置: 尝试从同一 LAN 中的另一台机器访问部署在 minikube 集群中的 Web 服务。在主机中,服务的访问方式类似于“http://express.api/users”。 'express.api' 使用主机文件中的条目解析为入口 IP 地址。