无法访问 kubernetes 上的暴露端口
Unable to access exposed port on kubernetes
我已经构建了一个自定义的 tcserver 图像,公开了端口 80 8080 和 8443。基本上你有一个 apache,在配置中你有一个代理传递将它转发到 tcserver tomcat。
EXPOSE 80 8080 8443
之后我创建了一个 kubernetes yaml 来构建仅暴露端口 80 的 pod。
apiVersion: v1
kind: Pod
metadata:
name: tcserver
namespace: default
spec:
containers:
- name: tcserver
image: tcserver-test:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
还有随之而来的服务。
apiVersion: v1
kind: Service
metadata:
name: tcserver-svc
labels:
app: tcserver
spec:
type: NodePort
ports:
- port: 80
nodePort: 30080
selector:
app: tcserver
但问题是我无法访问它。
如果我登录到 pod (kubectl exec -it tcserver -- /bin/bash
),我可以执行 curl -k -v http://localhost
它会回复。
我认为我的服务有问题,但我不知道是什么。
任何帮助将不胜感激。
SVC 变化
根据 sfgroups 的建议,我将 targetPort: 80
添加到 svc,但仍然无法正常工作。
当我尝试 curl IP 时,我得到一个没有到主机的路由
[root@testmaster tcserver]# curl -k -v http://172.30.62.162:30080/
* About to connect() to 172.30.62.162 port 30080 (#0)
* Trying 172.30.62.162...
* No route to host
* Failed connect to 172.30.62.162:30080; No route to host
* Closing connection 0
curl: (7) Failed connect to 172.30.62.162:30080; No route to host
这是来自 svc 的描述:
[root@testmaster tcserver]# kubectl describe svc tcserver-svc
Name: tcserver-svc
Namespace: default
Labels: app=tcserver
Annotations: <none>
Selector: app=tcserver
Type: NodePort
IP: 172.30.62.162
Port: <unset> 80/TCP
NodePort: <unset> 30080/TCP
Endpoints: <none>
Session Affinity: None
Events: <none>
我看到目标 post 丢失了,你能添加目标端口并测试吗?
apiVersion: v1
kind: Service
metadata:
name: tcserver-svc
labels:
app: tcserver
spec:
type: NodePort
ports:
- port: 80
nodePort: 30080
targetPort: 80
selector:
app: tcserver
当您查看 kubectl describe service
输出时,您会发现它实际上并未附加到任何 pods:
Endpoints: <none>
那是因为您在服务规范中说该服务将附加到 pods labeled with app: tcserver
spec:
selector:
app: tcserver
但是,在 pod 规范的元数据中,您根本没有指定任何标签
metadata:
name: tcserver
namespace: default
# labels: {}
所以这里的解决方法是向 pod 规范添加适当的标签
metadata:
labels:
app: tcserver
另请注意,部署裸机在实践中有点不寻常。通常它们被包裹在一个更高级别的控制器中,通常是一个部署,它实际上创建了 pods。部署规范有一个模板 pod 规范,重要的是 pod 的标签。
apiVersion: apps/v1
kind: Deployment
metadata:
name: tcserver
# Labels here are useful, but the service doesn't look for them
spec:
template:
metadata:
labels:
# These labels are what the service cares about
app: tcserver
spec:
containers: [...]
我已经构建了一个自定义的 tcserver 图像,公开了端口 80 8080 和 8443。基本上你有一个 apache,在配置中你有一个代理传递将它转发到 tcserver tomcat。
EXPOSE 80 8080 8443
之后我创建了一个 kubernetes yaml 来构建仅暴露端口 80 的 pod。
apiVersion: v1
kind: Pod
metadata:
name: tcserver
namespace: default
spec:
containers:
- name: tcserver
image: tcserver-test:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
还有随之而来的服务。
apiVersion: v1
kind: Service
metadata:
name: tcserver-svc
labels:
app: tcserver
spec:
type: NodePort
ports:
- port: 80
nodePort: 30080
selector:
app: tcserver
但问题是我无法访问它。
如果我登录到 pod (kubectl exec -it tcserver -- /bin/bash
),我可以执行 curl -k -v http://localhost
它会回复。
我认为我的服务有问题,但我不知道是什么。
任何帮助将不胜感激。
SVC 变化
根据 sfgroups 的建议,我将 targetPort: 80
添加到 svc,但仍然无法正常工作。
当我尝试 curl IP 时,我得到一个没有到主机的路由
[root@testmaster tcserver]# curl -k -v http://172.30.62.162:30080/
* About to connect() to 172.30.62.162 port 30080 (#0)
* Trying 172.30.62.162...
* No route to host
* Failed connect to 172.30.62.162:30080; No route to host
* Closing connection 0
curl: (7) Failed connect to 172.30.62.162:30080; No route to host
这是来自 svc 的描述:
[root@testmaster tcserver]# kubectl describe svc tcserver-svc
Name: tcserver-svc
Namespace: default
Labels: app=tcserver
Annotations: <none>
Selector: app=tcserver
Type: NodePort
IP: 172.30.62.162
Port: <unset> 80/TCP
NodePort: <unset> 30080/TCP
Endpoints: <none>
Session Affinity: None
Events: <none>
我看到目标 post 丢失了,你能添加目标端口并测试吗?
apiVersion: v1
kind: Service
metadata:
name: tcserver-svc
labels:
app: tcserver
spec:
type: NodePort
ports:
- port: 80
nodePort: 30080
targetPort: 80
selector:
app: tcserver
当您查看 kubectl describe service
输出时,您会发现它实际上并未附加到任何 pods:
Endpoints: <none>
那是因为您在服务规范中说该服务将附加到 pods labeled with app: tcserver
spec:
selector:
app: tcserver
但是,在 pod 规范的元数据中,您根本没有指定任何标签
metadata:
name: tcserver
namespace: default
# labels: {}
所以这里的解决方法是向 pod 规范添加适当的标签
metadata:
labels:
app: tcserver
另请注意,部署裸机在实践中有点不寻常。通常它们被包裹在一个更高级别的控制器中,通常是一个部署,它实际上创建了 pods。部署规范有一个模板 pod 规范,重要的是 pod 的标签。
apiVersion: apps/v1
kind: Deployment
metadata:
name: tcserver
# Labels here are useful, but the service doesn't look for them
spec:
template:
metadata:
labels:
# These labels are what the service cares about
app: tcserver
spec:
containers: [...]