如何从 OpenShift 中的 pod 中获取命名空间?

How to get the namespace from inside a pod in OpenShift?

我想从 pod 内部访问 OpenShift 和 Kubernetes API 以查询和修改 pod 所属应用程序中的对象。

在文档 (https://docs.openshift.org/latest/dev_guide/service_accounts.html) 中,我找到了关于如何访问 api:

$ TOKEN="$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"

$ curl --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt \
"https://openshift.default.svc.cluster.local/oapi/v1/users/~" \
-H "Authorization: Bearer $TOKEN"

问题是当我想访问一个 pod 时,我需要知道我所在的命名空间:

https://openshift.default.svc.cluster.local/oapi/v1/namespaces/${namespace}/pods

目前我发现的唯一方法是将命名空间作为环境变量提交,但我不想要求用户输入该信息。

我通过跟踪 Web 控制台的功能找到了解决方案。

我可以在没有集群管理员权限的情况下请求项目列表 url:

https://openshift.default.svc.cluster.local/oapi/v1/projects

只列出我有权限的项目,然后可以判断当前项目是哪个名称也是命名空间。

如果有更简单的解决方案,我会很高兴,但这行得通。

您可以使用 downward API.

让您的 pod 的命名空间自动填充为环境变量

至少在 kubernetes 1.5.3 中我还可以在 /var/run/secrets/kubernetes.io/serviceaccount/namespace 中看到命名空间。