问题描述
背景: 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 令牌。