kubernetes 如何在本地访问nginx ingress?

91zkwejq  于 2023-04-11  发布在  Kubernetes
关注(0)|答案(5)|浏览(154)

我无法连接到运行nginx ingress(Docker Desktop win 10)的应用程序。
nginx-ingress控制器pod正在运行,应用程序正常,我已经创建了一个ingress。但是,当我尝试连接到localhost上的应用程序时,我得到“连接拒绝”。
我在日志中看到这个错误:

[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 security或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 URL可以在Web服务器容器中本地访问。
我很感激你能提供的任何帮助。

编辑:

我尝试修改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:

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

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

epfja78i1#

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

复制步骤

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

启用Hyper-V

从具有管理员访问权限的PowerShell运行以下命令:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
系统可能会要求您重新启动计算机。

安装Windows版Docker并开启Kubernetes

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

连接kubectl

安装kubectl。

开启Ingress

运行以下命令:

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端口

重新启动计算机。在以admin身份运行的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资源

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

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

请看:

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

hello-test.internal将用作hostname连接到您的pod。
通过调用以下命令来应用Ingress资源:
$ kubectl apply -f file_name.yaml

将host添加到本地hosts文件中

我发现这个Github link可以让你通过hostname连接到你的Ingress资源。
要做到这一点,请在C:\Windows\System32\drivers\etc\hosts文件中添加一行127.0.0.1 hello-test.internal并保存它。您需要管理员权限才能执行此操作。

**编辑:**最新版本的Docker Desktop for Windows已经添加了hosts文件条目:127.0.0.1 kubernetes.docker.internal

测试

调用命令显示Ingress资源信息:kubectl get ingress
应显示:

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

现在,您可以通过打开Web浏览器并键入以下内容来访问Ingress资源
http://kubernetes.docker.internal/
浏览器应输出:

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

Hostname: hello-84d554cbdf-2lr76是回复的pod的名称。
如果此解决方案不起作用,请使用以下命令检查连接:netstat -a -n -o具有管理员权限),如果没有使用端口80。

nr9pn0ug

nr9pn0ug2#

在Windows上,Kubernetes集群在VM中运行。尝试在该VM的IP地址而不是localhost上访问ingress。

3pvhb19x

3pvhb19x3#

如果你想在localhost上访问ingress,而不需要任何特殊的主机名,只要启用ingress nginx控制器就足够了:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
您甚至不需要在Ingress中指定-host参数。如果您有一个特殊的主机名,例如my-test.com,您必须将域添加到/etc/hosts文件中。
我希望它能帮助某人!

hmtdttj4

hmtdttj44#

我面临着类似的问题,而部署ingress-nginx控制器使用手动步骤提到的bareMetal节点在ingress-nginx-deploy,但面临着一个问题,但提到的链接Github link提到的@RMorrisey,导致其他线程,他们提到安装ingress-nginx使用步骤提到的mac和它的工作没有作出cny更改主机文件等

twh00eeo

twh00eeo5#

问题是你的服务有一个ClusterIP类型,这是外部无法访问的。你需要它是NodePort类型,这是在Dawid Kruk的指令中完成的。

相关问题