Podman di Kubernetes/OpenShift
Di bagian pertama, fokusnya adalah pada Podman dalam skenario Podman. Kami melihat beberapa kombinasi Podman root dan rootless yang berbeda. Kami juga membahas konsekuensi dari --privileged
bendera.
Tapi bagaimana dengan Podman dan Kubernetes? Ada banyak pilihan yang tersedia untuk menghubungkan kedua layanan ini juga.
Untuk bagian kedua dari seri ini, saya menggunakan cluster Kubernetes yang berjalan dengan CRI-O sebagai runtime.
[ Lembar contekan gratis:Glosarium Kubernetes ]
Rootful Podman dengan set flag istimewa
Di sini kita menjalankan wadah istimewa dengan pengguna root sehingga Podman akan berjalan sebagai root di dalam wadah.
Ini file YAMLnya: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
Kami juga dapat berhasil membuat gambar di dalam wadah yang diistimewakan dengan Podman rootful. Mari kita buat gambar tempat kita menginstal BusyBox di 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 Rootless dengan set flag istimewa
Di sini kami menjalankan wadah istimewa dengan podman(1000) user sehingga Podman berjalan sebagai user 1000 di dalam container.
Ini file YAMLnya: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
Kami juga dapat berhasil membangun gambar di dalam wadah yang diistimewakan dengan Podman tanpa akar. Mari kita buat gambar tempat kita menginstal BusyBox di 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]...
...
[ Memulai container? Lihat kursus gratis ini. Menyebarkan aplikasi kemas:Tinjauan teknis. ]
Podman Rootless tanpa flag istimewa
Untuk menghilangkan flag yang diistimewakan, kita perlu melakukan hal berikut:
- Perangkat:
/dev/fuse
diperlukan untuk menggunakan fuse-overlayf di dalam container, opsi ini memberitahu Podman pada host untuk menambahkan/dev/fuse
ke container sehingga Podman dalam container dapat menggunakannya. - Nonaktifkan SELinux:SELinux tidak mengizinkan proses kemas untuk memasang semua sistem file yang diperlukan untuk berjalan di dalam wadah. Jadi kita perlu menonaktifkan SELinux pada host yang menjalankan cluster Kubernetes.
Untuk dapat memasang perangkat di Kubernetes, Anda harus membuat Plugin Perangkat terlebih dahulu, lalu menggunakannya dalam spesifikasi pod.
Berikut adalah contoh Plugin Perangkat untuk /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
Ini file YAMLnya: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 tanpa flag istimewa
Buat plugin perangkat Anda seperti yang ditunjukkan di atas.
Anda harus menambahkan kemampuan berikut untuk ini:
- CAP_SYS_ADMIN diperlukan agar Podman berjalan sebagai root di dalam wadah untuk memasang sistem file yang diperlukan.
- CAP_MKNOD diperlukan agar Podman berjalan sebagai root di dalam wadah untuk membuat perangkat di
/dev.
(Perhatikan bahwa Docker mengizinkan ini secara default). - CAP_SYS_CHROOT dan CAP_SETFCAP diperlukan karena merupakan bagian dari daftar default kemampuan di Podman, dan ketika Anda menjalankan perintah Podman, perintah tersebut akan menambahkan kemampuan yang dibutuhkan, jadi jika Anda menjalankan
k8s pod
Anda tanpa kemampuan ini, Podman gagal.
Ini file YAMLnya: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 dalam pod Kubernetes dengan soket Podman berjalan di host
Anda perlu melakukan hal berikut untuk menyiapkan kasus penggunaan ini:
- Nonaktifkan SELinux di host.
- Ikuti artikel ini untuk mengaktifkan soket Podman di host Anda.
Ini file YAMLnya: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
Kami membocorkan soket Podman yang berjalan di host ke dalam pod dengan membuat volume mount untuknya.
✗ 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
Bangunan dengan soket Podman bocor ke dalam wadah:
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]...
...
[ Pelajari dasar-dasar penggunaan Kubernetes di lembar contekan gratis ini. ]
Podman dalam wadah terkunci menggunakan ruang nama pengguna di Kubernetes
Ini hanya berfungsi jika Anda menggunakan CRI-O sebagai mesin runtime untuk cluster Kubernetes Anda.
Kita perlu menambahkan pengguna anotasi ke runtime (mis., runc
, crun
, kata
, dll.) yang akan Anda gunakan dengan 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",
]
Tambahkan rentang UID/GID Podman ke subuid
dan subgid
file di host.
✗ cat /etc/subuid
umohnani:100000:65536
containers:200000:268435456
✗ cat /etc/subgid
umohnani:100000:65536
containers:200000:268435456
Mulai ulang CRI-O setelah ini, lalu mulai klaster Kubernetes Anda:
✗ sudo systemctl restart cri-o
✗ ./local-cluster-up.sh
Karena kami menjalankan ini tanpa bendera istimewa, kita perlu me-mount /dev/fuse
, seperti yang ditunjukkan pada contoh di atas. Jadi, buat /dev/fuse
Plugin Perangkat yang akan digunakan dalam spesifikasi pod.
Ini file YAMLnya: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
Kami telah menambahkan pengguna anotasi ke podspec yang menentukan rentang UID/GID yang akan digunakan dan ID apa yang harus disetel dalam wadah—dalam kasus ini akan disetel ke pengguna 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
Dibangun dengan Podman rootful dalam wadah terkunci dengan ruang nama pengguna
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]...
...
Pemikiran terakhir
Di sini, di bagian dua seri artikel, saya mendemonstrasikan berbagai kasus penggunaan yang terkait dengan interaksi Podman dan Kubernetes. Banyak pilihan yang mirip dengan yang kita lihat di artikel bagian satu dengan Podman di Podman.
[ Dapatkan buku gratis ini dari Red Hat dan O'Reilly - Operator Kubernetes:Mengotomatiskan Platform Orkestrasi Kontainer. ]
Penutup seri
Tim Podman biasanya mengajukan pertanyaan terkait menjalankan Podman di dalam container. Ada banyak kemungkinan pendekatan untuk melakukan ini, dengan berbagai masalah keamanan terkait.
Salah satu pembeda terbesar adalah Podman di Podman atau Podman di dalam Kubernetes, bersama dengan bagaimana Docker berperan dalam diskusi.
Saat Anda mulai menerapkan Podman dalam skenario ini, jangan lupakan informasi hak istimewa yang dibahas di awal artikel satu, dan pastikan untuk mempertimbangkan pertimbangan terkait --privileged
bendera. Hubungi tim Podman untuk informasi lebih lanjut.
Jangan lupa Enable Sysadmin memiliki banyak konten Podman.