Tag: Nerdctl

kubectl cheatsheet

オプション効果
kubectl get nodesノードの一覧表示
kubectl get podsポッドの一覧表示
kubectl get pods --namespace=<namespace_name>特定のネームスペースのリソースを表示
kubectl get namespacesネームスペース一覧
kubectl get jobsジョブの確認
kubectl get jobsジョブの確認
kubectl get svc -o wideサービスの一覧表示(ロードバランサーも見れる)
kubectl get deployments -n <namespace>デプロイメントの一覧表示
kubectl rollout restart <deployment> -n defaultデプロイメントの再起動
kubectl logs <pod_name>ログの確認とデバッグ
kubectl logs jobs/example-jobログ
kubectl scale deployment <deployment> --replicas=0 -n <namespace>デプロイメントのスケール
kubectl exec -it <pod_name> -- <command>ポッド内でコマンドを実行するには
kubectl apply -f <filename.yaml>リソースの作成
kubectl delete -f <filename.yaml>リソースの削除
Read more...

nerdctl cheatsheet

–address /run/k3s/containerd/containerd.sock –namespace k8s.io

サンプル

sudo nerdctl –address /run/k3s/containerd/containerd.sock –namespace k8s.io build -t cli-tool-docker:latest /mnt/nfs/home/exampleuser/workspace/git/github.com/exampleuser/cli-tool-docker/

exec

nerdctl/docs/command-reference.md at main · containerd/nerdctl

–init でコンテナ内でinit経由で起動できる

nerdctl はコンテナ内で独自の init プロセスを自動的に起動します。 この init プロセスは PID 1 として動作し、ユーザーが指定したコマンドはその子プロセスとして実行されます。 これにより、コンテナ内のプロセス管理が改善され、特にゾンビプロセスの問題が効果的に解決されます。

参考

Read more...

k3sでコンテナをビルドする

背景

ラズパイ上にGenPi64をインストールし、k3sでkubernetes環境を構築した。 このラズパイでdockerイメージをビルドしたい。

私の環境でのnerdctlはbuildkitが必要だった。

buildkitのインストールとbuildkitd(デーモン)の起動

インストール

buildkitはGo言語で書かれており多数のプラットフォーム向けにパッケージが提供されている。

buildkitのプロジェクトページ( moby/buildkit: concurrent, cache-efficient, and Dockerfilcnie-agnostic builder toolkit )の「Releases」に移動し「Assets」から各プラットフォームのtarアーカイブをダウンロードする。 私のラズパイ環境の場合、buildkit-v0.12.4.linux-arm64.tar.gz を用いた。

展開するとbinディレクトリができるので中身を全て/usr/local/bin配下にコピーした。cni

buildkitd(デーモン)の起動

systemdのユニットとして起動させたいが手軽に試す場合は下記で起動する。 これでビルドが開始できる。

sudo /usr/local/bin/buildkitd &
INFO[2024-01-17T23:05:15+09:00] auto snapshotter: using overlayfs
WARN[2024-01-17T23:05:15+09:00] using host network as the default
INFO[2024-01-17T23:05:15+09:00] found worker "icepdj7khuiltkpxu75ft0k9w", labels=map[org.mobyproject.buildkit.worker.executor:oci org.mobyproject.buildkit.worker.hostname:k3s-prd-agent-a org.mobyproject.buildkit.worker.network:host org.mobyproject.buildkit.worker.oci.process-mode:sandbox org.mobyproject.buildkit.worker.selinux.enabled:false org.mobyproject.buildkit.worker.snapshotter:overlayfs], platforms=[linux/arm64 linux/arm/v7 linux/arm/v6]
WARN[2024-01-17T23:05:15+09:00] skipping containerd worker, as "/run/containerd/containerd.sock" does not exist
INFO[2024-01-17T23:05:15+09:00] found 1 workers, default="icepdj7khuiltkpxu75ft0k9w"
WARN[2024-01-17T23:05:15+09:00] currently, only the default worker can be used.
INFO[2024-01-17T23:05:15+09:00] running server on /run/buildkit/buildkitd.sock

buildkitd起動後、Dockerfileが存在するディレクトリに移動して下記のようにビルドできる。

Read more...

Ubuntu22.04でNFS_Homeで rootless containerdを試す

背景

私はNFS homeを利用している。NFS上にコンテナを置けないトラブルへのTIPSについて残しておく。 またログが~/.local/share/nerdctl配下に書き出されるが、NFS上にログが書き出されると非常に重くなってしまうので別の場所をしていするようにした

chown ができない、というエラーが出る

error: failed to solve: failed to compute cache key: mount callback failed on /var/lib/containerd/tmpmounts/containerd-mount2455064670: failed to Lchown "/var/lib/containerd/tmpmounts/containerd-mount2455064670/etc/gshadow" for UID 0, GID 42: lchown /var/lib/containerd/tmpmounts/containerd-mount2455064670/etc/gshadow: operation not permitted: unknown

NFSの場合、rootlessが動作しない、ようだ

rootless containerdはデフォルトでホームディレクトリ配下を使用するが、私がNFS Homeだったので動作しなかった。

Redhatのエントリが参考になる。 Rootless Podman and NFS

Why doesn’t Podman support storage on NFS?
The use case that does not work well is having the container image store reside on an NFS mount point.
ンテナイメージをNFS上に置くのは良くないらしい。

The NFS protocol has no concept of user namespaces and has no way to know that the process running as UID 1000 is in one.
The NFS server also has no way of knowing that the client process has DAC_OVERRIDE for the user namespace and that UID 100059 is mapped into the same user namespace.
In other words, the chance of this information being known by NFS is slim at best.

NFSサーバ側はクライアント側で DAC_OVERRIDE しようとしているかなど分からない(NFSはサポートしていない機能なので仕方がない)

解決策としては2つのアプローチが紹介されている。

Read more...

UbuntuでのAppArmorのメモ

背景

containerdをrootlessで動かそうとしたところAppArmorに引っかかってしまった

(私の場合、/mnt配下の追加ディスク上にコンテナイメージを置きたい、という背景があったため引っかかったと思われる)

標準的なディレクトリ以外で動作させようとした場合に問題になりそう。

下記のエラーが出た

Mar  6 00:39:00 marie-ms7817 systemd[1055]: Started libcontainer container d1b514a134af96a15f5062afe042fd8654d91b2be4bef27f9af5865e29d2cad7.
Mar  6 00:40:30 marie-ms7817 kernel: [ 7375.140738] audit: type=1400 audit(1709653230.078:103): apparmor="DENIED" operation="change_onexec" class="file" info="label not found" error=-2 profile="unconfined" name="nerdctl-default" pid=54813 comm="aa-exec"

apparmor=“DENIED operation=“change_onexec” このメッセージは、AppArmor(Linuxのセキュリティモジュールの一つ)が、実行時の権限変更を拒否したことを示している。 特に、name=“nerdctl-default"に関連する操作が拒否されており、これはコンテナのセキュリティポリシーに関連する問題を示唆している。 label not foundという部分から、特定のセキュリティラベルが見つからない、または適切に設定されていない可能性がある。

既存の設定前の確認

nerdctl-defaultに関連する設定があるか確認。 下記コマンドで現在のAppArmorの設定のリストを出力し設定があるか確認(無かった)

sudo aa-status

ポリシーファイルの作成

/etc/apparmor.d ディレクトリに nerdctl-default という名前の新しい AppArmor ポリシーファイルを作成する。

/etc/apparmor.d/nerdctl-default とした。

#include <tunables/global>

profile nerdctl-default flags=(attach_disconnected,mediate_deleted) {
    / r,
    /dev/tty rw,
    /dev/pts/** w,
    /dev/null rw,
    /etc/.ro*/ld.so.cache r,
    /etc/ld.so.cache r,
    /etc/locale.alias r,
    /etc/nsswitch.conf r,
    /etc/passwd r,
    /mnt/append-disk/containerd/** rwk,
    /proc/ r,
    /proc/** r,
    /sys/devices/system/** r,
    /sys/kernel/mm/transparent_hugepage/hpage_pmd_size r,
    /usr/bin/** rix,
    /usr/lib/locale/locale-archive r,
    /usr/lib/x86_64-linux-gnu/** rm,
    /usr/lib/locale/** r,
    /usr/share/terminfo/** r,
    /var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/** rwk,
    /var/lib/containerd/** rwk,
    owner /** rwix,
    network,
    ptrace (read, readby) peer=nerdctl-default,
    signal (receive) peer=nerdctl-default,
    signal (receive) peer=unconfined,
    signal (send) peer=nerdctl-default,
    signal (send) set=kill peer=unconfined,
}

それぞれの意味。

Read more...