【问题标题】:How to access a service from other machine in LAN?如何从局域网中的其他机器访问服务?
【发布时间】:2021-01-28 16:10:14
【问题描述】:

您好,我正在使用 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

【问题讨论】:

  • 您好,很高兴您已成功连接到主机上的应用程序。为了能够进一步帮助您,您需要知道您使用的是哪个操作系统以及您的 minikube 使用的 --driver
  • 您好,非常感谢您的重播,我的驱动程序是 docker,我使用的是 ubuntu

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


【解决方案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 by:

  • $ 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 - DeploymentIngress 控制器所在的命名空间
  • 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) 的情况下公开您的应用程序。

其他资源:

【讨论】:

  • 非常感谢您的帮助!我首先使用了没有入口的 portforward 选项,它对我有用
【解决方案2】:

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

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

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

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

【讨论】:

  • kubectl port-forward --address=0.0.0.0 --namespace=kube-system deployment/ingress-nginx-controller 80:80 指向需要指向入口的“部署” -nginx-controller '服务'
  • 在 minikube 升级到 v1.20.0 后,'ingress-nginx-controller' pod 似乎处于挂起状态(检查 'kubectl get pods -n kube-system' 的输出)。重新启用一次入口插件后,Pod 将其状态更改为正在运行(不确定确切原因)。这是错误的原因:错误:无法转发端口,因为 pod 没有运行。 Current status=Pending 下面的命令在重新启用入口控制器后工作。 kubectl port-forward --address=0.0.0.0 --namespace=kube-system 部署/ingress-nginx-controller 80:80
  • 在最近安装的 minikube 中,我注意到入口控制器的命名空间更改为“ingress-nginx”。在这种情况下,以下命令有效:kubectl port-forward --address=0.0.0.0 --namespace=ingress-nginx deployment/ingress-nginx-controller 80:80
猜你喜欢
  • 2012-12-11
  • 2022-12-04
  • 2015-12-07
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 2012-08-02
相关资源
最近更新 更多