Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20201024 Podman 容器技術提升大法

Phil Huang
October 24, 2020

20201024 Podman 容器技術提升大法

#COScon2020
#Podman
#COSCUP

Phil Huang

October 24, 2020
Tweet

More Decks by Phil Huang

Other Decks in Technology

Transcript

  1. COSCon’20 & Apache Roadshow - China 黃秉鈞 Phil Huang •

    在地社群活躍推廣者 • 開源人年會 COSCUP • 雲原生台灣使用者社群 Cloud Native Taiwan User Group • 現任職於紅帽解決方案架構師 • OpenShift 基礎平台設計及實踐 • Ansible IT 自動化規劃及管理 • 網路虛擬化及軟體定義網路背景 • 個人技術部落格:blog.pichuang.com.tw 3
  2. COSCon’20 & Apache Roadshow - China COSCUP 開源人年會 4 •

    台灣最大的一年一度 資訊社群大聚會 • 從 2006 年舉辦至今 • 培養出無數技術人才 的核心資訊年會 Ref: https://coscup.org/2020/zh-TW/ Conferences for Open Source Coders, Users, and Promoters
  3. COSCon’20 & Apache Roadshow - China 議題 • Podman 簡介及與其他常見容器技術上差異

    • 介紹 Podman 最新的功能及方向 • Podman 跟 Kubernetes 的協作 5 Ref: https://podman.io/
  4. COSCon’20 & Apache Roadshow - China 容器即是 Linux 6 Ref:

    Linux Performance http://www.brendangregg.com/linuxperf.html nicolaka/ netshoot - https://github.com/nicolaka/netshoot • 技術上來說,一個基本 Linux Container 就是一 個 Linux Process,實踐來自於 Linux Kernel, 而所具備的資安能力也是一樣 • Linux Namespaces • cgroups v1/v2 • SELinux / Apparmor • SECCOMP • 大多數的常見系統工具都還是可以沿用 • Linux Performance Tools • Linux System Tools
  5. COSCon’20 & Apache Roadshow - China Podman:三隻小海豹在大海裡 • 全名為 Pod

    Manager,Podman Pod 的概念跟 Kubernetes Pod 一樣 • 一個 Pod 可以包含 1 個或 1 個以上的容器 (Container) • Daemonless,直接對符合 OCI Container Runtime 的 runc 操作 • Rootless,不需使用 root 特權帳號即可執行,對系統保護更加安全 • 採取 fork/exec 模式執行,與 Docker 設計不同,更符合 Linux process 原生設計 • 可以輕易跟 Systemd 進行整合使用 7 Ref: https://podman.io/
  6. COSCon’20 & Apache Roadshow - China 與其他常見容器運行時差異 8 Ref: Podman

    and Buildah for Docker users https://developers.redhat.com/blog/2019/02/21/podman-and-buildah-for-docker-users/ Client / Server 模型 Fork/Exec 模型
  7. COSCon’20 & Apache Roadshow - China 與其他常見容器管理指令差異 9 Ref: Introduction

    to CRI and OCI https://www.slideshare.net/hongweiqiu/introduction-to-cri-and-oci OCI Runtime runc Docker Engine dockerd kubelet podman crictl cri-o docker CRI libpod Operator by CLI Tools
  8. COSCon’20 & Apache Roadshow - China CRI-O 跟 Podman 可否並存?

    10 Ref: Why Red Hat is investing in CRI-O and Podman https://www.redhat.com/en/blog/why-red-hat-investing-cri-o-and-podman CoreOS 預設搭載 CRI-O 為主要 Container Runtime 同一個主機執行 Podman • 可以並存使用 • Podman 主要功能在此為 進行一次性工程,譬如: 除錯、資料收集、測試 • CRI-O 主要為 K8s 所調 度使用的容器引擎,不會 單獨使用 crictl
  9. COSCon’20 & Apache Roadshow - China 拆分 Docker 能力為 3

    大組件 11 Ref: https://www.redhat.com/en/blog/rhel-8-enables-containers-tools-software-craftsmanship-0 https://events19.linuxfoundation.org/wp-content/uploads/2018/07/OSS-Japan-SlidesPodman-Buildah-and-Quarkus-The-Latest-in-Linux-Containers-Technology-.pdf
  10. COSCon’20 & Apache Roadshow - China 你所知道的基本能力 • 包含常見管理 /

    運行 / 建構映像檔 (Container Image) • yum install –y podman-docker • podman run / start / build / … • 比較特別的是,如果想要查詢外部容器倉庫的資訊 (External Container Registry),譬如像 tag 或 schema 資訊,會需要用 Skopeo 查詢 => 換個方向問,哪些是 Docker 有,但 Podman 沒有的能力? 12 Ref: Red Hat Developer - Podman Basics Cheat Sheet https://developers.redhat.com/cheat-sheets/podman-basics https://github.com/containers/podman/blob/master/transfer.md#missing-commands-in-podman
  11. COSCon’20 & Apache Roadshow - China Docker 有,但 Podman 沒有

    13 Ref: Missing commands in podman https://github.com/containers/podman/blob/master/transfer.md#missing-commands-in- podman
  12. COSCon’20 & Apache Roadshow - China Podman 有,但 Docker 沒有

    14 Ref: Missing commands in docker https://github.com/containers/podman/blob/master/transfer.md#missing-commands-in- docker
  13. COSCon’20 & Apache Roadshow - China Podman 網路處理 • 如同

    docker --net 一樣用法 • Podman 共有 7 種網路模式,當中有 3 種比較常用 • Bridge Mode:預設模式 • Container Mode:復用特定容器命名空間 • Host Mode:復用主機命名空間,場景多為針對作業系統等級除錯 15 $ podman run -it quay.io/pichuang/debug-container $ podman run –it --net container:<container_name> quay.io/pichuang/debug-container $ podman run -it --net host quay.io/pichuang/debug-container Ref: https://speakerdeck.com/pichuang/how-do-i-troubleshooting-on-container-more-than-docker
  14. COSCon’20 & Apache Roadshow - China 如何知道 Podman 為何啟動失敗? •

    觀察 Exit Code,使用 echo $? • 125 下錯 Podman 指令 • 126 在容器執行指令,但不能被正確呼叫 • 127 在容器執行指令,但不能被調用 (invoke),多數意指 command not found 16 $ podman run centos:8 /etc; echo "Exit code: $?" Error: container_linux.go:370: starting container process caused: exec: "/etc": permission denied: OCI runtime permission denied error Exit code: 126 $ podman run --fake centos:8 ; echo "Exit code: $?" Error: unknown flag: --fake Exit code: 125 $ podman run centos:8 foo; echo "Exit code: $?" Error: container_linux.go:370: starting container process caused: exec: "foo": executable file not found in $PATH: OCI runtime command not found error Exit code: 127
  15. COSCon’20 & Apache Roadshow - China Podman 也可以被限制資源使用 • 預設狀況下,會使用主機本身具有的

    CPU 和 Memory 使用 • 但若透過 cgroup 資源限制的狀態下,則可以將特定容器的資源額度做個固定,就連 CPU Pinning 這類事情都能辦得到 • 透過下圖可以了解,有限制跟沒限制的 CPU 及 Memory 利用比率其實是不一樣基礎的 17 $ podman run -d --name with-cgroups --cpuset-cpus 0 --cpu-shares 512 --memory 150m dkuffner/docker-stress --cpu 10 $ podman run -d --name without-cgroups dkuffner/docker-stress --cpu 10 $ podman stats --no-stream ID NAME CPU % MEM USAGE / LIMIT MEM % NET IO BLOCK IO PIDS 27bd781a8ba3 without-cgroups 252.97% 2.396MB / 3.89GB 0.06% 628B / 1.074kB -- / -- 11 b86714a4c717 with-cgroups 452.93% 2.015MB / 157.3MB 1.28% 768B / 2.378kB -- / -- 11
  16. COSCon’20 & Apache Roadshow - China 使用 Systemd 啟動 Podman

    • 相當推薦的系統管理用法 • 內建提供快速建立 Systemd Service Unit 指令,可以自行修改成想要的能力 • 若是 non-root user 則可搭配 Systemd User Service 一起使用 18 $ podman create -p 8080:80 --name web nginx 6d279a1262f59a0cc831c21cd25ad2d1bf61b95f2a7bdd519eef7578502c5e43 $ podman generate systemd --name web -f /home/pichuang/container-web.service $ mkdir -p ~/.config/systemd/user/ $ cp container-web.service ~/.config/systemd/user/container-web.service $ systemctl --user daemon-reload $ systemctl --user enable --now container-web.service $ systemctl --user status container-web.service Ref: Running containers with Podman and shareable systemd services https://www.redhat.com/sysadmin/podman-shareable-systemd-services
  17. COSCon’20 & Apache Roadshow - China 使用 Podman 產生一個 Pod

    • 可以在尚未部署到 Kubernetes 測試之前,以運行單一個 Pod 測試,儘早回饋修正 • 與 Kubernetes 相同,在 Pod 裡面也會有 Pause 容器,存在理由也是為了解決相同問 題,主要共享 Linux Namespace 資源 • 建立 Pod 之後,可以後面在新增想要放置的容器進去 19 $ podman run -dt --pod new:nginx-pod --publish=8080:80 docker.io/library/nginx:1.19.3 686db821c649832d6b6c7074fae13831477badf8dec8707000a41d5b11297111 $ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 686db821c649 docker.io/library/nginx:1.19.3 nginx -g daemon o... About a minute ago Up About a minute ago 0.0.0.0:8080->80/tcp heuristic_blackburn e2306e151fed k8s.gcr.io/pause:3.2 About a minute ago Up About a minute ago 0.0.0.0:8080->80/tcp d0606265918b-infra Ref: Podman: Managing pods and containers in a local container runtime https://developers.redhat.com/blog/2019/01/15/podman-managing-containers-pods
  18. COSCon’20 & Apache Roadshow - China 使用 Podman 產生 Kube

    YAML • Podman 2.x 之後開始支援產生 Kubernetes 相關物件 • 可以從既有的 Podman Pod 產生 Kubernetes Pod 跟 Service YAML • 雖然還在開發階段,但長遠來看是相當正確的路線,可以從 2.1.0 之後開始用起 20 $ podman generate kube --help Generate Kubernetes YAML from a container or pod. Description: Command generates Kubernetes pod and service YAML (v1 specification) from a Podman container or pod. Whether the input is for a container or pod, Podman will always generate the specification as a pod. $ podman generate kube --service d0606265918b apiVersion: v1 kind: Pod …omit… --- apiVersion: v1 kind: Service …omit… Ref: Moving from docker-compose to Podman pods https://www.redhat.com/sysadmin/compose-podman-pods
  19. COSCon’20 & Apache Roadshow - China 使用 Podman 運行 Kube

    YAML • 既然可以輸出 Kubernetes YAML,當然也可以運行 Kubernetes YAML !!! • 連 replica 設定多少都會完全遵照執行 22 $ podman play kube --help Play a pod based on Kubernetes YAML. Description: Command reads in a structured file of Kubernetes YAML. It creates the pod and containers described in the YAML. The containers within the pod are then started and the ID of the new Pod is output. $ wget https://raw.githubusercontent.com/kubernetes/website/master/content/en/examples/controllers/nginx- deployment.yaml $ cat nginx-deployment.yaml | grep replicas replicas: 3 $ podman play kube ./nginx-deployment.yaml $ podman pod ps POD ID NAME STATUS CREATED # OF CONTAINERS INFRA ID 3856aa3a53fe nginx-deployment-pod-2 Running 26 seconds ago 2 aaff9084887c f03937100d9d nginx-deployment-pod-1 Running 26 seconds ago 2 db40e2417335 254f7faf3320 nginx-deployment-pod-0 Running 47 seconds ago 2 96a6d8c8593b Ref: The podman play kube command now supports deployments https://www.redhat.com/sysadmin/podman-play-kube
  20. COSCon’20 & Apache Roadshow - China References • Red Hat

    Level Up Hour • https://www.openshift.com/levelup • https://github.com/level-up-hour/episodes • COSCUP 開源人年會 • https://blog.coscup.org • Phil Workspace • https://blog.pichuang.com.tw • Hwchiu Learning Note • https://www.hwchiu.com/ 24