Docker 的 Kubernetes 无法更改默认端口 80

Kubernetes with Docker unable to change from default port of 80

我是 运行 一个使用 Kubernetes 和 Docker 的 dotnet 核心应用程序。

设置如下:

APP

在 dotnet 核心应用程序中,我通过在 Program.cs 中设置以下内容让 Kestrel 服务器侦听端口 8080:

public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
    .UseStartup<Startup>()
    .UseKestrel(options =>
    {
        options.Listen(IPAddress.Loopback, 8080);
    })
    .Build();

我已经在本地测试了应用构建,端点在 localhost:8080/api/test 上按预期工作。

DOCKER 图片

在 Docker 文件中我有以下内容:

EXPOSE 8080

我理解这意味着容器是用一个暴露的 8080 端口构建的。

问题 1:...这是否一定意味着容器的 8080 映射到应用程序的 8080?如果没有,我该如何映射?

KUBERNETES (MINIKUBE)

在 Kubernetes 中(运行 在 Minikube 本地),然后我使用复制控制器创建 3 个 pods,每个包含 1 个 docker 容器和应用程序。我的 RC 文件如下所示:

{
    "apiVersion": "v1",
    "kind": "ReplicationController",
    "spec": {
        "replicas": 3,
        "selector": {
            "app": "myApp"
        },
        "template": {
            "metadata": {
                "labels": {
                    "app": "myApp"
                }
            },
            "spec": {
                "containers": [
                    {
                        "name": "my-app",
                        "image": "myname/myapp:1.0",
                        "ports": [
                            {
                                "containerPort": 8080
                            }
                        ]
                    }
                ]
            }
        }
    }
}

通知"ports": [{ "containerPort": 8080 }]。按照我的理解,这意味着我要暴露的容器端口是8080。

然后我有一个 Kubernetes 服务,它通过端点 [minikubeIPAddress]:30001:

公开我的 3 pods' 8080 端口
{
    "apiVersion": "v1",
    "kind": "Service",
    "spec": {
        "type": "NodePort",
        "ports": [
            {
                "port": 8080,
                "nodePort": 30001,
                "protocol": "TCP"
            }
        ],
        "selector": {
            "app": "myApp"
        }
    }
}

当我尝试访问端点时 [minikubeIPAddress]:30001/api/test 我收到“无法访问站点”错误。

今天早上当我使用默认的 HTTP 端口 80 时它可以正常工作。唯一的变化是端口号。

问题 2:...我在这里遗漏了什么吗?是否有沿线的连接仍然映射到默认端口 80?

如有任何帮助,我们将不胜感激。

使用 "targetPort" 指示您的 pod 正在侦听的端口。你的 yaml 规范应该是这样的:

---
apiVersion: v1
kind: Service
metadata:
  name: myApp
spec:
  selector:
    app: myApp
  ports:
  - name: http
    port: 8080
    targetPort: 8080
    nodePort: 30001

经过反复试验,我找到了解决方案。

根据@johnharris85 和@Yuankun 所说的需要将 IP 地址设置为 'any' 而不是在本地主机上,我找到了这篇文章: http://blog.scottlogic.com/2016/09/05/hosting-netcore-on-linux-with-docker.html

dotnet 核心应用程序默认使用本地主机网络,而 运行 在本地测试机器上,这工作正常。但是,运行 Docker 容器内的 dotnet 应用程序意味着本地主机网络仅限于容器内。

为了解决这个问题,我最初改变了

options.Listen(IPAddress.Loopback, 8080);

options.Listen(IPAddress.Any, 8080);

但是,我在本地对此进行了测试,但无法让应用响应。我认为这意味着这不是一个有效的解决方案。 如果我使用容器化应用对其进行测试,这可能是一个有效的解决方案。

然后我看到了上述文章并决定尝试以下方法:

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
    .UseStartup<Startup>()
    .UseUrls("http://*:8080")
    .Build();

这解决了我的问题,现在可以通过 Kubernetes 端点访问我的应用程序。

感谢所有提出建议的人。