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

Aka*_*tov 5 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
Run Code Online (Sandbox Code Playgroud)

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

redis-service   NodePort    10.107.233.66   <none>        6379:30036/TCP   10s
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢,

Emr*_*ain 11

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

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

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


Aka*_*tov 10

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

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

  • 只需将服务选择器上的“name: my-redis”更改为“app: my-redis”。因为我在部署时设置了 matchLabels。 (2认同)

Ija*_*han 5

不需要主机端口:

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
Run Code Online (Sandbox Code Playgroud)

现在可以使用 nodePort 30036 访问任何工作节点上的服务。

如果集群节点在其他地方,并且您想让端口在本地客户端上可用,那么只需执行 kubectl port forward 即可

kubectl port-forward svc/redis-service 6379:6379
Run Code Online (Sandbox Code Playgroud)

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

笔记:

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