Kubernetes 服务 NodePort 未连接

Kubernetes Service NodePort not connected

我在 windows 10 上使用 minikube。我生成 kubernetes NodePort 服务以从客户端 Web 浏览器访问。首先下面的代码是资源配置文件。

apiVersion: v1
kind: Pod
metadata:
  name: blog-system 
  labels:
    app: blog-pod 
spec:
  containers:
  - name: blog-app
    image: app:latest 
    imagePullPolicy: Never 
    ports:
      - containerPort: 8080
    args: ["-t", "-i"]
  - name: blog-mysql
    image: mysql:latest 
    env:
      - name: MYSQL_ROOT_PASSWORD
        value: password
      - name: MYSQL_PASSWORD
        value: password
      - name: MYSQL_DATABASE
        value: test
    ports:
      - containerPort: 3306

---
apiVersion: v1
kind: Service
metadata:
  name: blog-app-svc
spec:
  type: NodePort   
  selector:
    app: blog-pod  
  ports:
  - name: http
    port: 8080
    protocol: TCP
    targetPort: 80
    nodePort: 31000

Kubernetes pods 和服务生成成功。

> kubectl get services
NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
blog-app-svc   NodePort    10.100.32.119   <none>        8080:31000/TCP   79s
kubernetes     ClusterIP   10.96.0.1       <none>        443/TCP          5m54s

> minikube service blog-app-svc --url
http://192.168.5.25:31000

然而,即使使用所有这些 url,访问此 kubernetes nodeport 服务也会被拒绝。

http://10.100.32.119:31000
http://10.100.32.119:8080
http://192.168.5.25:31000

我不知道资源配置文件,服务部分或pod部分的错误在哪里。有什么想法吗

您的 NodePort 的配置似乎是正确的。一些故障排除建议是,这可能是由 Kubernetes 工作节点上的防火墙 运行 引起的。

因此请确保 31000 已打开,您应该能够从 Kubernetes API 服务器解析该 IP。

其次,您应该考虑将 LoadBalancer controller 添加到您的集群中,这样您就不必使用 NodePorts。除了调试之外,它们并没有真正用于任何其他用途。

您的 Service 的 targetPort 与您的 Pod 的 containerPort 不匹配。

您的服务声明表明 nodePort 集群中任何节点上的 31000,或集群中特殊主机名 blog-app-svc.default.svc.cluster.local 上的 port 8080,转发到 targetPort 80 在一些带有 app: blog-pod 标签的 pod 中。您有那个 pod,但它正在侦听端口 8080 和 3306 而不是端口 80。

如果您交换 porttargetPort,则服务上的默认 HTTP 端口 80 将转发到您的 pod 中的端口 8080,这可能就是您想要的。