当前位置: 首页 > 面试题库 >

如何在本地访问nginx入口?

慕嘉茂
2023-03-14
问题内容

我无法连接到以nginx入口运行的应用程序(Docker桌面赢10)。

nginx-
ingress控制器容器正在运行,应用程序运行良好,并且我已经创建了一个入口。但是,当我尝试连接到本地主机上的应用程序时,出现“连接被拒绝”的提示。

我在日志中看到此错误:

[14:13:13.028][VpnKit            ][Info   ] vpnkit.exe: Connected Ethernet interface f6:16:36:bc:f9:c6

[14:13:13.028][VpnKit            ][Info   ] vpnkit.exe: UDP interface connected on 10.96.181.150

[14:13:22.320][GoBackendProcess  ][Info   ] Adding vpnkit-k8s-controller tcp forward from 0.0.0.0:80 to 10.96.47.183:80
[14:13:22.323][ApiProxy          ][Error  ] time="2019-12-09T14:13:22-05:00" msg="Port 443 for service ingress-nginx is already opened by another service"

我认为端口443已由其他应用程序使用,可能是zscaler安全性或skype。摘录自netstat -a -b

 [svchost.exe]
  TCP    0.0.0.0:443            0.0.0.0:0              LISTENING       16012
 [com.docker.backend.exe]
  TCP    0.0.0.0:443            0.0.0.0:0              LISTENING       8220

我不知道如何使入口工作。请帮忙!

我的入口:

$ kubectl describe ing kbvalues-deployment-dev-ingress
Name:             kbvalues-deployment-dev-ingress
Namespace:        default
Address:          localhost
Default backend:  default-http-backend:80 (<none>)
Rules:
  Host       Path  Backends
  ----       ----  --------
  localhost
             /   kbvalues-deployment-dev-frontend:28000 (10.1.0.174:8080)
Annotations:
  kubernetes.io/ingress.class:                     nginx
  nginx.ingress.kubernetes.io/cors-allow-headers:  X-Forwarded-For, X-app123-XPTO
Events:
  Type    Reason  Age               From                      Message
  ----    ------  ----              ----                      -------
  Normal  CREATE  42m               nginx-ingress-controller  Ingress default/kbvalues-deployment-dev-ingress
  Normal  UPDATE  6s (x5 over 42m)  nginx-ingress-controller  Ingress default/kbvalues-deployment-dev-ingress

我的服务:

$ kubectl describe svc kbvalues-deployment-dev-frontend
Name:              kbvalues-deployment-dev-frontend
Namespace:         default
Labels:            chart=tomcat-sidecar-war-1.0.4
                   environment=dev
                   name=kbvalues-frontend-dev
                   release=kbvalues-test
                   tier=frontend
Annotations:       <none>
Selector:          app=kbvalues-dev
Type:              ClusterIP
IP:                10.98.89.94
Port:              <unset>  28000/TCP
TargetPort:        8080/TCP
Endpoints:         10.1.0.174:8080
Session Affinity:  None
Events:            <none>

我正在尝试通过以下位置访问该应用程序http://localhost:28000/health。我验证了/health可以在Web服务器容器中本地访问URL。

感谢您提供的任何帮助。

编辑:

我尝试更改ingress-
nginx服务以删除HTTPS,如下所示:https :
//stackoverflow.com/a/56303330/166850

这摆脱了日志中的443错误,但没有解决我的设置(仍然拒绝连接)。

编辑2: 这是Ingress YAML定义(kubectl get -o yaml):

$ kubectl get ing -o yaml
apiVersion: v1
items:
- apiVersion: extensions/v1beta1
  kind: Ingress
  metadata:
    annotations:
      kubernetes.io/ingress.class: nginx
    creationTimestamp: "2019-12-09T18:47:33Z"
    generation: 5
    name: kbvalues-deployment-dev-ingress
    namespace: default
    resourceVersion: "20414"
    selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/kbvalues-deployment-dev-ingress
    uid: 5c34bf7f-1ab4-11ea-80e4-00155d169409
  spec:
    rules:
    - host: localhost
      http:
        paths:
        - backend:
            serviceName: kbvalues-deployment-dev-frontend
            servicePort: 28000
          path: /
  status:
    loadBalancer:
      ingress:
      - hostname: localhost
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""

编辑3: 输出kubectl get svc -A(仅入口线):

ingress-nginx   ingress-nginx                      LoadBalancer   10.96.47.183     localhost     80:30470/TCP             21h

编辑4: 我试图从Windows HyperV获取VM的IP地址,但似乎VM没有IP?

PS C:\> (Get-VMNetworkAdapter -VMName DockerDesktopVM)

Name            IsManagementOs VMName          SwitchName MacAddress   Status IPAddresses
----            -------------- ------          ---------- ----------   ------ -----------
Network Adapter False          DockerDesktopVM DockerNAT  00155D169409 {Ok}   {}

编辑5:

netstat -a -n -o -b端口80的输出:

  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       4
 Can not obtain ownership information

问题答案:

我已经设法在Windows的Docker上的Kubernetes中创建Ingress资源。

重现步骤

  • 启用Hyper-V
  • 安装适用于Windows的Docker并启用Kubernetes
  • 连接kubectl
  • 启用入口
  • 创建部署
  • 建立服务
  • 创建入口资源
  • 将主机添加到本地主机文件
  • 测试

启用[Hyper-V](https://docs.microsoft.com/pl-pl/virtualization/hyper-v-on-

windows/quick-start/enable-hyper-v)

在具有管理员访问权限的Powershell中,运行以下命令:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All

系统可能会要求您重新启动计算机。

安装适用于Windows的Docker并启用Kubernetes

使用所有默认选项安装Docker应用程序并启用Kubernetes

连接kubectl

安装kubectl。

启用入口

运行以下命令:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml



kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud-generic.yaml

编辑: 确保没有其他服务正在使用端口80

重新启动机器。在cmd以管理员身份运行的提示下,执行以下操作:使用 net stop http 停止列出的服务services.msc

使用:netstat -a -n -o -b检查端口80上侦听的其他进程。

创建部署

以下是具有可响应请求的Pod的简单部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello
spec:
  selector:
    matchLabels:
      app: hello
      version: 2.0.0
  replicas: 3
  template:
    metadata:
      labels:
        app: hello
        version: 2.0.0
    spec:
      containers:
      - name: hello
        image: "gcr.io/google-samples/hello-app:2.0"
        env:
        - name: "PORT"
          value: "50001"

通过运行命令应用它:

$ kubectl apply -f file_name.yaml

建立服务

为了使Pod能够与您进行通信,您需要创建服务。

下面的例子:

apiVersion: v1
kind: Service
metadata:
  name: hello-service
spec:
  type: NodePort
  selector:
    app: hello
    version: 2.0.0
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 50001

通过运行以下命令来应用此服务定义:

$ kubectl apply -f file_name.yaml

创建入口资源

以下是使用上面创建的服务的简单Ingress资源:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: hello-ingress 
spec:
  rules:
  - host: kubernetes.docker.internal
    http:
      paths:
      - path: /
        backend:
          serviceName: hello-service 
          servicePort: http

看一眼:

spec:
  rules:
  - host: hello-test.internal

hello-test.internal将用作hostname连接到您的广告连播。

通过调用命令来应用您的Ingress资源:

$ kubectl apply -f file_name.yaml

将主机添加到本地主机文件

我找到了这个Github链接,该链接可让您通过连接到Ingress资源hostname

为此,127.0.0.1 hello- test.internal请在C:\Windows\System32\drivers\etc\hosts文件中添加一行并保存。您将需要管理员权限才能执行此操作。

编辑: Windows的最新版本的Docker桌面已经添加了一个主机文件条目: 127.0.0.1 kubernetes.docker.internal

测试

通过调用命令显示有关Ingress资源的信息: kubectl get ingress

它应该显示:

NAME            HOSTS                 ADDRESS     PORTS   AGE
hello-ingress   hello-test.internal   localhost   80      6m2s

现在,您可以打开网络浏览器并输入以下内容来访问Ingress资源

http://kubernetes.docker.internal/

浏览器应输出:

Hello, world!
Version: 2.0.0
Hostname: hello-84d554cbdf-2lr76

Hostname: hello-84d554cbdf-2lr76 是所回复的广告连播的名称。

:如果此解决方案不工作与命令请检查连接 netstat -a -n -o使用管理员权限 ,如果事情没有使用端口80)。



 类似资料:
  • 问题内容: 在Angular2中,您可以在其中有一个文件夹/ data /和一个json文件,并且可以在localhost:4200 / data / something.json中访问它。 在Angular4中不再可能。 任何想法如何使其起作用? 问题答案: 您可以使用此代码 这是您的本地json文件。 另请参阅angular-cli的changlog路径 https://github.com/

  • 问题内容: 如果要动态使用全局函数和变量,可以使用: 是否可以对本地范围内的变量执行相同的操作? 这段代码可以正常工作,但是目前使用eval,我正在尝试其他方法。 问题答案: 不,就像新月说的那样。在下面,您可以找到一个示例,该示例说明如何在不使用eval的情况下但使用内部私有对象进行实施。

  • 问题内容: 我正在玩spring-boot-sample-data-elastcisearch项目。我更改了pom并添加了: 与嵌入式Tomcat一起运行。我的application.properties有 我希望能够连接到localhost:9200以便使用elasticsearch-head或其他JS客户端。我想念什么?谢谢米兰 问题答案: 您应该自己定义它,因为NodeClientFacto

  • 我正在使用Dropwizard web服务来访问许多parquet文件,我需要使用“真正的”sql(字符串)而不是spark DDL(我已经尝试过了,但没有满足我的需要)。我在独立模式下使用spark从eclipse启动服务。Spark版本是1.4.1。 问题是spark不能解析普通SQL中的parquet引用,如下所示:(我在./bro/conn.parquet中启动web服务的文件夹中有一个测

  • 本文向大家介绍Nginx 禁止IP访问如何实现,包括了Nginx 禁止IP访问如何实现的使用技巧和注意事项,需要的朋友参考一下 Nginx 禁止IP访问 我们在使用的时候会遇到很多的恶意IP攻击,这个时候就要用到Nginx 禁止IP访问了。下面我们就先看看Nginx的默认虚拟主机在用户通过IP访问,或者通过未设置的域名访问(比如有人把他自己的域名指向了你的ip)的时候生效最关键的一点是,在serv

  • 在开发机的Web服务器上托管一个站点,然后在Android设备上访问站点内容。 通过USB数据线和Chrome DevTools,您可以在开发机上运行站点,然后在Android设备上查看该网站。 TL;DR 端口转发可以使你在Android设备上查看开发机Web服务器中的内容。 如果你的Web服务器使用自定义域,您可以将Android设备设置为使用自定义域映射访问该域中的内容。 设置端口转发 端口