mirror of
https://github.com/gethomepage/homepage.git
synced 2026-09-26 14:01:16 -07:00
Fixhancement: Handle k8s ipv6 node tls bug (#7035)
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
import { readFileSync } from "fs";
|
import { readFileSync } from "fs";
|
||||||
|
import { isIPv6 } from "net";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
|
|
||||||
import { ApiextensionsV1Api, KubeConfig } from "@kubernetes/client-node";
|
import { ApiextensionsV1Api, KubeConfig } from "@kubernetes/client-node";
|
||||||
@@ -21,6 +22,10 @@ export const getKubeConfig = () => {
|
|||||||
switch (config?.mode) {
|
switch (config?.mode) {
|
||||||
case "cluster":
|
case "cluster":
|
||||||
kc.loadFromCluster();
|
kc.loadFromCluster();
|
||||||
|
// node < 26 can't match an IPv6 host against an IP SAN, so verify against the DNS SAN instead (nodejs/node#64032)
|
||||||
|
if (isIPv6(process.env.KUBERNETES_SERVICE_HOST ?? "")) {
|
||||||
|
kc.clusters = kc.clusters.map((cluster) => ({ ...cluster, tlsServerName: "kubernetes.default.svc" }));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case "default":
|
case "default":
|
||||||
kc.loadFromDefault();
|
kc.loadFromDefault();
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ vi.mock("@kubernetes/client-node", () => ({
|
|||||||
ApiextensionsV1Api: class ApiextensionsV1Api {},
|
ApiextensionsV1Api: class ApiextensionsV1Api {},
|
||||||
KubeConfig: class KubeConfig {
|
KubeConfig: class KubeConfig {
|
||||||
loadFromCluster() {
|
loadFromCluster() {
|
||||||
|
this.clusters = [{ name: "inCluster", server: "https://host:443", skipTLSVerify: false }];
|
||||||
return kube.loadFromCluster();
|
return kube.loadFromCluster();
|
||||||
}
|
}
|
||||||
loadFromDefault() {
|
loadFromDefault() {
|
||||||
@@ -85,6 +86,27 @@ describe("utils/config/kubernetes", () => {
|
|||||||
expect(kc2).not.toBeNull();
|
expect(kc2).not.toBeNull();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("getKubeConfig sets tlsServerName when the in-cluster host is IPv6", () => {
|
||||||
|
vi.stubEnv("KUBERNETES_SERVICE_HOST", "fd00:1018:2000::1");
|
||||||
|
yaml.load.mockReturnValueOnce({ mode: "cluster" });
|
||||||
|
|
||||||
|
expect(getKubeConfig().clusters[0]).toMatchObject({
|
||||||
|
name: "inCluster",
|
||||||
|
tlsServerName: "kubernetes.default.svc",
|
||||||
|
});
|
||||||
|
|
||||||
|
vi.unstubAllEnvs();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("getKubeConfig leaves tlsServerName unset for non-IPv6 in-cluster hosts", () => {
|
||||||
|
vi.stubEnv("KUBERNETES_SERVICE_HOST", "10.43.0.1");
|
||||||
|
yaml.load.mockReturnValueOnce({ mode: "cluster" });
|
||||||
|
|
||||||
|
expect(getKubeConfig().clusters[0].tlsServerName).toBeUndefined();
|
||||||
|
|
||||||
|
vi.unstubAllEnvs();
|
||||||
|
});
|
||||||
|
|
||||||
it("checkCRD returns true when the CRD exists", async () => {
|
it("checkCRD returns true when the CRD exists", async () => {
|
||||||
apiExt.readCustomResourceDefinitionStatus.mockResolvedValueOnce({ ok: true });
|
apiExt.readCustomResourceDefinitionStatus.mockResolvedValueOnce({ ok: true });
|
||||||
const logger = { error: vi.fn() };
|
const logger = { error: vi.fn() };
|
||||||
|
|||||||
Reference in New Issue
Block a user