无法使用NodePort访问本地kubernetes集群中的服务

时间:2018-11-01 16:19:52

标签: kubernetes

我有以下清单

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-redis
spec:
  selector:
    matchLabels:
      app: my-redis
  replicas: 1
  template:
    metadata:
      labels:
        app: my-redis
    spec:
      containers:
       - name: my-redis
         image: redis
         ports:
         - name: redisport1
           containerPort: 6379
           hostPort: 6379

---
apiVersion: v1
kind: Service
metadata:
  name: redis-service
  labels:
    app: my-redis
spec:
  type: NodePort
  selector:
    name: my-redis
  ports:
  - name: redisport1
    port: 6379
    targetPort: 6379
    nodePort: 30036
    protocol: TCP

这是一个重现我的问题的示例。我的目的是创建一个简单的集群,其中包含一个带有redis容器的pod,并且应该将其公开给我的本地主机。尽管如此,获取服务仍然为我提供以下输出:

redis-service   NodePort    10.107.233.66   <none>        6379:30036/TCP   10s

如果我用LoadBalancer交换NodePort,我会得到一个外部IP,但是端口仍然不起作用。

能帮我确定为什么我无法将6379端口映射到本地主机吗?

谢谢

3 个答案:

答案 0 :(得分:2)

不需要hostPort:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-redis
spec:
  selector:
    matchLabels:
      app: my-redis
  replicas: 1
  template:
    metadata:
      labels:
        app: my-redis
    spec:
      containers:
       - name: my-redis
         image: redis
         ports:
         - name: redisport1
           containerPort: 6379


---
apiVersion: v1
kind: Service
metadata:
  name: redis-service
  labels:
    app: my-redis
spec:
  type: NodePort
  selector:
    name: my-redis
  ports:
  - name: redisport1
    port: 6379
    targetPort: 6379
    nodePort: 30036
    protocol: TCP

现在nodePort 30036可用于访问任何辅助节点上的服务。

如果群集节点在其他位置,并且您想使端口在本地客户端上可用,则只需执行kubectl端口转发

kubectl port-forward svc/redis-service 6379:6379

https://kubernetes.io/docs/tasks/access-application-cluster/port-forward-access-application-cluster/

注意:

  • k8的本地安装不支持负载均衡器的服务类型
  • ClusterIP是Pod网络上的IP
  • 节点IP是运行k8s集群的某些计算机的IP

答案 1 :(得分:1)

为了通过节点端口访问您的应用,您必须使用此URL http://{node ip}:{node port}

如果您使用minikube,则您的minikube ip是节点ip。您可以使用minikube ip命令来检索它。

您还可以使用minikube service redis-service --url命令来获取通过节点端口访问应用程序的URL。

答案 2 :(得分:1)

对于任何对此问题感兴趣的人,我都发现了问题。修复Ijaz之后,我还需要更改选择器以匹配吊舱中的标签,这是我的错字!

pod具有“ app = my-redis”标签,但服务选择器具有“ name = my-redis”。匹配它们可以解决访问问题。