在 pod 内为命令 kubectl 定义/设置默认命名空间

问题描述

背景: Azure AKS 中有集群 A 和集群 B。在命名空间 test(这是非默认命名空间)的集群 A 中创建一个名为 Agent 运行 linux 容器的 pod。在linux容器中,安装了pwsh和kubectl。

操作: 进入集群A中的pod/Agent(kubectl exec -it pod/agent -- bash),并获取集群B的凭证,配置文件将设置集群名称和用户名,但没有命名空间
当从 pod/Agent 连接到集群 B,然后执行 kubectl get pods 时,返回命名空间 test 内的资源,而不是命名空间 default 内的资源。
因为,在集群 B 中没有名为 test 的命名空间,所以没有资源返回。

所以我想知道命名空间 test 在 pod/Agent 中是在哪里定义/设置为默认命名空间的。

花了一些时间尝试在 github 中深入研究 kubectl 代码,但没有运气..

我也尝试使用别名,但它仅适用于 bash/sh,不适用于 pwsh,因为我不想更改命令名称 kubectl,如果我执行 alias kubectl='kubectl -n default',pwsh 会陷入循环。

感谢任何答案。

解决方法

来自docs

最后,用于命名空间 API 的默认命名空间 操作被放置在一个文件中 /var/run/secrets/kubernetes.io/serviceaccount/namespace 在每个 容器。

来自 pod 的简单测试:

root@ubuntu:/# strace -eopenat kubectl get pod 2>&1 | grep namespace
openat(AT_FDCWD,"/var/run/secrets/kubernetes.io/serviceaccount/namespace",O_RDONLY|O_CLOEXEC) = 6
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:default:default" cannot list resource "pods" in API group "" in the namespace "default"

默认情况下,目录 /run/secrets/kubernetes.io/serviceaccount 始终挂载到 pod,并包含用于访问 Kube API 的 serviceaccount 令牌。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...