programing

루트 액세스 권한이 있는 kubernetes 포드의 Exec 명령

kakaobank 2023. 5. 22. 21:14
반응형

루트 액세스 권한이 있는 kubernetes 포드의 Exec 명령

저는 'jenkins-app-2843651954-4zqdp'라는 이름의 포드 하나를 실행하고 있습니다.이 포드에 임시로 소프트웨어를 몇 개 설치하고 싶습니다.어떻게 해야 하나요?

을 시도하고 .kubectl exec -it jenkins-app-2843651954-4zqdp -- /bin/bash 사용자가 할 수 .

  • 사용하다kubectl describe pod ...하는 노드와 IDPod 실행는를컨노너다 ID습니찾이테하와드를(를▁to▁▁find▁your)를 찾습니다.docker://...)
  • 노드에 SSH 연결
  • 려달을 합니다.docker exec -it -u root CONTAINER_ID /bin/bash

이를 달성하는 데 도움이 될 수 있는 kubectl용 플러그인이 몇 가지 있습니다. https://github.com/jordanwilson230/kubectl-plugins

라는 중 하면 (예를 'ssh'를 사용자로 할 수 . root 사용자:kubectl ssh -u root -p nginx-0

containerd를 런타임으로 사용할 때 헤닝제이의 답변에 추가.

용기를 얻다경유 아이디

kubectl get pod <podname> -ojsonpath="{.status.containerStatus[]. 컨테이너ID}" | sed's,*.//,,"

컨테이너.ID는 7e328fc6ac5932fef37f8d771fd80fc1a3ddf3ab8793b917fafba317fafa1c697과 같습니다.

노드에서 포드 검색

kubectl get pod <podname> -o wide

노드에서 트리거 runc - containerd에 의해 호출되었으므로 --root를 변경해야 합니다.

runc --root /run/rund/runc/k8s.io/ exec -t -u 0 <cisco>ID > sh

@ 230의그는 @jordanwilson 230이라는 를 했습니다.exec-asDocker-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

이 기능은 권한 있는 컨테이너를 허용하는 Kubernetes 클러스터에서만 작동합니다.

미니큐브에 대한 답을 찾기 위해 우연히 마주칠 경우를 대비해,minikube ssh 명은실작수있다니습할과 함께 할 수 .docker여기서 명령을 함께 수행하면 매우 간단합니다.

  1. 컨테이너 ID 찾기:

    $ minikube ssh docker container ls
    
  2. 추가합니다.-u 0도커 명령 옵션(전체 도커 명령에 대해 필요함):

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

참고: 이것은 일반적으로 쿠베르네테스를 위한 것이 아니라 미니큐브에서만 작동합니다.로컬 개발 환경에서 루트 액세스가 많이 필요하다고 생각하지만, 이 스레드에서 언급할 가치가 있습니다.

의 경우, 저는 또는 가했습니다.chown특정 마운트 경로에 대한 사용 권한.

수동 액세스 없이 Terraform으로 인프라를 완전히 자동화하도록 설계했기 때문에 SSH를 시스템에 연결할 수 없습니다.

대신에, 나는 그것을 발견했습니다.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 }}

저는 또한 EKS를 사용하여 AWS에서 쿠버넷을 실행하는 프로덕션 등급에 대한 전체 과정을 만들었습니다.

만약 당신이 현대의 쿠버네티스 버전을 사용하고 있다면 그것은 컨테이너 런타임을 위해 도커 대신 containerd를 실행할 가능성이 높습니다.

루트로 실행하려면 컨테이너가 실행 중인 노드에 대한 SSH 액세스 및 SUDO 액세스 권한이 있어야 합니다.

  1. 포드의 컨테이너 ID를 가져옵니다.예:
 kubectl get podcassandra-0 -n cassandra -o jsonpath="{.status.containerStatuses[].containerID}" | sed 's/.*\/\///'
8e1f2e5907087b5fd55d98849fef640ca73a5ca04db2e9fc0b7d1497ff87aed9
  1. 사용하다runc루트로 실행합니다.예:
sudo runc --root /run/containerd/runc/k8s.io/ exec -t -u 0 8e1f2e5907087b5fd55d98849fef640ca73a5ca04db2e9fc0b7d1497ff87aed9 sh

AKS에서 작업 중인 사람이 있는 경우 다음 단계를 수행합니다.

  • 용기를 실행 중인 포드 식별
  • 포드를 합니다("라는 뜻의 당드노식별드해"().kubectl describe pod -n <namespace> <pod_name> | grep "Node:"아니면 Azure 포털에서 찾아보세요).
  • SSH에서 클러스터 노드를 AKS로 전환

노드 내부에 들어가면 다음 명령을 수행하여 컨테이너에 들어갑니다.

  • sudo su(사용하려면 루트 액세스 권한이 있어야 합니다.docker명령)
  • docker exec -it -u root ID /bin/bash(컨테이너 ID를 가져오려면 다음을 사용합니다.)docker container ps)

를 k8s 배성에서컨이를다너같음설로 실행하도록 할 수 .root

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-app
spec:
  template: 
    spec:
      containers:
      - image: my-image
    name: my-app
    ...
    securityContext:
      allowPrivilegeEscalation: false
      runAsUser: 0

:runAsUser: 0 하시면 'POD/컨테이너'됩니다.root처음부터

kubernetes 1.21로 작업할 때 도커와 kubectl-plugin 접근법은 나에게 효과가 없었습니다. (k8s 1.21에서 cry-o를 컨테이너 런타임으로 사용하기 때문입니다.)

Runc를 사용하는 것이 제게 효과적이었습니다.

  • 용기를 얻다경유 아이디

kubectl get pod -ojsonpath="{.status.containerStatus[] 컨테이너ID}" | sed 's/.*///'

  • 컨테이너.ID는 다음과 같습니다.

4ed493495241b0614b94425bb03b682534241cf19776f8809aeb131fa5a515

  • 노드 포드가 실행 중인 상태 가져오기
kubectl describe pod <podname>  | grep Node:
    Node:         mynode.cluster.cloud.local/1.1.148.63
  • SSH를 노드에 삽입

  • 노드에서 실행(사용자는 sudo를 사용해야 함):

runcexec -t -u0 컨테이너ID sh

그래서 다음과 같은 것.

runcexec -t -u 04ed493495241b061414b94425bb03b6825241cfa6f8809aebfa5a515sh

kubernetes에서 exec-as 플러그인을 사용하여 다른 방식으로 로그인하려면 다음 단계를 수행합니다.

깃이 장착되어 있는지 확인합니다.

단계: 1 Krew 플러그인 설치

  begin
  set -x; set temp_dir (mktemp -d); cd "$temp_dir" &&
  set OS (uname | tr '[:upper:]' '[:lower:]') &&
  set ARCH (uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/') &&
  set KREW krew-$OS"_"$ARCH &&
  curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/$KREW.tar.gz" &&
  tar zxvf $KREW.tar.gz &&
  ./$KREW install krew &&
  set -e KREW; set -e temp_dir
end

단계: 2 exec-as 설치

kubectl krew install exec-as

단계: 3 루트 또는 다른 사용자로 시도

kubectl exec-as -u root frontend-deployment-977b8fd4c-tb5pz

경고:krew-index 플러그인 저장소에서 플러그인 "프롬프트"를 설치했습니다.이러한 플러그인은 Krew 유지 관리자에 의해 보안 감사를 받지 않습니다.자신의 책임 하에 운영하십시오.

그것은 모두 좋고 좋지만, 컨테이너드를 사용하는 새로운 버전의 쿠버네츠는 어떻습니까?사용.nerdctl exec -uroot -ti 817d52766254 sh이 읽기 전용 모드에 있는 시스템의 일부인 완전한 루트가 없습니다.

동료가 이 도구를 발견했습니다. https://github.com/ssup2/kpexec

대상 컨테이너와 동일한 노드에서 권한이 높은 컨테이너를 실행하고 대상 컨테이너(IPC, UTS, PID, net, mount)의 네임스페이스에 가입합니다.

[...] kpeexec은 이제 다음과 같은 컨테이너 런타임을 지원합니다.

  • 컨테이너형의
  • CRI-O
  • 도커

[...] 호스트를 사용하여 cnsenter 포드를 생성해야 합니다.PID 및 권한 있는 옵션

뿌리를 내리기 위해서는 다음과 같은 것을 실행할 수 있습니다.

kpexec -it  jenkins-app-2843651954-4zqdp  -- /bin/bash

여기 게시물, 댓글 및 링크에서 제가 찾은 내용을 요약해 보겠습니다.이것은 나에게 도움이 됩니다.

# First get list of nodes:
kubectl get nodes                                                                   
$ NAME                 STATUS     ROLES                  AGE     VERSION
$ node-control-plane   Ready      control-plane,master   4d16h   v1.21.1
$ node-worker          NotReady   <none>                 4d16h   v1.21.1
$ node-worker2         Ready      <none>                 4d16h   v1.21.1

# Start pod based on ubuntu which will connect direct inside the node:
kubectl debug node/node-worker -it --image=ubuntu
$ Creating debugging pod node-debugger-ip-10-0-5-223.eu-west-2.compute.internal-6gs8d with container debugger on node ip-10-0-5-223.eu-west-2.compute.internal.
$ If you don't see a command prompt, try pressing enter.
root@ip-10-0-5-223:/# 

# Now you are connected on debug pod and content of node filesystem is at /host
# Lets chroot there:
root@ip-10-0-5-223:/# chroot /host
sh-4.2# 

# Now you are connected inside node, so you can check used space (df -h), running processes (top) or install things with yum (yum install htop mc -y)

# Lets get root access to some pod on this node, you need to find its CONTAINER ID:
sh-4.2# docker ps 
#or "docker ps | less" then move around with arrows to find  correct CONTAINER ID and quit with q
$ CONTAINER ID    IMAGE     COMMAND         CREATED             STATUS             PORTS     NAMES
$ 0d82a8768c1e    centos    "/bin/bash"     2 minutes ago       Up 2 minutes                 k8s_prometheus-ip-11-2-6-218.compute.internal-alksdjf_default_asldkfj-lsadkfj-lsafjdk

sh-4.2# docker exec -it -u root 0d82a8768c1e /bin/bash
$ root@centos:/# 
#and here we are, inside pod with root account - good luck.


출처:위의 kubectl게시물을 사용하여 노드에 셸 열기

  • docker container ls컨테이너 ID 찾기
  • docker exec -it -u root ID /bin/bash

실행할 수 있습니다.kubernetes다음 명령을 통해 pod를 클릭합니다.

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

언급URL : https://stackoverflow.com/questions/42793382/exec-commands-on-kubernetes-pods-with-root-access

반응형