无法访问kubernetes上的暴露端口

时间:2019-01-10 19:10:40

标签: kubernetes kubernetes-service

我已经构建了一个自定义的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

但是问题是我无法访问它。
如果我登录到窗格(kubectl exec -it tcserver -- /bin/bash),则可以执行curl -k -v http://localhost,它将回复。

我相信我的服务做错了,但我不知道怎么办。
任何帮助将不胜感激。

SVC更改
正如sfgroups所建议的那样,我在svc中添加了targetPort: 80,但仍然无法正常工作。

当我尝试卷曲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>

2 个答案:

答案 0 :(得分:3)

当您查看kubectl describe service输出时,您会发现它实际上没有连接到任何吊舱:

Endpoints:              <none>

那是因为您在服务规范中说,该服务将附加到带有app: tcserver

的标签为 的容器
spec:
  selector:
    app: tcserver

但是,在pod规范的元数据中,您根本没有指定任何标签

metadata:
  name: tcserver
  namespace: default
  # labels: {}

所以这里的解决方法是将适当的标签添加到pod spec

metadata:
  labels:
    app: tcserver

还请注意,在实践中部署裸露的吊舱有点不寻常。通常,它们被封装在一个更高级别的控制器中,通常是一个部署,该部署实际上创建了Pod。部署规范具有模板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: [...]

答案 1 :(得分:0)

我看到目标职位丢失了,您可以添加traget端口并进行测试吗?

apiVersion: v1
kind: Service
metadata:
  name: tcserver-svc
  labels:
    app: tcserver
spec:
  type: NodePort
  ports:
  - port: 80
    nodePort: 30080
    targetPort: 80
  selector:
    app: tcserver