gpt4 book ai didi

docker - 如何在本地访问 nginx 入口?

转载 作者:行者123 更新时间:2023-12-02 18:43:54 30 4
gpt4 key购买 nike

我无法连接到使用 nginx 入口运行的应用程序(Docker Desktop win 10)。

nginx-ingress Controller pod 正在运行,应用程序运行良好,并且我创建了一个入口。但是,当我尝试在 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:
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
  • 安装 Docker for Windows 并启用 Kubernetes
  • 连接 kubectl
  • 启用入口
  • 创建部署
  • 创建服务
  • 创建入口资源
  • 将主机添加到本地主机文件
  • 测试

  • 启用 Hyper-V
    从具有管理员访问权限的 Powershell 运行以下命令: Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All系统可能会要求您重新启动计算机。
    安装 Docker for Windows 并启用 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: 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将主机添加到本地主机文件中
    我找到了 Github link 这将允许您通过 hostname 连接到您的 Ingress 资源.
    要实现这一点,请添加一行 127.0.0.1 hello-test.internal给您的 C:\Windows\System32\drivers\etc\hosts文件并保存。
    您将需要管理员权限才能执行此操作。
    编辑:最新版本的 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。

    关于docker - 如何在本地访问 nginx 入口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59255445/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com