GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Funktionsweise des Befehls oc debug in OpenShift

Wenn Sie relativ neue Versionen von OpenShift verwendet haben, müssen Sie auf oc debug gestoßen sein Befehl (oder Sie können diese Manpage überprüfen). Eines der interessanten Dinge am neuen OpenShift ist, dass es vorschlägt, SSH nicht direkt zu verwenden (Sie können dies in sshd_config sehen auf den Knoten, weil sie PermitRootLogin no haben auf sie setzen). Wenn Sie also oc debug node/node_name ausführen würden , wird es einen Pod für Sie erstellen und Sie in der Shell (TTY) dieses Pods ablegen.

[Das könnte Ihnen auch gefallen: 5 Gründe, warum Sie eine Linux-Container-Strategie entwickeln sollten]

Obwohl es sich um eine Schote handelt, ist es eine besondere Art von Schote. Sobald der Pod gestartet ist, können Sie ein zweites Terminalfenster öffnen und oc get pods ausführen und suchen Sie den entsprechenden Pod mit dem Namen node-name-debug und verwenden Sie oc get -o yaml podName um seine YAML-Ausgabe anzuzeigen.

Beachten Sie die Ausgabe:

apiVersion: v1
kind: Pod
metadata:
  name: ip-xx-x-xxx-xxxus-east-2computeinternal-debug   #1
  namespace: default #2
...
<snip>
....
spec:
containers:
  - command:
    - /bin/sh
    image: quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:57e87210a3f3a3ba4fc85dde180c76988a5f68445f705fd07855003986c75ab0
    name: container-00
    ...
    securityContext: #3
           privileged: true
           runAsUser: 0
    ...
    tty: true  #4
    volumeMounts: 
    - mountPath: /host  #5
      name: host
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
        name: default-token-dnkrx
        readOnly: true
  ...
  hostNetwork: true  #6
...

  volumes:
  - hostPath:
      path: /   #7
      type: Directory
    name: host
  - name: default-token-dnkrx
    secret:
      defaultMode: 420
      secretName: default-token-dnkrx
status:  #8
…
  hostIP: 10.0.111.111
  phase: Running
  podIP: 10.0.111.111
  podIPs:
  - ip: 10.0.111.111

So sieht die YAML aus (ich habe der Kürze halber einige Teile davon ausgeschnitten). Ich habe #x hinzugefügt Zahlen in der YAML. Jede Zahl hebt eine bestimmte Tatsache über diesen Debug-Pod hervor, die im Vergleich zu den regulären Anwendungs-Pods etwas Besonderes ist.

YAML-Referenzen

#1

name: ip-xx-x-xxx-xxxus-east-2computeinternal-debug   #1

Dies zeigt, dass der Pod den Namen erhält, der aus dem Knotennamen gebildet wird. In meinem Fall war der Knotenname ip-x-x-x-x-.us-east-2.compute.internal , also oc debug hängt einfach -debug an am Ende und ersetzt Punkte durch Bindestriche.

#2

 namespace: default #2

Es kann den Pod in einem beliebigen Namespace erstellen, in dem Sie sich befinden. In diesem Fall ist der Namespace default .

#3

securityContext: #3
           privileged: true
           runAsUser: 0

Hier wird es interessant. Wie Sie wissen, werden Sie Pods normalerweise nicht als privilegierter Pod und als Benutzer 0 (root) ausführen. Da dieser Pod Ihnen jedoch ein Äquivalent zum SSH-Zugriff auf den Knoten als Root-Benutzer bieten soll, hat er einen solchen securityContext aufstellen. Wenn Sie privilegiert sind, werden diesem Pod AllCapabilities (mit uneingeschränktem Zugriff) hinzugefügt. Sie können diese mit setpriv -d  anzeigen (Ausgabe unten) innerhalb der Debug-Shell. Dies führt dazu, dass Sie über diesen Pod nahezu unbegrenzten Zugriff auf die Node erhalten. Unnötig zu erwähnen, dass dieser Pod wahrscheinlich auf dem Knoten geplant wird, den Sie debuggen.

sh-4.4# setpriv -d
uid: 0
euid: 0
gid: 0
egid: 0
Supplementary groups: [none]
no_new_privs: 0
Inheritable capabilities: chown,dac_override,dac_read_search,fowner,fsetid,kill,setgid,setuid,setpcap,linux_immutable,net_bind_service,net_broadcast,net_admin,net_raw,ipc_lock,ipc_owner,sys_module,sys_rawio,sys_chroot,sys_ptrace,sys_pacct,sys_admin,sys_boot,sys_nice,sys_resource,sys_time,sys_tty_config,mknod,lease,audit_write,audit_control,setfcap,mac_override,mac_admin,syslog,wake_alarm,block_suspend,audit_read
Ambient capabilities: chown,dac_override,dac_read_search,fowner,fsetid,kill,setgid,setuid,setpcap,linux_immutable,net_bind_service,net_broadcast,net_admin,net_raw,ipc_lock,ipc_owner,sys_module,sys_rawio,sys_chroot,sys_ptrace,sys_pacct,sys_admin,sys_boot,sys_nice,sys_resource,sys_time,sys_tty_config,mknod,lease,audit_write,audit_control,setfcap,mac_override,mac_admin,syslog,wake_alarm,block_suspend,audit_read
Capability bounding set: chown,dac_override,dac_read_search,fowner,fsetid,kill,setgid,setuid,setpcap,linux_immutable,net_bind_service,net_broadcast,net_admin,net_raw,ipc_lock,ipc_owner,sys_module,sys_rawio,sys_chroot,sys_ptrace,sys_pacct,sys_admin,sys_boot,sys_nice,sys_resource,sys_time,sys_tty_config,mknod,lease,audit_write,audit_control,setfcap,mac_override,mac_admin,syslog,wake_alarm,block_suspend,audit_read
Securebits: [none]
SELinux label: system_u:system_r:spc_t:s0

#4

 tty: true  #4

TTY ist auf true gesetzt , was bedeutet, dass Sie unmittelbar nach der Erstellung des Pods eine interaktive Shell für den Pod erhalten.

#5 , #7

 - mountPath: /host  #5
 path: /   #7

Hier wird es noch interessanter. Wie Sie sehen können, binden Sie das Volume mit dem Namen host ein auf dem Pfad /host . Wenn Sie sich #7 ansehen Sie werden sehen, dass das Host-Volume auf den Pfad / eingestellt ist auf dem Host, der das Root-Verzeichnis ist. Dadurch wird sichergestellt, dass Sie über diesen Pod vollen Zugriff auf das Host-Dateisystem haben. Wenn Sie jedoch zum ersten Mal in das tty dieses Pods springen, befinden Sie sich nicht in /host Verzeichnis. Sie befinden sich im Dateisystem des Containers mit eigenem Root (/ ) Dateisystem. Um als root auf das Host-Dateisystem zu wechseln, können Sie chroot /host verwenden , was Ihnen Zugriff auf alle auf dem Host installierten Programme geben würde, und es würde sich genauso anfühlen, wie Sie sich sonst fühlen würden, wenn Sie sich mit SSH in diesen Knoten einloggen würden.

#6 , #8

 hostNetwork: true  #6
status:  #8
…
  hostIP: 10.0.111.111
  phase: Running
  podIP: 10.0.111.111
  podIPs:
  - ip: 10.0.111.111

Vom Standpunkt des Netzwerks aus verwendet dieser Pod ein hostNetwork , was dem Ausführen von Docker oder Podman mit --net=host entspricht beim Ausführen eines Containers. In diesem Fall wird es verwendet, um die Programme im Container so aussehen zu lassen, als würden sie aus der Netzwerkperspektive auf dem Host selbst ausgeführt. Es ermöglicht dem Container einen größeren Netzwerkzugriff, als er normalerweise erhalten kann. Normalerweise müssen Sie Ports von der Hostmaschine in einen Container weiterleiten. Wenn sich die Container jedoch das Netzwerk des Hosts teilen, findet jede Netzwerkaktivität direkt auf dem Hostcomputer statt – genau so, als ob das Programm lokal auf dem Host statt in einem Container ausgeführt würde. Damit erhalten Sie Zugang zu Host-Netzwerken, die wahrscheinlich ebenfalls uneingeschränkt wären. Es ist wichtig zu beachten, dass der Host-Knoten dem Container vollen Zugriff auf lokale Systemdienste wie D-Bus gewährt und daher als unsicher gilt. Wenn Sie sich den Status ansehen, können Sie die hostIP sehen , podIP und podIPs -Felder haben einen gemeinsamen Wert, der mit der ursprünglichen IP-Adresse des Knotens übereinstimmt. Dies beweist, dass Sie tatsächlich einen Hostnetzwerk-Pod verwenden.

[ Holen Sie sich dieses kostenlose E-Book:Verwalten Ihrer Kubernetes-Cluster für Dummies. ]

Abschluss

Dieser Artikel gibt einen kurzen Überblick darüber, wie der oc debug Der Befehl würde für das Debuggen eines Knotens in einem OpenShift-Cluster funktionieren.


Linux
  1. So verwenden Sie den Linux-Grep-Befehl

  2. So verwenden Sie den Verlaufsbefehl unter Linux

  3. Wie verwende ich den basename-Befehl?

  4. Wie funktioniert der Tee-Befehl?

  5. So verwenden Sie den Befehl „screen“ unter Linux

So verwenden Sie den nmap-Befehl

So passen Sie den Linux-Befehl top an

So verwenden Sie den fd-Befehl auf einem Linux-System

Wie verwende ich den wget-Befehl unter Linux?

Wie verwende ich den xargs-Befehl unter Linux?

So verwenden Sie den RPM-Befehl unter Linux