【问题标题】:Identifying a Kubernetes Namespace from within a Windows Container从 Windows 容器中识别 Kubernetes 命名空间
【发布时间】:2021-03-23 21:49:25
【问题描述】:

我需要确定容器是否在 k8s 中运行,并使用 PowerShell 从容器本身中找到命名空间 我能够在 C:\var\run\secrets\kubernetes.io\serviceaccount\namespace 中找到它,但我的理解是这条路径并不总是存在,或者是吗? 还有其他方法吗?

【问题讨论】:

  • 赞成,因为这样的问题对社区有帮助,我认为这将有助于我们澄清误解。那就是说请修正语法

标签: powershell kubernetes


【解决方案1】:

您可以将命名空间设置为 env var 并使用 Powershell 使用它。

      env:
        - name: MY_POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace

【讨论】:

  • 我需要一种无需做任何特殊操作的方法,Docker 映像是可再分发的,我不能指望每个人都拉它来将其放入部署中。我提到的路径是否一直存在?
【解决方案2】:

如果windows容器在K8s中运行,那么你可以假设

  • 它将有一些不存在的环境变量,例如 Kubernetes 默认服务 IP 地址。因此,您可以做的一项检查是从容器中的 powershell 打印环境变量,方法是运行 kubectl exec -t -i my-pod powershell 并执行 Get-ChildItem env
  • 它的 IP 地址很可能在 kubernetes pod IP 空间中,也就是说,通过运行ifconfig,您将看到它的 IP 地址与正在运行的 docker 容器的 IP 地址。
  • 它将能够解析 Kubernetes 集群中的服务,例如 Resolve-DnsName -Name kubernetes 将返回一个 IP 地址(通常是 10.96.0.1 之类的东西
  • 它可以使用任何 go-client 查询 apiserver,甚至容器中的 kubectl 可以读取默认容器注入的服务帐户以向 apiserver 进行身份验证。这意味着您可能会执行 kubectl.exe get pods -A 并从此列表中 grep 您自己的 Pod 主机名的命名空间。
  • 它还可以使用向下的 API 访问 apiserver 信息,这是进行此类操作的正常方式。 “向下 API”https://kubernetes.io/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/ 以两种常见方式使用(另请参见其他答案,它显示了注入所需信息的特定方式):通过 env var 注入或通过卷安装注入。如果出于某种原因,您的容器中都不允许这些内容,那么,您的权利将不可靠。但对于大多数集群来说,至少应该将一些元数据暴露给正在运行的容器,因此您在原始答案中所做的任何事情都可能是有效的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 2014-01-21
    • 2019-01-16
    • 2012-05-07
    • 2011-10-05
    • 1970-01-01
    • 2019-12-19
    相关资源
    最近更新 更多