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