【问题标题】:Exec commands on kubernetes pods with root access在具有 root 访问权限的 kubernetes pod 上执行命令
【发布时间】:2017-08-05 05:24:16
【问题描述】:

我有一个名为“jenkins-app-2843651954-4zqdp”的 pod。我想在这个 pod 上临时安装一些软件。我该怎么做?

我正在尝试这个-kubectl exec -it jenkins-app-2843651954-4zqdp -- /bin/bash 然后运行 ​​apt-get install 命令,但由于我正在访问的用户没有 sudo 访问权限,我无法运行命令

【问题讨论】:

  • 你可以将它添加到 pod,但退出后它会消失。更好地修改 docker 镜像并添加软

标签: bash docker kubernetes


【解决方案1】:
  • 使用 kubectl describe pod ... 查找运行 Pod 的节点和容器 ID (docker://...)
  • SSH 进入节点
  • 运行docker exec -it -u root ID /bin/bash

【讨论】:

  • 这种情况下如何ssh进入节点?
  • 没关系,我自己找到了答案。我正在使用谷歌云。 ssh 进入节点的命令是:gcloud compute instances list gcloud compute ssh
  • 应该是docker exec -it -u root ID /bin/bash
  • 如果对任何人有帮助,上面的 ID 表示 docker 容器 ID。 AFAIK,kubectl 不会显示正确的 docker 容器 ID。我们必须使用 docker ps 来获取正确的 docker 容器 id。
  • 现在有点过时的答案,考虑到 Docker 在 K8s 版本 1.20 中已被弃用。
【解决方案2】:

有一些 kubectl 插件可以帮助你实现这一点:https://github.com/jordanwilson230/kubectl-plugins

其中一个名为“ssh”的插件将允许您通过运行(例如)以 root 用户身份执行 kubectl ssh -u root -p nginx-0

【讨论】:

  • 超级!我不敢相信这个插件没有像它应得的那样流行。但是,kubectl exec-as ...krew 插件似乎跟不上最新的 Kubernetes。在下面的后续答案中查看我的评论。
【解决方案3】:

基于@jordanwilson230 的回答,他还开发了一个名为exec-as 的bash 脚本,它使用Docker-in-Docker 来完成此任务:https://github.com/jordanwilson230/kubectl-plugins/blob/krew/kubectl-exec-as

当通过 kubectl 插件管理器krewkubectl krew install exec-as 安装时,您可以简单地

kubectl exec-as -u <username> <podname> -- /bin/bash

这仅适用于允许特权容器的 Kubernetes 集群。

【讨论】:

  • 也许这个exec-as 插件最近没有维护?它不适用于 AWS EKS v1.21。它只是挂在那里直到error: timed out waiting for the condition。但是,原始kubectl ssh -u root ... 的工作原理如上面@jordanwilson230 的原始答案所示。这让我觉得exec-as 插件版本落后于ssh 插件版本。
【解决方案4】:

如果您遇到寻找 minikube 的答案,minikube ssh 命令实际上可以在这里与docker 命令一起使用,这使得它相当容易:

  1. 查找容器 ID:

    $ minikube ssh docker container ls
    
  2. 在 docker 命令中添加 -u 0 选项(整个 docker 命令都需要引用):

    $ minikube ssh "docker container exec -it -u 0 <Container ID> /bin/bash"
    

注意:这通常不适用于 Kubernetes,它仅适用于 minikube。虽然我觉得我们需要在本地开发环境中退出很多根访问权限,但值得在此线程中提及它。

【讨论】:

    【解决方案5】:

    就我而言,我需要对容器进行 root 访问(或 sudo),以将 chown 权限授予特定挂载路径。

    我无法通过 SSH 连接到机器,因为我将基础架构设计为使用 Terraform 完全自动化,无需任何手动访问。

    相反,我发现 initContainers 完成了这项工作:

      initContainers:
        - name: volume-prewarming
          image: busybox
          command: ["sh", "-c", "chown -R 1000:0 {{ .Values.persistence.mountPath }}"]
          volumeMounts:
          - name: {{ .Chart.Name }}
            mountPath: {{ .Values.persistence.mountPath }}
    

    我还创建了一个关于Production grade running kubernetes on AWS using EKS的完整课程

    【讨论】:

    • 嗨,阿布登诺。我遇到了类似的问题,但是我使用的是我安装的 git-sync sidecar。一旦安装了 sidecar,卷的所有者将成为 root。如果您可以提供帮助,我在这里添加了一个问题:)stackoverflow.com/questions/65457870/…
    【解决方案6】:

    如果有人正在使用 AKS,请按照以下步骤操作:

    • 识别运行容器的 pod
    • 确定运行该 pod 的节点(kubectl describe pod -n &lt;namespace&gt; &lt;pod_name&gt; | grep "Node:",或在 Azure 门户中查找)
    • SSH to AKS the cluster node

    进入节点后,执行以下命令进入容器:

    • sudo su(您必须获得 root 访问权限才能使用 docker 命令)
    • docker exec -it -u root ID /bin/bash(获取容器id,使用docker container ps

    【讨论】:

      【解决方案7】:
      • docker container ls 查找容器ID
      • docker exec -it -u root ID /bin/bash

      【讨论】:

      • 问题是关于kubernetes集群的。此解决方案不适用于远程集群。
      【解决方案8】:

      我们可以通过以下命令执行到kubernetes pod。

      kubectl exec --stdin --tty pod-name -n namespace-name -- /bin/bash
      

      【讨论】:

      • 帖子询问是否以 root 身份执行命令。我不明白你的意思。
      猜你喜欢
      • 2020-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多