无法连接 Kubernetes NodePort 服务

问题描述 投票:0回答:3

我有一个使用以下内容创建的正在运行的 Pod

pod-definition.yaml

apiVersion: v1
kind: Pod
metadata:
    name: microservice-one-pod-name
    labels:
        app: microservice-one-app-label
        type: front-end
spec:
    containers:
    - name: microservice-one
      image: vismarkjuarez1994/microserviceone
      ports:
      - containerPort: 2019

然后我使用以下

service-definition.yaml
创建了一个服务:

kind: Service
apiVersion: v1
metadata:
  name: microserviceone-service
spec:
  ports:
    - port: 30008
      targetPort: 2019
      protocol: TCP
  selector:
    app: microservice-one-app-label
  type: NodePort

然后我运行

kubectl describe node minikube
来查找我应该连接到的节点 IP——结果是:

Addresses:
  InternalIP:  192.168.49.2
  Hostname:    minikube

但是当我运行以下curl命令时没有得到任何响应:

curl 192.168.49.2:30008

当我尝试从浏览器访问

192.168.49.2:30008
时,请求也会超时。

pod 日志显示容器已启动并正在运行。为什么我无法访问我的服务?

kubernetes kubernetes-pod kubernetes-service
3个回答
7
投票

问题是您尝试通过

port
参数访问您的服务,该参数是暴露服务的内部端口,即使使用
NodePort
类型也是如此。

您要搜索的参数称为

nodePort
,可以选择与
port
targetPort
一起指定。引用文档

默认情况下,为了方便起见,Kubernetes 控制平面将 从某个范围分配端口(默认:

30000-32767

由于您没有指定

nodePort
,因此会自动选取该范围内的一个。您可以通过以下方式检查哪一个:

kubectl get svc -owide

然后在该端口从外部访问您的服务。

作为替代方案,您可以将服务定义更改为:

kind: Service
apiVersion: v1
metadata:
  name: microserviceone-service
spec:
  ports:
    - port: 30008
      targetPort: 2019
      nodePort: 30008
      protocol: TCP
  selector:
    app: microservice-one-app-label
  type: NodePort

但请记住,您可能需要删除服务并重新创建它才能更改分配的

nodePort


3
投票

我认为您错过了服务中的端口:

apiVersion: v1
kind: Pod
metadata:
    name: microservice-one-pod-name
    labels:
        app: microservice-one-app-label
        type: front-end
spec:
    containers:
    - name: microservice-one
      image: vismarkjuarez1994/microserviceone
      ports:
      - containerPort: 2019

你的服务应该是这样的:

kind: Service
apiVersion: v1
metadata:
  name: microserviceone-service
spec:
  ports:
    - port: 2019
      targetPort: 2019
      nodePort: 30008
      protocol: TCP
  selector:
    app: microservice-one-app-label
  type: NodePort

如果您想尝试使用 Minikube 进行 Ingress,您可以在启用 Minikube ingress 后访问您的应用程序。

minikube addons enable ingress

0
投票

添加查看标签和添加标签的方式。 给豆荚贴标签是我解决这个问题的方法。

kubectl get pods --show-labels -n mynamespace
 
 
 
kubectl label pod nginx-66bccddb68-8tjpk -n mynamespace app=webserver

© www.soinside.com 2019 - 2024. All rights reserved.