From: Michal Nasiadka Date: Wed, 11 Sep 2024 12:26:37 +0000 (+0200) Subject: cephadm: Support Docker Live Restore X-Git-Tag: v19.2.1~69^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=f882fa82fa1bac9d1c8743e2b0d2f654cf9afbb7;p=ceph.git cephadm: Support Docker Live Restore Currently with Docker Live Restore [1] enabled and while restarting Docker Engine - all Ceph container images will get restarted, while the feature allows restarting docker.service without containers downtime. This is due to Requires=docker.service in systemd units templates, which mandates that on docker.service restart - the ceph container systemd units will be restarted as well. Reworking Requires= to Wants= that is a weaker version of the former, see [2]. Leaving After= entries, because they should allow systemd to correctly order the startup (first docker, then ceph containers). [1]: https://docs.docker.com/engine/daemon/live-restore/ [2]: https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html#Wants= Fixes: https://tracker.ceph.com/issues/68028 Signed-off-by: Michal Nasiadka (cherry picked from commit e0f77686523337f37e3ddbbe40eaa92c68947195) --- diff --git a/doc/cephadm/install.rst b/doc/cephadm/install.rst index 640c2fe0db6cf..19f477c2cecd2 100644 --- a/doc/cephadm/install.rst +++ b/doc/cephadm/install.rst @@ -24,6 +24,10 @@ Requirements Any modern Linux distribution should be sufficient. Dependencies are installed automatically by the bootstrap process below. +See `Docker Live Restore `_ +for an optional feature that allows restarting Docker Engine without restarting +all running containers. + See the section :ref:`Compatibility With Podman Versions` for a table of Ceph versions that are compatible with Podman. Not every version of Podman is compatible with diff --git a/src/cephadm/cephadmlib/templates/ceph.service.j2 b/src/cephadm/cephadmlib/templates/ceph.service.j2 index 1c043dcdd6ad1..c2c4c778be635 100644 --- a/src/cephadm/cephadmlib/templates/ceph.service.j2 +++ b/src/cephadm/cephadmlib/templates/ceph.service.j2 @@ -9,7 +9,7 @@ Description=Ceph %i for {{fsid}} After=network-online.target local-fs.target time-sync.target{% if has_docker_engine %} docker.service{% endif %} Wants=network-online.target local-fs.target time-sync.target {%- if has_docker_engine %} -Requires=docker.service +Wants=docker.service {%- endif %} PartOf=ceph-{{fsid}}.target diff --git a/src/cephadm/cephadmlib/templates/init_ctr.service.j2 b/src/cephadm/cephadmlib/templates/init_ctr.service.j2 index e23a72be40f59..6bf4304e38c0d 100644 --- a/src/cephadm/cephadmlib/templates/init_ctr.service.j2 +++ b/src/cephadm/cephadmlib/templates/init_ctr.service.j2 @@ -5,7 +5,7 @@ After=network-online.target local-fs.target time-sync.target Wants=network-online.target local-fs.target time-sync.target {%- if has_docker_engine %} After=docker.service -Requires=docker.service +Wants=docker.service {%- endif %} Before=ceph-{{ identity.fsid }}@%i.service diff --git a/src/cephadm/cephadmlib/templates/sidecar.service.j2 b/src/cephadm/cephadmlib/templates/sidecar.service.j2 index 74e92cf6333c0..62d7337be8c1a 100644 --- a/src/cephadm/cephadmlib/templates/sidecar.service.j2 +++ b/src/cephadm/cephadmlib/templates/sidecar.service.j2 @@ -5,7 +5,7 @@ After=network-online.target local-fs.target time-sync.target Wants=network-online.target local-fs.target time-sync.target {%- if has_docker_engine %} After=docker.service -Requires=docker.service +Wants=docker.service {%- endif %} After={{ primary.service_name }} diff --git a/src/cephadm/tests/test_unit_file.py b/src/cephadm/tests/test_unit_file.py index a1d49c93c2018..74cd89c1a8233 100644 --- a/src/cephadm/tests/test_unit_file.py +++ b/src/cephadm/tests/test_unit_file.py @@ -27,11 +27,11 @@ def _get_unit_file(ctx, fsid): return str(systemd_unit._get_unit_file(ctx, fsid)) -def test_docker_engine_requires_docker(): +def test_docker_engine_wants_docker(): ctx = context.CephadmContext() ctx.container_engine = mock_docker() r = _get_unit_file(ctx, '9b9d7609-f4d5-4aba-94c8-effa764d96c9') - assert 'Requires=docker.service' in r + assert 'Wants=docker.service' in r def test_podman_engine_does_not_req_docker(): @@ -80,7 +80,7 @@ def test_new_docker(): '# configuration.', 'After=network-online.target local-fs.target time-sync.target docker.service', 'Wants=network-online.target local-fs.target time-sync.target', - 'Requires=docker.service', + 'Wants=docker.service', 'PartOf=ceph-9b9d7609-f4d5-4aba-94c8-effa764d96c9.target', 'Before=ceph-9b9d7609-f4d5-4aba-94c8-effa764d96c9.target', '[Service]',