具有root访问权限的kubernetes pod上的exec命令

biz*_*dev 28 bash docker kubernetes

我有一个名为'jenkins-app-2843651954-4zqdp'的pod.我想暂时在这个pod上安装几个软件.我怎样才能做到这一点?

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

Jan*_*art 40

  • 使用kubectl describe pod ...查找运行你盘上的节点和容器ID( docker://...)
  • SSH进入节点
  • docker exec -u root ID -- /bin/bash

  • 考虑到 Docker 已在 K8s 1.20 版本中被弃用,现在的答案有点过时了。 (23认同)
  • 这只适用于码头集装箱而非k8s吊舱 (11认同)
  • k8s在引擎盖下使用了docker,所以它确实有效! (7认同)
  • 应该是`docker exec -it -u root ID/bin/bash` (7认同)
  • 没关系,我自己找到了答案.我正在使用谷歌云.ssh到节点的命令是:gcloud compute instances list gcloud compute ssh <your_instance_name> (6认同)
  • 在这种情况下如何ssh进入节点? (3认同)
  • 如果对任何人都有用,则上面的ID表示Docker容器ID。AFAIK,kubectl将不会显示正确的docker容器ID。我们必须使用docker ps来获取正确的docker容器ID。 (2认同)

小智 19

当使用containerd作为运行时时,添加henning-jay的答案。

通过获取容器ID

kubectl get pod <podname> -o jsonpath="{.status.containerStatuses[].containerID}" | sed 's,.*//,,'

容器 ID 类似于 7e328fc6ac5932fef37f8d771fd80fc1a3ddf3ab8793b917fafba317faf1c697

查找 pod 的节点

kubectl get pod <podname> -o Wide

在节点上,触发 runc - 由于它是由 containerd 调用的,因此必须更改 --root

runc --root /run/containerd/runc/k8s.io/ exec -t -u 0 <containerID> sh


Met*_*ymy 13

如果您使用现代 Kubernetes 版本,它可能会运行 Containerd 而不是 docker 作为容器运行时。

要以 root 身份执行,您必须对运行容器的节点具有 SSH 访问权限和 SUDO 访问权限。

  1. 获取 Pod 的容器 ID。例子:
 kubectl get pod cassandra-0 -n cassandra -o jsonpath="{.status.containerStatuses[].containerID}" | sed 's/.*\/\///'
8e1f2e5907087b5fd55d98849fef640ca73a5ca04db2e9fc0b7d1497ff87aed9
Run Code Online (Sandbox Code Playgroud)
  1. 用于runc以 root 身份执行。例子:
sudo runc --root /run/containerd/runc/k8s.io/ exec -t -u 0 8e1f2e5907087b5fd55d98849fef640ca73a5ca04db2e9fc0b7d1497ff87aed9 sh
Run Code Online (Sandbox Code Playgroud)


hai*_*ong 12

以防万一您遇到寻找minikube的答案,该minikube ssh命令实际上可以与此处的 command 一起使用docker,这使得它相当简单:

  1. 查找容器 ID:

    $ minikube ssh docker container ls
    
    Run Code Online (Sandbox Code Playgroud)
  2. -u 0选项添加到 docker 命令(整个 docker 命令需要引号):

    $ minikube ssh "docker container exec -it -u 0 <Container ID> /bin/bash"
    
    Run Code Online (Sandbox Code Playgroud)

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


小智 11

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

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

  • 该插件不适用于现代 k8s 版本,例如使用 containerd 的 1.22。请参阅 https://github.com/jordanwilson230/kubectl-plugins/issues/40。 (3认同)

Abd*_*UMI 11

就我而言,我需要对容器进行 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 }}
Run Code Online (Sandbox Code Playgroud)

我还创建了一门关于使用 EKS 在 AWS 上运行 kubernetes 的生产级课程


Hed*_*dge 9

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

通过 kubectl 插件管理器krew安装时?kubectl krew install exec-as你可以简单地

kubectl exec-as -u <username> <podname> -- /bin/bash
Run Code Online (Sandbox Code Playgroud)

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

  • 也许这个“exec-as”插件最近没有维护?它不适用于 AWS EKS v1.21。它只是挂在那里,直到“错误:等待条件超时”。但是,原始的“kubectl ssh -u root ...”的工作原理如上面 @jordanwilson230 的原始答案所示。这让我认为“exec-as”插件版本落后于“ssh”插件版本。 (5认同)