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 端点访问我的应用程序。
感谢所有提出建议的人。
我是 运行 一个使用 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
:
{
"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 端点访问我的应用程序。
感谢所有提出建议的人。