GNU/Linux >> Znalost Linux >  >> Linux

Jak používat Podman uvnitř Kubernetes

Podman v Kubernetes/OpenShift

V první části jsme se zaměřili na Podman ve scénářích Podman. Viděli jsme některé z různých kořenových a nekořenových kombinací Podmanů. Také jsme diskutovali o důsledcích --privileged vlajka.

Ale co Podman a Kubernetes? Existuje spousta možností, jak tyto dvě služby propojit.

Pro druhou část série používám cluster Kubernetes běžící s CRI-O jako runtime.

[ Bezplatný cheat:Slovníček Kubernetes ]

Rootful Podman se sadou privilegovaných příznaků

Zde spouštíme privilegovaný kontejner s uživatelem root, takže Podman bude v kontejneru běžet jako root.

Zde je soubor YAML:rootful-priv.yaml :

apiVersion: v1
kind: Pod
metadata:
 name: podman-priv
spec:
 containers:
   - name: priv
     image: quay.io/podman/stable
     args:
       - sleep
       - "1000000"
     securityContext:
       privileged: true
➜ kubectl exec -it podman-priv -- sh
sh-5.0# id
uid=0(root) gid=0(root) groups=0(root)
sh-5.0# podman run ubi8 echo hello
Resolved "ubi8" as an alias (/etc/containers/registries.conf.d/shortnames.conf)
Trying to pull registry.access.redhat.com/ubi8:latest...
Getting image source signatures
Copying blob fdb393d8227c done
Copying blob 6b536614e8f8 done
Copying config 4199acc83c done
Writing manifest to image destination
Storing signatures
hello

Můžeme také úspěšně vytvářet obrázky uvnitř privilegovaného kontejneru s rootovaným Podmanem. Pojďme vytvořit image, kde nainstalujeme BusyBox na Fedoru.

sh-5.0# cat Containerfile
FROM fedora
RUN dnf install -y busybox
ENV foo=bar
 
sh-5.0# podman build -t myimage -f Containerfile .                                                                                     
STEP 1: FROM fedora                                                                                                                    
STEP 2: RUN dnf install -y busybox                                                                                                     
Fedora 33 openh264 (From Cisco) - x86_64        3.0 kB/s | 2.5 kB     00:00                                                            
Fedora Modular 33 - x86_64                      1.4 MB/s | 3.3 MB     00:02                                                            
Fedora Modular 33 - x86_64 - Updates            1.3 MB/s | 3.1 MB     00:02                                                            
Fedora 33 - x86_64 - Updates                    1.6 MB/s |  27 MB     00:16                                                            
Fedora 33 - x86_64                              3.6 MB/s |  72 MB     00:19                                                            
Dependencies resolved.                                                         
...
Running transaction
 Preparing        :                                                        1/1
 Installing       : busybox-1:1.32.1-1.fc33.x86_64                         1/1
 Running scriptlet: busybox-1:1.32.1-1.fc33.x86_64                         1/1
 Verifying        : busybox-1:1.32.1-1.fc33.x86_64                         1/1
 
Installed:
 busybox-1:1.32.1-1.fc33.x86_64                                                
 
Complete!
--> 734a45854d1
STEP 3: ENV foo=bar
STEP 4: COMMIT myimage
--> 2326e34ac82
2326e34ac82173c849e0282b6644de5326f6b5bfba8431cf1c1115d846e440e9
 
sh-5.0# podman images                                                                                                                  
REPOSITORY                         TAG     IMAGE ID      CREATED         SIZE                                                          
localhost/myimage                  latest  2326e34ac821  48 seconds ago  427 MB                                                        
registry.fedoraproject.org/fedora  latest  9f2a56037643  3 months ago    182 MB    
 
sh-5.0# podman run myimage busybox                                                                                                     
BusyBox v1.32.1 (2021-03-22 18:56:41 UTC) multi-call binary.                                                                           
BusyBox is copyrighted by many authors between 1998-2015.                                                                              
Licensed under GPLv2. See source distribution for detailed                                                                             
copyright notices.                                                                                                                     
                                                                                                                                      
Usage: busybox [function [arguments]...]                                                                                               
  or: busybox --list[-full]                                                                                                           
  or: busybox --show SCRIPT                                                                                                           
  or: busybox --install [-s] [DIR]                                                                                                    
  or: function [arguments]...
...

Rootless Podman se sadou privilegovaných příznaků

Zde spouštíme privilegovaný kontejner s podman(1000) uživatel, takže Podman běží jako uživatel 1000 uvnitř kontejneru.

Zde je soubor YAML:rootless-priv.yaml :

apiVersion: v1
kind: Pod
metadata:
 name: podman-rootless
spec:
 containers:
   - name: rootless
     image: quay.io/podman/stable
     args:
       - sleep
       - "1000000"
     securityContext:
       privileged: true
       runAsUser: 1000
➜ kubectl exec -it podman-rootless -- sh

sh-5.0$ id
uid=1000(podman) gid=1000(podman) groups=1000(podman)

sh-5.0$ podman run ubi8 echo hello
Resolved "ubi8" as an alias (/etc/containers/registries.conf.d/shortnames.conf)
Trying to pull registry.access.redhat.com/ubi8:latest...
Getting image source signatures
Copying blob 6b536614e8f8 done
Copying blob fdb393d8227c done
Copying config 4199acc83c done
Writing manifest to image destination
Storing signatures
hello

Můžeme také úspěšně vytvářet obrázky uvnitř privilegovaného kontejneru s rootless Podmanem. Pojďme vytvořit image, kde nainstalujeme BusyBox na fedoru.

sh-5.0$ cat Containerfile
FROM fedora
RUN dnf install -y busybox
ENV foo=bar
 
sh-5.0$ podman build -t myimage -f Containerfile .                                                                                                                                                                                                
STEP 1: FROM fedora                                                                                                                    
Resolved "fedora" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)                                                  
Getting image source signatures                                                                                                        
Copying blob 157ab8011454 done                                                                                                         
Copying config 9f2a560376 done                                                                                                         
Writing manifest to image destination                                                                                                  
Storing signatures                                                                                                                     
STEP 2: RUN dnf install -y busybox                                                                                                     
Fedora 33 openh264 (From Cisco) - x86_64        4.8 kB/s | 2.5 kB     00:00                                                            
Fedora Modular 33 - x86_64                      462 kB/s | 3.3 MB     00:07                                                            
Fedora Modular 33 - x86_64 - Updates            520 kB/s | 3.1 MB     00:06                                                            
Fedora 33 - x86_64 - Updates                    7.5 MB/s |  27 MB     00:03                                                            
Fedora 33 - x86_64                              522 kB/s |  72 MB     02:20                                                            
Dependencies resolved.
...
Installed:
 busybox-1:1.32.1-1.fc33.x86_64                                                
 
Complete!
--> 92087429448
STEP 3: ENV foo=bar
STEP 4: COMMIT myimage
--> 16dd65e3f57
16dd65e3f57a5808035b713a6ba3267146caf2a03dd4205097a5727f9d326de9
 
sh-5.0$ podman images
REPOSITORY                         TAG     IMAGE ID      CREATED             SIZE
localhost/myimage                  latest  16dd65e3f57a  About a minute ago  427 MB
registry.fedoraproject.org/fedora  latest  9f2a56037643  3 months ago        182 MB
 
sh-5.0$ podman run myimage busybox                                                                                                                                                                                                               
BusyBox v1.32.1 (2021-03-22 18:56:41 UTC) multi-call binary.                                                                           
BusyBox is copyrighted by many authors between 1998-2015.                                                                              
Licensed under GPLv2. See source distribution for detailed                                                                             
copyright notices.                                                                                                                     
                                                                                                                                      
Usage: busybox [function [arguments]...]                                                                                               
  or: busybox --list[-full]                                                                                                           
  or: busybox --show SCRIPT                                                                                                           
  or: busybox --install [-s] [DIR]                                                                                                    
  or: function [arguments]...
...

[ Začínáte s kontejnery? Podívejte se na tento bezplatný kurz. Nasazení kontejnerových aplikací:technický přehled. ]

Rootless Podman bez privilegované vlajky

Chcete-li odstranit privilegovaný příznak, musíme provést následující:

  • Zařízení:/dev/fuse je vyžadováno pro použití fuse-overlayfs uvnitř kontejneru, tato volba říká Podmanovi na hostiteli, aby přidal /dev/fuse do kontejneru, aby jej mohl kontejnerový Podman použít.
  • Zakázat SELinux:SELinux neumožňuje kontejnerizovaným procesům připojovat všechny souborové systémy potřebné ke spuštění uvnitř kontejneru. Musíme tedy zakázat SELinux na hostiteli, na kterém běží cluster Kubernetes.

Abyste mohli připojit zařízení v Kubernetes, musíte nejprve vytvořit plugin zařízení a poté jej použít ve specifikaci pod.

Zde je příklad zásuvného modulu zařízení pro /dev/fuse :https://github.com/kuberenetes-learning-group/fuse-device-plugin/blob/main/fuse-device-plugin-k8s-1.16.yml.

apiVersion: apps/v1
kind: DaemonSet
metadata:
 name: fuse-device-plugin-daemonset
 namespace: kube-system
spec:
 selector:
   matchLabels:
     name: fuse-device-plugin-ds
 template:
   metadata:
     labels:
       name: fuse-device-plugin-ds
   spec:
     hostNetwork: true
     containers:
     - image: soolaugust/fuse-device-plugin:v1.0
       name: fuse-device-plugin-ctr
       securityContext:
         allowPrivilegeEscalation: false
         capabilities:
           drop: ["ALL"]
       volumeMounts:
         - name: device-plugin
           mountPath: /var/lib/kubelet/device-plugins
     volumes:
       - name: device-plugin
         hostPath:
           path: /var/lib/kubelet/device-plugins
     imagePullSecrets:
       - name: registry-secret

Zde je soubor YAML:rootless-no-priv.yaml :

apiVersion: v1
kind: Pod
metadata:
 name: no-priv
spec:
 containers:
   - name: no-priv
     image: quay.io/podman/stable
     args:
       - sleep
       - "1000000"
     securityContext:
       runAsUser: 1000
     resources:
       limits:
         github.com/fuse: 1
     volumeMounts:
       - mountPath: /home/podman/.local/share/containers
         name: podman-local
 volumes:
   - name: podman-local
     hostPath:
       path: /home/umohnani/.local/share/containers
✗ kubectl exec -it no-priv -- sh          
sh-5.0$ id
uid=1000(podman) gid=1000(podman) groups=1000(podman)

sh-5.0$ podman run ubi8 echo hello
Resolved "ubi8" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull registry.access.redhat.com/ubi8:latest...
Getting image source signatures
Copying blob 55eda7743468 done 
Copying blob 4b21dcdd136d done 
Copying config 613e5da7a9 done 
Writing manifest to image destination
Storing signatures
hello
 
sh-5.1$ cat containerfile
FROM ubi8
RUN echo "hello"
ENV foo=bar
 
sh-5.1$ podman build --isolation chroot -t myimage -f containerfile .                                                               
STEP 1: FROM ubi8                                                                                                                 
STEP 2: RUN echo "hello"                                                                                                            
hello                                                                                                                              
--> 096250be78f                                                                                                                   
STEP 3: ENV foo=bar                                                                                                                
STEP 4: COMMIT myimage                                                                                                             
--> ea849ac9875                                                                                                                    
Ea849ac9875eb926d743362bce2e32e90d34fda7a88f28ebd6a1a546db99338f
 
sh-5.1$ podman images
REPOSITORY                   	TAG 	IMAGE ID  	CREATED     	SIZE
localhost/myimage            	latest  ea849ac9875e  41 seconds ago  245 MB
registry.access.redhat.com/ubi8  latest  0724f7c987a7  3 weeks ago 	245 MB

Rootful Podman bez privilegované vlajky

Vytvořte si plugin zařízení, jak je uvedeno výše.

K tomu budete muset přidat následující funkce:

  • CAP_SYS_ADMIN je vyžadován pro Podman běžící jako root uvnitř kontejneru k připojení požadovaných souborových systémů.
  • CAP_MKNOD je vyžadován pro Podman spuštěný jako root uvnitř kontejneru k vytvoření zařízení v /dev. (Všimněte si, že Docker to ve výchozím nastavení umožňuje).
  • CAP_SYS_CHROOT a CAP_SETFCAP jsou vyžadovány, protože jsou součástí výchozího seznamu schopností v Podmanu, a když spustíte příkaz Podman, přidá funkce, které potřebuje, takže pokud spustíte k8s pod bez této schopnosti Podman selže.

Zde je soubor YAML:rootful-no-priv.yaml :

apiVersion: v1
kind: Pod
metadata:
 name: no-priv-rootful
spec:
 containers:
   - name: no-priv-rootful
     image: quay.io/podman/stable
     args:
       - sleep
       - "1000000"
     securityContext:
       capabilities:
         add:
           - "SYS_ADMIN"
           - "MKNOD"
           - "SYS_CHROOT"
           - "SETFCAP"
     resources:
       limits:
         github.com/fuse: 1
✗ kubectl exec -it no-priv-rootful -- sh
sh-5.0# id
uid=0(root) gid=0(root) groups=0(root)

sh-5.0# podman run ubi8 echo hello
Resolved "ubi8" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull registry.access.redhat.com/ubi8:latest...
Getting image source signatures
Copying blob 55eda7743468 done
Copying blob 4b21dcdd136d done
Copying config 613e5da7a9 done
Writing manifest to image destination
Storing signatures
hello

Vzdálené ovládání Podman v podu Kubernetes se zásuvkou Podman běžící na hostiteli

Chcete-li nastavit tento případ použití, musíte provést následující:

  • Zakažte SELinux na hostiteli.
  • Podle tohoto článku povolte na svém hostiteli zásuvku Podman.

Zde je soubor YAML:remote.yaml :

apiVersion: v1
kind: Pod
metadata:
 name: podman-remote
spec:
 containers:
   - name: remote
     image: quay.io/podman/stable
     args:
       - sleep
       - "1000000"
     volumeMounts:
         - mountPath: /var/run/podman
           name: podman-sock
 volumes:
   - name: podman-sock
     hostPath:
         path: /var/run/podman

Uvolňujeme zásuvku Podman, která běží na hostiteli, do modulu tím, že pro něj vytvoříme držák svazku.

✗ kubectl exec -it podman-remote -- sh
sh-5.0# id
uid=0(root) gid=0(root) groups=0(root

sh-5.0# podman --remote run ubi8 echo hello
Resolved "ubi8" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull registry.access.redhat.com/ubi8:latest...
Getting image source signatures
Copying blob sha256:55eda774346862e410811e3fa91cefe805bc11ff46fad425dd1b712709c05bbc
Copying blob sha256:4b21dcdd136d133a4df0840e656af2f488c226dd384a98b89ced79064a4081b4
Copying config sha256:613e5da7a934e1963e37ed935917e8be6b8dfd90cac73a724ddc224fbf16da20
Writing manifest to image destination
Storing signatures
hello

Sestavy se zásuvkou Podman unikly do kontejneru:

sh-5.0# cat /home/podman/Containerfile
FROM fedora
RUN dnf install -y busybox
ENV foo=bar

sh-5.0# podman --remote build -t myimage -f Containerfile .                                                                           
STEP 1: FROM fedora                                                                                                                   
STEP 2: RUN dnf install -y busybox                                                                                                  
Fedora 33 openh264 (From Cisco) - x86_64 4.7 kB/s | 2.5 kB 00:00                                                           
Fedora Modular 33 - x86_64 1.8 MB/s | 3.3 MB 00:01                                                            
Fedora Modular 33 - x86_64 - Updates 5.2 MB/s | 3.1 MB 00:00                                                           
Fedora 33 - x86_64 - Updates 4.3 MB/s | 27 MB    
00:06                                                            
Fedora 33 - x86_64 1.0 MB/s | 72 MB    
01:13                                                           
Dependencies resolved.
...
Installed:
 busybox-1:1.32.1-1.fc33.x86_64                                               

Complete!
--> 6ef78b975e1
STEP 3: ENV foo=bar
STEP 4: COMMIT myimage
--> 481c5a0e453
481c5a0e4534573a3872f7cc1ff6806a3ce143edce2ed39568d23efe6f65a292

sh-5.0# podman --remote images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/myimage latest 481c5a0e4534 
2 minutes ago 427 MB
registry.fedoraproject.org/fedora latest 
9f2a56037643 3 months ago 182 MB

sh-5.0# podman --remote run myimage busybox                                                                                           
BusyBox v1.32.1 (2021-03-22 18:56:41 UTC) multi-call binary.                                                   

BusyBox is copyrighted by many authors between 1998-2015.                                                                             
Licensed under GPLv2. See source distribution for detailed                                                                             
copyright notices.                                                                                                                    

Usage: busybox [function [arguments]...]                                                                                              
  or: busybox --list[-full]                                                                                                           
  or: busybox --show SCRIPT                                                                                                          
  or: busybox --install [-s] [DIR]                
  or: function [arguments]...  

...

[ Naučte se základy používání Kubernetes v tomto bezplatném cheatu. ]

Podman v uzamčeném kontejneru s uživatelskými jmennými prostory v Kubernetes

Toto funguje pouze v případě, že používáte CRI-O jako runtime modul pro váš cluster Kubernetes.

Musíme přidat uživatele anotace k běhovému prostředí (např. runc , crun , kata , atd.), který budete používat s CRI-O.

[crio.runtime.runtimes.runc]
runtime_path = ""
runtime_type = "oci"
runtime_root = "/run/runc"
allowed_annotations = [
       "io.containers.trace-syscall",
       "io.kubernetes.cri-o.userns-mode",
]

Přidejte rozsahy UID/GID Podman do subuid a subgid soubory na hostiteli.

✗ cat /etc/subuid
umohnani:100000:65536
containers:200000:268435456

✗ cat /etc/subgid
umohnani:100000:65536
containers:200000:268435456

Poté restartujte CRI-O a poté spusťte cluster Kubernetes:

✗ sudo systemctl restart cri-o

✗ ./local-cluster-up.sh

Protože to spouštíme bez privilegovaný příznak, musíme připojit /dev/fuse , jak je ukázáno v příkladech výše. Vytvořte si tedy svůj /dev/fuse Plugin zařízení, který se má použít ve specifikaci pod.

Zde je soubor YAML:userns.yaml :

apiVersion: v1
kind: Pod
metadata:
 name: podman-userns
 annotations:
   io.kubernetes.cri-o.userns-mode: "auto:size=65536;keep-id=true"
spec:
 containers:
   - name: userns
     image: quay.io/podman/stable
     command: ["sleep", "10000"]
     securityContext:
       capabilities:
         add:
           - "SYS_ADMIN"
           - "MKNOD"
           - "SYS_CHROOT"
           - "SETFCAP"
     resources:
       limits:
         github.com/fuse: 1

Přidali jsme uživatele anotace k podspec specifikující rozsah UID/GID, který se má použít, a jaké ID by mělo být nastaveno v kontejneru – v tomto případě bude nastaveno na uživatele root.

✗ kubectl exec -it podman-userns -- sh
sh-5.0# id
uid=0(root) gid=0(root) groups=0(root)

sh-5.0# cat /proc/self/uid_map
        0     265536      65536

sh-5.0# cat /proc/self/gid_map
        0     265536      65536

sh-5.0# podman run ubi8 echo hello
Resolved "ubi8" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull registry.access.redhat.com/ubi8:latest...
Getting image source signatures
Copying blob 4b21dcdd136d done 
Copying blob 55eda7743468 done 
Copying config 613e5da7a9 done 
Writing manifest to image destination
Storing signatures
hello

Vytváří se pomocí rootful Podman v uzamčeném kontejneru s uživatelskými jmennými prostory

sh-5.0# cat Containerfile
FROM fedora
RUN dnf install -y busybox
ENV foo=bar
 
sh-5.0# podman build -t myimage -f Containerfile .                                                                                     
STEP 1: FROM fedora                                                                                                                    
Resolved "fedora" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)                                                  
Getting image source signatures                                                                                                        
Copying blob 157ab8011454 done                                                                                                         
Copying config 9f2a560376 done                                                                                                         
Writing manifest to image destination                                                                                                  
Storing signatures                                                                                                                     

STEP 2: RUN dnf install -y busybox                                                                                                     
Fedora 33 openh264 (From Cisco) - x86_64        764  B/s | 2.5 kB     00:03                                                            
Fedora Modular 33 - x86_64                      348 kB/s | 3.3 MB     00:09                                                            
Fedora Modular 33 - x86_64 - Updates            2.2 MB/s | 3.1 MB     00:01                                                            
Fedora 33 - x86_64 - Updates                     11 MB/s |  27 MB     00:02                                                            
Fedora 33 - x86_64                              2.1 MB/s |  72 MB     00:34                                                            
Dependencies resolved.       
...
Installed:
 busybox-1:1.32.1-1.fc33.x86_64                                                
 
Complete!
--> 1b0633e5309

STEP 3: ENV foo=bar

STEP 4: COMMIT myimage
--> 2212a101136
2212a1011369ee7e6a4a5d4c15a56fc531a5d43ac24f49d432730c620cec4378
 
sh-5.0# podman images                                                                                                                  
REPOSITORY                         TAG     IMAGE ID      CREATED             SIZE                                                      
localhost/myimage                  latest  2212a1011369  About a minute ago  427 MB                                                    
registry.fedoraproject.org/fedora  latest  9f2a56037643  3 months ago        182 MB
 
sh-5.0# podman run myimage busybox                                                                                                     
BusyBox v1.32.1 (2021-03-22 18:56:41 UTC) multi-call binary.                                                                           
BusyBox is copyrighted by many authors between 1998-2015.                                                                              
Licensed under GPLv2. See source distribution for detailed                                                                             
copyright notices.                                                                                                                     
                                                                                                                                      
Usage: busybox [function [arguments]...]                                                                                               
  or: busybox --list[-full]                                                                                                           
  or: busybox --show SCRIPT                                                                                                           
  or: busybox --install [-s] [DIR]                                                                                                    
  or: function [arguments]...
... 

Poslední myšlenky

Zde, ve druhé části série článků, jsem demonstroval různé případy použití související s interakcemi Podman a Kubernetes. Mnohé z možností jsou podobné těm, které jsme viděli v první části článku s Podmanem v Podmanovi.

[ Získejte tuto bezplatnou knihu od Red Hat a O'Reilly – Kubernetes Operators:Automation the Container Orchestration Platform. ]

Konec série

Je běžné, že tým Podman klade otázky související s provozováním Podmana uvnitř kontejnerů. Existuje mnoho možných přístupů, jak toho dosáhnout, s různými souvisejícími bezpečnostními problémy.

Jedním z největších rozdílů je Podman on Podman nebo Podman v rámci Kubernetes, spolu s tím, jak Docker hraje do diskuze.

Až začnete implementovat Podman v těchto scénářích, nezapomeňte na informace o právech diskutované na začátku článku jedna a nezapomeňte zvážit úvahy týkající se --privileged vlajka. Pro více informací kontaktujte tým Podman.

Nezapomeňte, že Enable Sysadmin má spoustu obsahu Podman.


Linux
  1. Jak používat BusyBox na Linuxu

  2. Jak používám cron v Linuxu

  3. Jak používat Su Command v Linuxu

  1. Jak používat Nginx k přesměrování

  2. Jak používat Podman uvnitř kontejneru

  3. Jak odstranit službu v Kubernetes

  1. Jak používat Terraform Kubernetes Provider

  2. Jak nainstalovat a používat Podman v OpenSUSE Leap 15.3

  3. Jak používat ConfigMaps pro konfiguraci Kubernetes