,

왜 podman으로?

제가 직장 때문에 kubernetes나 openshift를 다루고 있습니다.
여기서는 stack이 아니라 pod로 부르죠.
rootfull이 아니라 rootless가 기본입니다.
그래서 연습을 위해서 podman을 설치해보다가 메모리 사용량을 발견했습니다.

10MB, 100MB 정도 수준으로 사용하더군요.
그런데 독커 데몬이 50MB 정도를 사용합니다.

가뜩이나 라즈베리파이 메모리도 적은데..
그래서 일부 lxd의 독커를 podman으로 전환하기로 했습니다.

몇개 해보니까 모든 docker를 pod로 전환하기는 가능할 것 같은데..
귀찬아서 pass하기로 했습니다.ㅎㅎ

podman으로 전환해보자.

제가 전환할 때 했던 설정들을 기록해보려고 합니다.

docker 제거 및 podman 설치

sudo dnf remove docker-ce docker-ce-cli containerd.io docker-compose-plugin -y
rm /etc/yum.repos.d/docker-ce.repo

sudo dnf install podman-docker podman-plugins cockpit-podman podman-tui

# selinux 해제하기
setenforce 0
sudo sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config

# 아키텍처와 버전 주의!! 저는 raspberrpi에 설치한 것이어서 aarch64용입니다. 
# 절대 그대로 복붙해서 설치하지 마세요.
link=https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-aarch64
sudo curl -SL ${link} -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

sudo systemctl enable --now podman.socket
sudo systemctl status podman.socket

# podman compose 
sudo -H pip3 install --upgrade pip
sudo pip3 install https://github.com/containers/podman-compose/archive/devel.tar.gz

(아마도 arm 환경은) infra 설정을 해줍니다.

/etc/containers/containers.conf.d/infra.conf 파일에 infra image 설정을 해줍니다.
이 설정을 해주는 이유는 다음과 같습니다.

  • pod를 systemd로 등록하려면, infra가 포함된 pod여야 한다.
  • 기본으로 설정된 infra-image는 raspberrypi에서 안된다.
  • almalinux에서 만든 pause 이미지는 pause를 찾을 수 없다면서 실행이 안된다(????)
  • infra-imageregistry.access.redhat.com/ubi9/pause로 설정해준다.

아마 x86_64 시스템에서는 기본 pause 이미지로 될거예요.
제가 x86_64 시스템에서 안해봐서 x86_64도 필수로 해야 하는 작업인지, arm만 하면 되는지 모르겠습니다.

Almalinux 뒷담(?)좀 까자면, Oracle Cloud에 있는 almalinux는 Oracle Cloud Agent가 없습니다.
agent 설치 과정이 없는게 아니라, 설치 과정에서 agent 파일을 찾을 수 없다면서 설치가 안되요.
부팅 로그 보면 있습니다.
sudo mkdir -p /etc/containers/containers.conf.d/
sudo tee /etc/containers/containers.conf.d/infra.conf << 'EOF'
[engine]
# Tells container engines how to handle the builtin image volumes.
#   * bind: An anonymous named volume will be created and mounted
#     into the container.
#   * tmpfs: The volume is mounted onto the container as a tmpfs,
#     which allows users to create content that disappears when
#     the container is stopped.
#   * ignore: All volumes are just ignored and no action is taken.
#
#image_volume_mode = ""

# Default command to run the infra container
#
infra_command="/pause"

# Infra (pause) container image name for pod infra containers.  When running a
# pod, we start a pause process in a container to hold open the namespaces
# associated with the  pod.  This container does nothing other then sleep,
# reserving the pods resources for the lifetime of the pod. By default container
# engines run a builtin container using the pause executable. If you want overr>
# specify an image to pull.
#
infra_image="registry.access.redhat.com/ubi9/pause"
EOF

podman용으로 docker-compose.yml을 변환하기

hostname 제거

netdata에서는 container의 hostname으로 표시 되어서 hostname을 설정해두었었는데
podman compose에서는 적용이 안된다고 하더군요..
podman으로 따로 실행해야 하는 것 같습니다.

restart 제거

podman에서 restart되면 안됩니다.
systemd가 restart하거나 제어해야하기 때문에 제거해야 합니다.
나중에 systemd에 등록까지 할거예요.

auto update 설정

auto update 할 container에 대하여 label을 설정합니다.
watchtower를 대체할 수 있겠더라구요.
watchtower가 cpu를 꽤 쓰던데.. dockerdwatchtower 제거로 꽤 많은 리소스를 확보한 것 같네요

    labels:
      - io.containers.autoupdate=registry

podman 실행

sudo podman-compose --pod-args='--infra=true' up -d

systemd에 넣을 service 파일 생성 enable

# systemd 생성. POD-, CON-으로 시작하도록 생성
sudo podman generate systemd --name --files --restart-policy on-failure --container-prefix 'CON' --pod-prefix POD --separator - pod_$podname

# POD-로 시작하고 .service로 끝나는 파일을 systemd로 복사
sudo cp -avf POD-*.service /etc/systemd/system/
sudo systemctl daemon-reload

# POD-로 시작하는 서비스 enable
sudo systemctl list-unit-files | grep -E '^POD-' | awk '{print $1}'

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다


Ads Blocker Image Powered by Code Help Pro

광고 차단 감지됨!

닫기를 누르면 이용하실 수 있지만, 광고 차단은 해제해주시면 좋겠습니다.
Powered By
100% Free SEO Tools - Tool Kits PRO