gpt4 book ai didi

kubernetes - 使用 istio 连接到 Nodejs TLS 服务器时出现 NR filter_chain_not_found

转载 作者:行者123 更新时间:2023-12-05 05:47:07 36 4
gpt4 key购买 nike

我创建了一个 node js TLS 服务器,对它进行了 docker 化,并为它创建了一个 K8S 部署和 ClusterIP 服务。我为 istio-ingressgateway 的 LoadBalancer 服务外部 IP 创建了一个 DNS,我正在使用这个 DNS 尝试使用 istio 访问这个 TLS 服务器,但由于某种原因出现这个错误

[2022-02-10T04:28:38.302Z] "- - -" 0 NR filter_chain_not_found - "-" 0 0 3087 - "-" "-" "-" "-" "-" "-" - - 10.120.22.33:7070 10.101.31.172:44748 - -

节点server.js文件:

const tls = require("tls");
const fs = require("fs");

const options = {
key: fs.readFileSync("server-key.pem"),
cert: fs.readFileSync("server-cert.pem"),

rejectUnauthorized: false,
};
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;
const server = tls.createServer(options, (socket) => {
console.log(
"server connected",
socket.authorized ? "authorized" : "unauthorized"
);
socket.write("welcome!\n");
socket.setEncoding("utf8");
socket.pipe(socket);
});
server.listen(7070, () => {
console.log("server bound");
});

我用来连接服务器的client.js文件:

const tls = require("tls");
const fs = require("fs");

const options = {
ca: [fs.readFileSync("server-cert.pem", { encoding: "utf-8" })],
};
var socket = tls.connect(
7070,
"HOSTNAME",
options,
() => {
console.log(
"client connected",
socket.authorized ? "authorized" : "unauthorized"
);
process.stdin.pipe(socket);
process.stdin.resume();
}
);
socket.setEncoding("utf8");
socket.on("data", (data) => {
console.log(data);
});

socket.on("end", () => {
console.log("Ended");
});

集群服务.yaml

apiVersion: v1
kind: Service
metadata:
name: nodejs-service
namespace: nodejs-tcp
spec:
ports:
- name: web
port: 7070
protocol: TCP
targetPort: 7070
selector:
app: nodejs
sessionAffinity: None
type: ClusterIP

istio-gateway.yaml

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: nodejs-gw
namespace: nodejs-tcp
spec:
selector:
istio: istio-ingressgateway
servers:
- hosts:
- 'HOSTNAME'
port:
name: tls
number: 7070
protocol: TLS
tls:
credentialName: tls-secret
mode: PASSTHROUGH

在 credentialName 中,我创建了一个通用 key ,其中包含私钥的值和服务器的证书

istio-virtual-service.yaml

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: nodejs-vs
namespace: nodejs-tcp
spec:
gateways:
- nodejs-gw
hosts:
- 'HOSTNAME'
tls:
- match:
- port: 7070
sniHosts:
- HOSTNAME
route:
- destination:
host: nodejs-service
port:
number: 7070

我使用的 Istio 版本:

client version: 1.12.2
control plane version: 1.12.2
data plane version: 1.12.2 (159 proxies)

非常感谢您的帮助。提前致谢。

最佳答案

我马上注意到的一件事是您在 istio-gateway 中使用了错误的选择器,它应该是:

spec:
selector:
istio: ingressgateway

一个好的故障排除起点是获取您的 ingressgateway 的路由并验证您是否看到了预期的路由。

  1. 首先您需要知道您的 pod 名称:
kubectl get pods -n <namespace_of_your_app>
NAME READY STATUS RESTARTS AGE
pod/my-nginx-xxxxxxxxx-xxxxx 2/2 Running 0 50m

在我的部署中,它是一个 nginx pod。

  1. 一旦你有了名称,你就可以获得特定于你的主机名的路由:
istioctl pc routes <your_pod_name>.<namespace>
NOTE: This output only contains routes loaded via RDS.
NAME DOMAINS MATCH VIRTUAL SERVICE
my-nginx.default.svc.cluster.local:443 my-nginx /*

这是主机名“my-nginx”的输出示例。如果输出没有返回路由,通常意味着它不匹配 SNI 和/或找不到特定路由。

关于kubernetes - 使用 istio 连接到 Nodejs TLS 服务器时出现 NR filter_chain_not_found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71066027/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com