【发布时间】:2018-09-11 00:05:31
【问题描述】:
我正在使用 Kubernetes 和 Docker 运行一个 dotnet 核心应用程序。
设置如下:
应用程序
在 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 图像
在 Dockerfile 我有以下内容:
EXPOSE 8080
我理解这意味着容器是使用暴露的 8080 端口构建的。
问题 1:……这是否一定意味着容器的 8080 映射到了应用的 8080?如果没有,我该如何映射?
KUBERNETES (MINIKUBE)
在 Kubernetes 中(在 Minikube 上本地运行),然后我使用复制控制器创建 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 的连接?
任何帮助将不胜感激。
【问题讨论】:
-
看起来您正在绑定环回接口
IPAddress.Loopback,当您的应用位于容器中时,该接口将不起作用。 -
感谢您这么快回复我!有什么办法解决这个问题?
-
试试
IPAddress.Any -
粗略解释为什么在我的回答中 - stackoverflow.com/questions/48977194/…
-
我试过 IPAddress.Any 并得到相同的结果。我想知道这是否与暴露端口有关。
标签: docker kubernetes port dockerfile minikube