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。
如果您交换 port
和 targetPort
,则服务上的默认 HTTP 端口 80 将转发到您的 pod 中的端口 8080,这可能就是您想要的。
我在 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。
如果您交换 port
和 targetPort
,则服务上的默认 HTTP 端口 80 将转发到您的 pod 中的端口 8080,这可能就是您想要的。