Pod未与GKE中的服务通信 [英] Pod not communicating with service in GKE
问题描述
在GKE群集上,我有客户端和服务器Pod,其中有一个客户端服务和一个服务器服务。
我的服务器服务是:
apiVersion: v1
kind: Service
metadata:
name: server-cluster-ip-service
spec:
type: ClusterIP
selector:
app: server-deployment
ports:
- port: 5000
targetPort: 5000
当我访问客户端Pod外壳并运行
nslookup server-cluster-ip-service
我得到
Server: server-IP
Address: server-IP-Address
Name: server-cluster-ip-service.default.svc.cluster.local
Address: IPAddress
** server can't find server-cluster-ip-service.svc.cluster.local: NXDOMAIN
** server can't find server-cluster-ip-service.cluster.local: NXDOMAIN
** server can't find server-cluster-ip-service.svc.cluster.local: NXDOMAIN
** server can't find server-cluster-ip-service.cluster.local: NXDOMAIN
** server can't find server-cluster-ip-service.us-central1-c.c.my-cluster.internal: NXDOMAIN
** server can't find server-cluster-ip-service.google.internal: NXDOMAIN
** server can't find server-cluster-ip-service.us-central1-c.c.my-cluster: NXDOMAIN
** server can't find server-cluster-ip-service.google.internal: NXDOMAIN
** server can't find server-cluster-ip-service.c.my-cluster.internal: NXDOMAIN
** server can't find server-cluster-ip-service.c.my-cluster.internal: NXDOMAIN
该服务在5000端口上运行,因为当我使用Busybox设置Pod时,我可以像这样从该Pod卷曲:
curl server-cluster-ip-service:5000
并且它从我的服务器返回json。
在试验了在我的客户端代码中将哪个地址放入FETCH请求后,我可以获得200响应的唯一方法是:
const getAllUsers = async () => {
console.log("GETTING ALL USERS");
const response = await fetch("server-cluster-ip-service.default.svc.cluster.local", {
mode: 'cors',
headers: {
'Access-Control-Allow-Origin':'*'
}
});
const resp = await response
console.log("RESPONSE", resp)
const json = await response.json();
setUsers(json);
};
这在端口5000上返回的不是json,也不是明显的json
而所有查询端口5000上的服务的尝试都失败。
我在本地运行了这个程序,它运行得很好。我已经排除了我的Mac出现ARM处理器问题的可能性,我在云控制台上构建并推送了GKE中的扩展坞镜像。我相当确信这是一个GKE问题,因为DNS在本地工作,但为什么它不能与GKE一起工作?我没有自己设置的任何网络策略--可能会有节点安全组阻止访问吗?我读到了有关&屏蔽&作为安装时配置的节点安全策略的信息,但我不知道如何检查是否已配置?
完成以下代码:
我的服务器代码是:
const express = require("express");
const bodyParser = require("body-parser");
var cors = require("cors");
const PORT = 5000;
const app = express();
app.use(cors());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(express.static("public"));
app.listen(PORT, function () {
console.log("listening on 5000");
});
app.get("/", (req, res) => {
console.log("PROCESSING GET USERS REQUEST");
const list = ["item1", "item2", "item3"];
res.json(list);
});
我的客户端代码是:
import { useState, useEffect } from "react";
import "./editUser.css";
function EditUser() {
const [users, setUsers] = useState([]);
const getAllUsers = async () => {
console.log("GETTING ALL USERS");
const response = await fetch("http://server-cluster-ip-service:5000");
const json = await response.json();
setUsers(json);
};
useEffect(() => {
getAllUsers();
}, []);
return (
<div className="App">
<h1 data-position="header">Merr k8s testbed</h1>
<section data-position="quotes">
<h2>Console</h2>
<ul>
{users &&
users.map((user) => (
<li>
<h3>{user}</h3>
</li>
))}
</ul>
</section>
</div>
);
}
export default EditUser;
我的客户端部署.yaml是:
kind: Deployment
metadata:
name: client-deployment
labels:
app: client-deployment
component: web
spec:
replicas: 3
selector:
matchLabels:
app: client-deployment
template:
metadata:
labels:
app: client-deployment
component: web
spec:
containers:
- name: client
image: myDocker/k8s-client:latest
ports:
- containerPort: 3000
我的服务器部署.yaml为:
apiVersion: apps/v1
kind: Deployment
metadata:
name: server-deployment
labels:
app: server-deployment
spec:
replicas: 3
selector:
matchLabels:
app: server-deployment
template:
metadata:
labels:
app: server-deployment
spec:
containers:
- name: server
image: myDocker/k8s-server:latest
ports:
- containerPort: 5000
我的客户端-集群-IP-服务.yaml是:
apiVersion: apps/v1
kind: Deployment
metadata:
name: server-deployment
labels:
app: server-deployment
spec:
replicas: 3
selector:
matchLabels:
app: server-deployment
template:
metadata:
labels:
app: server-deployment
spec:
containers:
- name: server
image: myDocker/k8s-server:latest
ports:
- containerPort: 5000
我的服务器-集群-IP-服务.yaml是:
apiVersion: v1
kind: Service
metadata:
name: server-cluster-ip-service
spec:
type: ClusterIP
selector:
app: server-deployment
ports:
- port: 5000
targetPort: 5000
推荐答案
我能够看到您和Jabbson得出的结论是,问题可能出在Reaction。为了以防万一,让我与你分享,这种问题的一个常见根本原因是,由于版本的原因,Busybox内部的DNS不能正常工作(我在屏幕截图和代码中看不到,也就是你正在使用的版本)。大多数案例都使用Busybox图像1.28.4,这是经验性的。您可以尝试使用该版本。
您可以使用以下URL的线程作为引用dns can't resolve kubernetes.default and/or cluster.local
这篇关于Pod未与GKE中的服务通信的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!