ikke_t.podman_container_systemd

ポッドマンコンテナ-systemd

注意: これがまだ機能することを願っていますが、さらなる開発は新しいLinuxシステムロールポッドマンプロジェクトで行われています。ぜひ試してみてください、これは活発に開発されています。 BR Ikke、長年にわたるすべての貢献者に感謝します!

この役割は、systemdの助けを借りてホスト上で実行されるコンテナを設定します。Podmanはコンテナイベントを実装していますが、ライフサイクルを制御したり追跡したりすることはできません。それはクラスター内のKubernetesや、ローカルインストールのsystemdの仕事です。

私はこの役割を、自分のパーソナルサーバーでポッドマンコンテナのライフサイクルを管理するために書きました。このサーバーはクラスターではないため、再起動後も常に有効で実行されるようにsystemdを使いたいと思っています。

この役割がすること:

  • Podmanをインストールします
  • 必要なイメージをプルします
  • 連続実行時にイメージを再度プルし、イメージが変更された場合はコンテナを再起動します(まだポッドには対応していません)
  • コンテナやポッドのsystemdファイルを作成します
  • ポッドのためにKubernetes YAMLを作成します
  • コンテナのためのボリュームディレクトリを存在しない場合に作成します(ポッドにはDirectoryOrCreateを使用)
  • コンテナが死んだ場合は自動的に再起動するように設定します
  • システムブート時にコンテナまたはポッドを実行状態にします
  • コンテナの公開ポートをファイアウォールに追加または削除します
  • 指定したユーザーの下でrootlessコンテナを実行するためのパラメータを取ります

参考までに、この役割に関する2つのブログをご覧ください:

ブログでは、このモジュールを使用して、単一のコンテナまたは複数のコンテナを一つのポッドとして実行する方法が説明されています。

Rootlessコンテナを実行する際の注意点:

  • この役割を実行する前にユーザーを作成しておく必要があります。
  • ユーザーは、名前空間範囲のために/etc/sub[gu]idファイルにエントリが必要です。 そうでない場合、この役割は何かを進めるためにいくつかの変数を追加しますが、できれば確認してください。
  • メモリや他のリソースの制限などの制御はユーザーとしては機能しません。
  • systemd_TimeoutStartSecを大きく設定することをお勧めします。なぜなら、systemdユニットの開始前にイメージを事前取得できないからです。したがって、systemdはコンテナを開始する前にポッドマンがイメージをプルするのを待つ必要があります。ネットワーク接続やコンテナイメージのサイズによっては、数分かかることがあります。

要件

ポッドマンを実行できるシステムが必要で、パッケージリポジトリからポッドマンが見つかる必要があります。役割はポッドマンをインストールします。また、ユーザーがcontainer_firewall_ports変数を定義している場合、firewalldもインストールします。container_pod_yaml_template_validation: trueの場合、ポッドのためにkubevalをインストールします。

役割変数

役割は、インクルード時に渡す必要のある変数を使用します。一つのコンテナを単独で実行するオプションや複数のコンテナをポッド内で実行するオプションがあるため、一部のオプションは他の方法には適用されないことに注意してください。

  • container_image_list - 実行するコンテナイメージのリスト。 1つ以上のイメージが定義されている場合、コンテナはポッド内で実行されます。 認証情報をイメージごとに含めるために辞書として定義することもできます。
container_image_list:
  - image: docker.io/imagename
    user: exampleuser
    password: examplepw
  - image: docker.io/imagename2
  • container_image_user - リモートレジストリへの認証時に使用するデフォルトのユーザー名(オプション)
  • container_image_password - リモートレジストリへの認証時に使用するデフォルトのパスワード(オプション)
  • container_name - systemdとポッドマンのコマンドでコンテナを識別します。 systemdサービスファイルは container_name--container-pod.service という名前になります。これはservice_nameで上書き可能です。
  • container_run_args - 単一のコンテナを実行する際にポッドマンに渡す任意の引数。ただしポッドには使用されません。文字列または文字列のリストとして指定できます。
  • container_cmd_args - イメージ名を指定した後にpodman-runに渡される任意のコマンドと引数。ポッドには使用されません。
  • container_run_as_user - systemdがコンテナをどのユーザーとして実行するか。デフォルトはrootです。
  • container_run_as_group - systemdがコンテナをどのグループとして実行するか。デフォルトはrootです。
  • container_dir_owner - ボリュームディレクトリの所有者。デフォルトはcontainer_run_as_userです。:Uをボリュームオプションとして使用すると、podmanは自動的にコンテナ内部のユーザーのための権限を設定します。 引用: :Uサフィックスは、PodmanにホストUIDとGIDを使用させ、ソースボリュームの所有者とグループを再帰的に変更します。この操作はホストファイルシステムを変更するので注意して使用してください。
  • container_dir_group - ボリュームディレクトリが持つべきグループ。デフォルトはcontainer_run_as_groupです。
  • container_dir_mode - ボリュームディレクトリが持つべき権限。デフォルトは「0755」です。
  • container_state - コンテナがインストールされ、状態がrunningである場合は実行され、absentの場合は停止し、systemdファイルが削除されます。
  • container_firewall_ports - コンテナから公開したポートのリストと、それをファイアウォールで開けたいポート。container_stateがabsentの場合、ファイアウォールポートが閉じられます。firewalldをインストールしたくない場合は、これを定義しないでください。
  • systemd_TimeoutStartSec - systemdがコンテナの起動を待つ時間。
  • systemd_tempdir - 単一のコンテナのためにconmon-pidfileとcidfileをどこに保存するか。デフォルトはこの指定子をサポートするシステムでは%T(man 5 systemd.unitを参照)です。それ以外では/tmpです。
  • service_name - systemdサービスファイルの名前の付け方。デフォルトは"{{ container_name }}-container-pod-{{ container_run_as_user }}.service"です。
  • service_files_dir - systemdサービスファイルを保存する場所。rootの場合はデフォルトで/usr/local/lib/systemd/system、rootlessユーザーの場合は"{{ user_info.home }}/.config/systemd/user"です。
  • service_files_owner - systemdサービスファイルの所有者。デフォルトはrootです。
  • service_files_group - systemdサービスファイルのグループ。デフォルトはrootです。
  • service_files_mode - systemdサービスファイルの権限。デフォルトは0644です。
  • container_pod_yaml - ポッドYAMLファイルへのパス。ポッドに必須です。
  • container_pod_yaml_deploy - ポッドYAMLファイルをデプロイするかどうか。デフォルトはfalseです。
  • container_pod_yaml_template - ポッドYAMLデプロイに使用するテンプレート。テンプレートにはすべての可能な構成オプションが含まれていないため、自分のテンプレートで上書きすることができます。デフォルトはtemplates/container-pod-yaml.j2です。
  • container_pod_yaml_template_validation - デプロイされたポッドYAMLファイルを検証するかどうか。デフォルトはfalseです。
  • container_pod_labels - container_pod_yaml_deploy用のラベルを定義します。
  • container_pod_volumes - container_pod_yaml_deploy用のボリュームを定義します。
  • container_pod_containers - container_pod_yaml_deploy用のコンテナを定義します。

このプレイブックには、podmanコマンドのパラメータを解析するためのPythonモジュールはありません。したがって、その間、podmanをコマンドラインから使用するかのようにすべてのパラメータを渡す必要があります。情報についてはman podmanまたはpodmanチュートリアルを参照してください。

自動でイメージを更新したい場合は、container_cmd_argsに以下のラベルを追加します: --label "io.containers.autoupdate=image"

この役割をプレイブック内で1回以上実行する予定がある場合は、ansible.builtin.import_roleを使用しないでください。そうしないと、このアンチパターンに陥ります。

依存関係

例プレイブック

サンプルについてはtests/main.ymlをご覧ください。簡単に言うと、変数を指定して役割を含めます。

Rootコンテナ:

- name: tests container
  vars:
    container_image_list: 
      - sebp/lighttpd:latest
    container_name: lighttpd
    container_run_args: >-
      --rm
      -v /tmp/podman-container-systemd:/var/www/localhost/htdocs:Z,U
      --label "io.containers.autoupdate=image"
      -p 8080:80
    #container_state: absent
    container_state: running
    container_firewall_ports:
      - 8080/tcp
      - 8443/tcp
  ansible.builtin.include_role:
    name: podman-container-systemd

Rootlessコンテナ:

- name: ensure user
  user:
    name: rootless_user
    comment: I run sample container

- name: tests container
  vars:
    container_run_as_user: rootless_user
    container_run_as_group: rootless_user
    container_image_list: 
      - sebp/lighttpd:latest
    container_name: lighttpd
    container_run_args: >-
      --rm
      -v /tmp/podman-container-systemd:/var/www/localhost/htdocs:Z,U
      -p 8080:80
    #container_state: absent
    container_state: running
    container_firewall_ports:
      - 8080/tcp
      - 8443/tcp
  ansible.builtin.include_role:
    name: podman-container-systemd

Rootlessポッド:

- name: ensure user
  user:
    name: rootless_user
    comment: I run sample container

- name: tests pod
  vars:
    container_run_as_user: rootless_user
    container_run_as_group: rootless_user
    container_image_list:
      - sebp/lighttpd:latest
    container_name: lighttpd-pod
    container_pod_yaml: /home/rootless_user/lighttpd-pod.yml
    container_pod_yaml_deploy: true
    container_pod_yaml_template_validation: true
    container_pod_labels:
      app: "{{ container_name }}"
      io.containers.autoupdate: 'image(1)'
    container_pod_volumes:
      - name: htdocs
        hostPath:
          path: /tmp/podman-container-systemd
          type: DirectoryOrCreate
    container_pod_containers:
      - name: lighttpd
        image: sebp/lighttpd:latest
        volumeMounts:
          - name: htdocs
            mountPath: /var/www/localhost/htdocs:Z
        ports:
          - containerPort: 80
            hostPort: 8080
    container_state: running
    container_firewall_ports:
      - 8080/tcp
      - 8443/tcp
  ansible.builtin.include_role:
    name: podman-container-systemd

ライセンス

GPLv3

著者情報

Ilkka Tengvall ilkka.tengvall@iki.fi

プロジェクトについて

Role sets up container(s) to run on host with help of systemd.

インストール
ansible-galaxy install ikke_t.podman_container_systemd
ライセンス
Unknown
ダウンロード
13.1k
所有者
I nerd around the clock. At day time for Red Hat, at evenings for my hobby projects. Except when family duties interrupt :) All for open source.