Podman dans Kubernetes/OpenShift
Dans la première partie, l'accent était mis sur Podman dans les scénarios Podman. Nous avons vu certaines des différentes combinaisons de Podman avec et sans racine. Nous avons également discuté des ramifications du --privileged
drapeau.
Mais qu'en est-il de Podman et Kubernetes ? De nombreuses options sont également disponibles pour relier ces deux services.
Pour la deuxième partie de la série, j'utilise un cluster Kubernetes exécuté avec CRI-O comme environnement d'exécution.
[ Aide-mémoire gratuit :glossaire Kubernetes ]
Rootful Podman avec l'indicateur privilégié défini
Ici, nous exécutons un conteneur privilégié avec l'utilisateur root afin que Podman s'exécute en tant que root à l'intérieur du conteneur.
Voici le fichier 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
Nous pouvons également créer avec succès des images à l'intérieur du conteneur privilégié avec Podman rooté. Construisons une image où nous installons BusyBox sur Fedora.
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]...
...
Podman sans racine avec l'indicateur privilégié défini
Ici, nous exécutons un conteneur privilégié avec le podman(1000) utilisateur afin que Podman s'exécute en tant qu'utilisateur 1000 à l'intérieur du conteneur.
Voici le fichier 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
Nous pouvons également créer avec succès des images à l'intérieur du conteneur privilégié avec Podman sans racine. Construisons une image où nous installons BusyBox sur Fedora.
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]...
...
[ Vous débutez avec les conteneurs ? Découvrez ce cours gratuit. Déploiement d'applications conteneurisées :présentation technique. ]
Podman sans racine sans drapeau privilégié
Pour éliminer l'indicateur privilégié, nous devons procéder comme suit :
- Appareils :
/dev/fuse
est nécessaire pour utiliser fuse-overlayfs à l'intérieur du conteneur, cette option indique à Podman sur l'hôte d'ajouter/dev/fuse
au conteneur afin que Podman conteneurisé puisse l'utiliser. - Désactiver SELinux :SELinux n'autorise pas les processus conteneurisés à monter tous les systèmes de fichiers nécessaires pour s'exécuter dans un conteneur. Nous devons donc désactiver SELinux sur l'hôte qui exécute le cluster Kubernetes.
Pour pouvoir monter un appareil dans Kubernetes, vous devez d'abord créer un plug-in d'appareil, puis l'utiliser dans la spécification du pod.
Voici un exemple de plugin de périphérique pour /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
Voici le fichier 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 sans le drapeau privilégié
Créez le plug-in de votre appareil comme indiqué ci-dessus.
Pour cela, vous devrez ajouter les fonctionnalités suivantes :
- CAP_SYS_ADMIN est requis pour que le Podman s'exécute en tant que racine à l'intérieur du conteneur pour monter les systèmes de fichiers requis.
- CAP_MKNOD est nécessaire pour que Podman s'exécute en tant que root à l'intérieur du conteneur afin de créer les appareils dans
/dev.
(Notez que Docker le permet par défaut). - CAP_SYS_CHROOT et CAP_SETFCAP sont nécessaires car ils font partie de la liste par défaut des fonctionnalités dans Podman, et lorsque vous exécutez une commande Podman, elle ajoute les fonctionnalités dont elle a besoin, donc si vous exécutez votre pod
k8s pod
sans cette capacité, Podman échoue.
Voici le fichier 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
Podman-remote dans un pod Kubernetes avec le socket Podman exécuté sur l'hôte
Vous devez effectuer les opérations suivantes pour configurer ce cas d'utilisation :
- Désactivez SELinux sur l'hôte.
- Suivez cet article pour activer le socket Podman sur votre hôte.
Voici le fichier 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
Nous divulguons le socket Podman qui s'exécute sur l'hôte dans le pod en créant un montage de volume pour celui-ci.
✗ 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
Construit avec le socket Podman qui a fui dans le conteneur :
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]...
...
[ Apprenez les bases de l'utilisation de Kubernetes dans cet aide-mémoire gratuit. ]
Podman dans un conteneur verrouillé utilisant des espaces de noms d'utilisateurs dans Kubernetes
Cela ne fonctionne que si vous utilisez CRI-O comme moteur d'exécution pour votre cluster Kubernetes.
Nous devons ajouter les utilisateurs annotation au runtime (par exemple, runc
, crun
, kata
, etc.) que vous utiliserez avec 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",
]
Ajoutez les plages Podman UID/GID au subuid
et subgid
fichiers sur l'hôte.
✗ cat /etc/subuid
umohnani:100000:65536
containers:200000:268435456
✗ cat /etc/subgid
umohnani:100000:65536
containers:200000:268435456
Redémarrez CRI-O après cela, puis démarrez votre cluster Kubernetes :
✗ sudo systemctl restart cri-o
✗ ./local-cluster-up.sh
Puisque nous exécutons ce sans le drapeau privilégié, nous devons monter /dev/fuse
, comme le montrent les exemples ci-dessus. Alors, créez votre /dev/fuse
Plugin d'appareil à utiliser dans la spécification du pod.
Voici le fichier 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
Nous avons ajouté les utilisateurs annotation au podspec spécifiant la plage d'UID/GID à utiliser et quel ID doit être défini dans le conteneur - il sera défini sur l'utilisateur root dans ce cas.
✗ 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
Construit avec Podman rooté dans un conteneur verrouillé avec des espaces de nom d'utilisateur
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]...
...
Réflexions finales
Ici, dans la deuxième partie de la série d'articles, j'ai démontré divers cas d'utilisation liés aux interactions Podman et Kubernetes. De nombreux choix sont similaires à ceux que nous avons vus dans l'article de la première partie avec Podman dans Podman.
[ Obtenez ce livre gratuit de Red Hat et O'Reilly - Kubernetes Operators :Automating the Container Orchestration Platform. ]
Récapitulation de la série
Il est courant que l'équipe Podman réponde aux questions liées à l'exécution de Podman dans des conteneurs. Il existe de nombreuses approches possibles pour ce faire, avec divers problèmes de sécurité connexes.
L'un des plus grands différenciateurs est Podman sur Podman ou Podman dans Kubernetes, ainsi que la façon dont Docker joue dans la discussion.
Lorsque vous commencez à implémenter Podman dans ces scénarios, n'oubliez pas les informations sur les privilèges discutées au début de l'article un, et assurez-vous de peser les considérations concernant le --privileged
drapeau. Contactez l'équipe Podman pour plus d'informations.
N'oubliez pas que Enable Sysadmin a beaucoup de contenu Podman.