Files
pikasTech-HWLAB/reports/d601-k3s-readonly-observability.json
T
Lyon 85da2dcb19 fix: separate runner kubeconfig gap from D601 status (#144)
Commander review: direction is correct. This PR separates runner kubeconfig/read-only observability gaps from D601 public endpoint/k3s availability and keeps M3 blocked until real operation/trace/audit/evidence are observed. It does not touch PROD or restart services.
2026-05-22 20:44:30 +08:00

711 lines
23 KiB
JSON

{
"$schema": "https://hwlab.pikastech.local/schemas/d601-k3s-readonly-observability-report.schema.json",
"$id": "https://hwlab.pikastech.local/reports/d601-k3s-readonly-observability.json",
"reportVersion": "v1",
"reportKind": "d601-k3s-readonly-observability",
"issue": "pikasTech/HWLAB#46",
"supports": [
"pikasTech/HWLAB#7",
"pikasTech/HWLAB#33",
"pikasTech/HWLAB#36",
"pikasTech/HWLAB#38",
"pikasTech/HWLAB#39",
"pikasTech/HWLAB#42"
],
"generatedAt": "2026-05-22T12:34:14.403Z",
"mode": "read-only",
"devOnly": true,
"prodDisabled": true,
"namespace": "hwlab-dev",
"runtimeTarget": {
"runner": "D601 Code Queue",
"cluster": "D601 k3s",
"namespace": "hwlab-dev",
"resources": [
"pods",
"services",
"configmaps"
]
},
"safety": {
"noProd": true,
"noSecretsPrinted": true,
"noSecretResourcesRead": true,
"noClusterMutation": true,
"noRuntimeRestart": true,
"noHeavyE2E": true
},
"forbiddenActions": [
"prod-access",
"secret-material-read",
"cluster-mutation",
"runtime-restart",
"heavy-e2e",
"master-server-heavy-check"
],
"validationCommands": [
"node --check scripts/d601-k3s-readonly-observability.mjs",
"node --check scripts/src/d601-k3s-readonly-observability.mjs",
"node scripts/d601-k3s-readonly-observability.mjs"
],
"conclusion": "blocked",
"runnerKubeconfigReadable": false,
"runnerKubeconfigProbeOk": true,
"runnerKubeconfigProbeExitCode": 0,
"runnerKubeconfigProbeStderr": "empty",
"d601PublicEndpointsReachable": true,
"d601K3sUnavailable": false,
"statusInference": {
"runnerKubeconfigReadable": false,
"runnerKubeconfigProbeOk": true,
"runnerKubeconfigProbeExitCode": 0,
"runnerKubeconfigProbeStderr": "empty",
"d601PublicEndpointsReachable": true,
"d601K3sUnavailable": false,
"conclusion": "Runner kubeconfig readability is an observability signal only; it is not used to infer D601 k3s or public DEV endpoint availability.",
"blockerClassification": "runner_permission_mount_gap",
"sourceIssue": "pikasTech/HWLAB#46"
},
"environment": {
"binaries": {
"kubectl": {
"name": "kubectl",
"available": true,
"path": "/usr/local/bin/kubectl",
"version": {
"ok": true,
"command": "kubectl version --client=true",
"output": "Client Version: v1.36.1 Kustomize Version: v5.8.1"
}
},
"k3s": {
"name": "k3s",
"available": true,
"path": "/usr/local/bin/k3s",
"version": {
"ok": true,
"command": "k3s --version",
"output": "k3s version v1.34.1+k3s1 (24fc436e) go version go1.24.6"
}
},
"k3sctl": {
"name": "k3sctl",
"available": false,
"path": null
},
"ssh": {
"name": "ssh",
"available": true,
"path": "/usr/bin/ssh",
"version": {
"ok": true,
"command": "ssh -V",
"output": "OpenSSH_10.0p2 Debian-7+deb13u4, OpenSSL 3.5.6 7 Apr 2026"
}
}
},
"kubeconfig": [
{
"source": "KUBECONFIG",
"path": "/var/lib/unidesk/code-queue/kubeconfig",
"exists": true,
"readable": true,
"type": "file",
"sizeBytes": 410
},
{
"source": "default",
"path": "~/.kube/config",
"exists": false,
"readable": false,
"error": "ENOENT"
},
{
"source": "default",
"path": "/etc/rancher/k3s/k3s.yaml",
"exists": false,
"readable": false,
"error": "ENOENT"
},
{
"source": "default",
"path": "/var/lib/rancher/k3s/server/cred/admin.kubeconfig",
"exists": false,
"readable": false,
"error": "ENOENT"
}
],
"runnerKubeconfig": {
"path": "/etc/rancher/k3s/k3s.yaml",
"mode": "read-only",
"resource": "pods",
"command": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev get pods -o name",
"runnerKubeconfigReadable": false,
"runnerKubeconfigProbeOk": true,
"runnerKubeconfigProbeExitCode": 0,
"runnerKubeconfigProbeStderr": "empty",
"stdoutSummary": "13 pod name(s) observed",
"classification": "runner_permission_mount_gap",
"sourceIssue": "pikasTech/HWLAB#46",
"secretValuesRead": false,
"secretResourcesRead": false,
"note": "This probe forces KUBECONFIG=/etc/rancher/k3s/k3s.yaml for a read-only kubectl get pods command and records only exit code plus redacted stderr/stdout summary. A successful kubectl exit code does not make the kubeconfig file readable; kubectl may use an alternate in-cluster fallback."
},
"sshBridge": {
"sshBinaryAvailable": true,
"env": [
{
"name": "HWLAB_D601_SSH_HOST",
"set": false,
"valueRedacted": null
},
{
"name": "HWLAB_D601_SSH_TARGET",
"set": false,
"valueRedacted": null
},
{
"name": "HWLAB_D601_MAINTENANCE_HOST",
"set": false,
"valueRedacted": null
},
{
"name": "D601_SSH_HOST",
"set": false,
"valueRedacted": null
},
{
"name": "HWLAB_MAINTENANCE_SSH",
"set": false,
"valueRedacted": null
}
],
"paths": [
{
"path": "~/.ssh",
"exists": true,
"readable": true,
"type": "directory"
},
{
"path": "~/.ssh/config",
"exists": false,
"readable": false,
"error": "ENOENT"
},
{
"path": "~/.ssh/known_hosts",
"exists": true,
"readable": true,
"type": "file",
"sizeBytes": 5186
}
],
"configured": false,
"note": "SSH bridge discovery checks only binary, environment variable presence, and file metadata; it does not read SSH config or private keys."
}
},
"publicEndpoints": {
"activeFrontendEndpoint": "http://74.48.78.17:16666",
"activeApiEndpoint": "http://74.48.78.17:16667",
"d601PublicEndpointsReachable": true,
"probes": [
{
"id": "frontend-16666",
"url": "http://74.48.78.17:16666/",
"reached": true,
"ok": true,
"status": 200,
"bodySummary": "<!doctype html> <html lang=\"zh-CN\"> <head> <meta charset=\"utf-8\" /> <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" /> <title>"
},
{
"id": "api-health-16667",
"url": "http://74.48.78.17:16667/health",
"reached": true,
"ok": true,
"status": 200,
"serviceId": "hwlab-edge-proxy",
"environment": "dev",
"bodySummary": "json serviceId=hwlab-edge-proxy status=ok"
},
{
"id": "api-live-16667",
"url": "http://74.48.78.17:16667/health/live",
"reached": true,
"ok": true,
"status": 200,
"serviceId": "hwlab-cloud-api",
"environment": "dev",
"bodySummary": "json serviceId=hwlab-cloud-api status=degraded"
}
]
},
"cluster": {
"namespace": "hwlab-dev",
"attemptedExecutors": [
"kubectl",
"k3s-kubectl"
],
"readable": true,
"executors": [
{
"executor": "kubectl",
"ready": true,
"probes": {
"clientVersion": {
"ok": true,
"command": "kubectl version --client=true",
"exitCode": 0,
"stdout": "Client Version: v1.36.1\nKustomize Version: v5.8.1"
},
"currentContext": {
"ok": true,
"command": "kubectl config current-context",
"exitCode": 0,
"stdout": "in-cluster"
},
"namespace": {
"ok": true,
"command": "kubectl get namespace hwlab-dev -o json",
"exitCode": 0
},
"auth": {
"pods": {
"allowed": true,
"ok": true,
"command": "kubectl auth can-i get pods -n hwlab-dev",
"exitCode": 0,
"stdout": "yes"
},
"services": {
"allowed": true,
"ok": true,
"command": "kubectl auth can-i get services -n hwlab-dev",
"exitCode": 0,
"stdout": "yes"
},
"configmaps": {
"allowed": true,
"ok": true,
"command": "kubectl auth can-i get configmaps -n hwlab-dev",
"exitCode": 0,
"stdout": "yes"
}
},
"pods": {
"ok": true,
"command": "kubectl -n hwlab-dev get pods -o json",
"exitCode": 0
},
"services": {
"ok": true,
"command": "kubectl -n hwlab-dev get services -o json",
"exitCode": 0
},
"configMaps": {
"ok": true,
"command": "kubectl -n hwlab-dev get configmaps -o json",
"exitCode": 0
}
},
"summaries": {
"pods": {
"count": 13,
"items": [
{
"name": "hwlab-agent-mgr-75544c7747-5dzt9",
"phase": "Running",
"readyContainers": 1,
"totalContainers": 1,
"restartCount": 0,
"nodeName": "d601"
},
{
"name": "hwlab-agent-skills-849d9976f4-2nsmw",
"phase": "Running",
"readyContainers": 1,
"totalContainers": 1,
"restartCount": 0,
"nodeName": "d601"
},
{
"name": "hwlab-box-simu-55688cbcc7-pftxc",
"phase": "Running",
"readyContainers": 1,
"totalContainers": 1,
"restartCount": 0,
"nodeName": "d601"
},
{
"name": "hwlab-box-simu-55688cbcc7-sq5fx",
"phase": "Running",
"readyContainers": 1,
"totalContainers": 1,
"restartCount": 0,
"nodeName": "d601"
},
{
"name": "hwlab-cloud-api-f48dcdfb-9n6zh",
"phase": "Running",
"readyContainers": 1,
"totalContainers": 1,
"restartCount": 0,
"nodeName": "d601"
},
{
"name": "hwlab-cloud-web-5b7487b5c4-fzvgr",
"phase": "Running",
"readyContainers": 1,
"totalContainers": 1,
"restartCount": 0,
"nodeName": "d601"
},
{
"name": "hwlab-edge-proxy-567f978cdd-8fwc8",
"phase": "Running",
"readyContainers": 1,
"totalContainers": 1,
"restartCount": 0,
"nodeName": "d601"
},
{
"name": "hwlab-frpc-59f57d479c-wm5l2",
"phase": "Running",
"readyContainers": 1,
"totalContainers": 1,
"restartCount": 0,
"nodeName": "d601"
},
{
"name": "hwlab-gateway-simu-699fd486b-j9pk7",
"phase": "Running",
"readyContainers": 1,
"totalContainers": 1,
"restartCount": 0,
"nodeName": "d601"
},
{
"name": "hwlab-gateway-simu-699fd486b-phcgp",
"phase": "Running",
"readyContainers": 1,
"totalContainers": 1,
"restartCount": 0,
"nodeName": "d601"
},
{
"name": "hwlab-patch-panel-757f9f44d5-7np8r",
"phase": "Running",
"readyContainers": 1,
"totalContainers": 1,
"restartCount": 0,
"nodeName": "d601"
},
{
"name": "hwlab-router-5d9cbdf89b-p7r94",
"phase": "Running",
"readyContainers": 1,
"totalContainers": 1,
"restartCount": 0,
"nodeName": "d601"
},
{
"name": "hwlab-tunnel-client-65c7858c8-wjqsh",
"phase": "Running",
"readyContainers": 1,
"totalContainers": 1,
"restartCount": 0,
"nodeName": "d601"
}
]
},
"services": {
"count": 12,
"items": [
{
"name": "hwlab-agent-mgr",
"type": "ClusterIP",
"clusterIP": "10.43.175.43",
"ports": [
{
"name": "http",
"port": 7410,
"targetPort": "http",
"protocol": "TCP"
}
]
},
{
"name": "hwlab-agent-skills",
"type": "ClusterIP",
"clusterIP": "10.43.218.243",
"ports": [
{
"name": "http",
"port": 7430,
"targetPort": "http",
"protocol": "TCP"
}
]
},
{
"name": "hwlab-box-simu",
"type": "ClusterIP",
"clusterIP": "10.43.192.161",
"ports": [
{
"name": "http",
"port": 7201,
"targetPort": "http",
"protocol": "TCP"
}
]
},
{
"name": "hwlab-cli",
"type": "ClusterIP",
"clusterIP": "10.43.94.68",
"ports": [
{
"name": "http",
"port": 7501,
"targetPort": "http",
"protocol": "TCP"
}
]
},
{
"name": "hwlab-cloud-api",
"type": "ClusterIP",
"clusterIP": "10.43.88.144",
"ports": [
{
"name": "http",
"port": 6667,
"targetPort": "http",
"protocol": "TCP"
}
]
},
{
"name": "hwlab-cloud-web",
"type": "ClusterIP",
"clusterIP": "10.43.112.75",
"ports": [
{
"name": "http",
"port": 8080,
"targetPort": "http",
"protocol": "TCP"
}
]
},
{
"name": "hwlab-edge-proxy",
"type": "ClusterIP",
"clusterIP": "10.43.104.107",
"ports": [
{
"name": "http",
"port": 6667,
"targetPort": "http",
"protocol": "TCP"
}
]
},
{
"name": "hwlab-gateway",
"type": "ClusterIP",
"clusterIP": "10.43.70.176",
"ports": [
{
"name": "http",
"port": 7001,
"targetPort": "http",
"protocol": "TCP"
}
]
},
{
"name": "hwlab-gateway-simu",
"type": "ClusterIP",
"clusterIP": "10.43.70.14",
"ports": [
{
"name": "http",
"port": 7101,
"targetPort": "http",
"protocol": "TCP"
}
]
},
{
"name": "hwlab-patch-panel",
"type": "ClusterIP",
"clusterIP": "10.43.7.35",
"ports": [
{
"name": "http",
"port": 7301,
"targetPort": "http",
"protocol": "TCP"
}
]
},
{
"name": "hwlab-router",
"type": "ClusterIP",
"clusterIP": "10.43.6.240",
"ports": [
{
"name": "http",
"port": 7401,
"targetPort": "http",
"protocol": "TCP"
}
]
},
{
"name": "hwlab-tunnel-client",
"type": "ClusterIP",
"clusterIP": "10.43.129.225",
"ports": [
{
"name": "http",
"port": 7402,
"targetPort": "http",
"protocol": "TCP"
}
]
}
]
},
"configMaps": {
"count": 3,
"items": [
{
"name": "hwlab-dev-health-contract",
"keys": [
"agent",
"cloud-api",
"cloud-api-db",
"cloud-web",
"edge-proxy",
"endpoint",
"patch-panel",
"router",
"runtime-substitute-policy",
"sim",
"tunnel-client"
]
},
{
"name": "hwlab-frpc-config",
"keys": [
"frpc.toml"
]
},
{
"name": "kube-root-ca.crt",
"keys": [
"ca.crt"
]
}
]
}
}
},
{
"executor": "k3s-kubectl",
"ready": false,
"probes": {
"clientVersion": {
"ok": false,
"command": "k3s kubectl version --client=true",
"exitCode": 1,
"stderr": "error: unknown command \"kubectl\" for \"kubectl\"",
"error": "Command failed: k3s kubectl version --client=true error: unknown command \"kubectl\" for \"kubectl\""
},
"currentContext": {
"ok": false,
"command": "k3s kubectl config current-context",
"exitCode": 1,
"stderr": "error: unknown command \"kubectl\" for \"kubectl\"",
"error": "Command failed: k3s kubectl config current-context error: unknown command \"kubectl\" for \"kubectl\""
},
"namespace": {
"ok": false,
"command": "k3s kubectl get namespace hwlab-dev -o json",
"exitCode": 1,
"stderr": "error: unknown command \"kubectl\" for \"kubectl\"",
"error": "Command failed: k3s kubectl get namespace hwlab-dev -o json error: unknown command \"kubectl\" for \"kubectl\""
},
"auth": {
"pods": {
"allowed": false,
"ok": false,
"command": "k3s kubectl auth can-i get pods -n hwlab-dev",
"exitCode": 1,
"stderr": "error: unknown command \"kubectl\" for \"kubectl\"",
"error": "Command failed: k3s kubectl auth can-i get pods -n hwlab-dev error: unknown command \"kubectl\" for \"kubectl\""
},
"services": {
"allowed": false,
"ok": false,
"command": "k3s kubectl auth can-i get services -n hwlab-dev",
"exitCode": 1,
"stderr": "error: unknown command \"kubectl\" for \"kubectl\"",
"error": "Command failed: k3s kubectl auth can-i get services -n hwlab-dev error: unknown command \"kubectl\" for \"kubectl\""
},
"configmaps": {
"allowed": false,
"ok": false,
"command": "k3s kubectl auth can-i get configmaps -n hwlab-dev",
"exitCode": 1,
"stderr": "error: unknown command \"kubectl\" for \"kubectl\"",
"error": "Command failed: k3s kubectl auth can-i get configmaps -n hwlab-dev error: unknown command \"kubectl\" for \"kubectl\""
}
},
"pods": {
"ok": false,
"command": "k3s kubectl -n hwlab-dev get pods -o json",
"exitCode": 1,
"stderr": "error: unknown command \"kubectl\" for \"kubectl\"",
"error": "Command failed: k3s kubectl -n hwlab-dev get pods -o json error: unknown command \"kubectl\" for \"kubectl\""
},
"services": {
"ok": false,
"command": "k3s kubectl -n hwlab-dev get services -o json",
"exitCode": 1,
"stderr": "error: unknown command \"kubectl\" for \"kubectl\"",
"error": "Command failed: k3s kubectl -n hwlab-dev get services -o json error: unknown command \"kubectl\" for \"kubectl\""
},
"configMaps": {
"ok": false,
"command": "k3s kubectl -n hwlab-dev get configmaps -o json",
"exitCode": 1,
"stderr": "error: unknown command \"kubectl\" for \"kubectl\"",
"error": "Command failed: k3s kubectl -n hwlab-dev get configmaps -o json error: unknown command \"kubectl\" for \"kubectl\""
}
},
"summaries": null
}
]
},
"blockers": [
{
"status": "open",
"type": "observability_blocker",
"scope": "runner-kubeconfig-readonly-gap",
"classification": "runner_permission_mount_gap",
"sourceIssue": "pikasTech/HWLAB#46",
"summary": "The runner cannot read /etc/rancher/k3s/k3s.yaml; classify this as a runner permission/mount gap, not a D601 global outage. Alternate read-only cluster probes and public DEV endpoint probes are reported separately.",
"nextTask": "Provide the approved read-only runner kubeconfig mount or document the intended alternate KUBECONFIG path, then rerun the read-only report."
}
],
"runnerImageFollowUp": {
"needed": true,
"suggestedUniDeskIssue": "Code Queue runner image should include kubectl and a documented read-only hwlab-dev kubeconfig mount/permission path; keep Secret resources and token material inaccessible to reports."
},
"notes": "This report uses command availability checks, file metadata checks, public DEV endpoint GET probes, kubectl/k3s kubectl read-only get probes, and auth can-i checks only. It does not print kubeconfig contents, token material, Secret resources, ConfigMap values, SSH config contents, or private keys. A failed runner /etc/rancher/k3s/k3s.yaml probe is classified as a runner permission/mount or read-only observability gap and is not evidence that D601 k3s is globally unavailable."
}