我正在使用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 IMAGE

在Dockerfile中,我具有以下内容:
EXPOSE 8080

我理解这意味着该容器使用暴露的8080端口构建。

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

KUBERNETES(MINIKUBE)

然后,在Kubernetes(在Minikube上本地运行)内,使用复制 Controller 创建3个Pod,每个Pod包含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个Pod的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

关于docker - 使用Docker的Kubernetes无法从默认端口80更改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49599985/

10-10 20:05
查看更多