Remove docker devicemapper support

This has now been removed from upstream docker-ce packages.

```
the devicemapper storage-driver has been deprecated and removed
```

and has shown deprecation warnings for some time.

This change also includes some fixes necessary for CI to pass:

* update the Zuul previous_release variable to 2023.2

Closes-Bug: #2051233
Depends-On: https://review.opendev.org/c/openstack/kolla-ansible/+/906858
Change-Id: I263f59ea77e39accffe4febe0d47e56b35d9800e
This commit is contained in:
Will Szumski 2024-01-23 16:35:24 +00:00 committed by Mark Goddard
parent 395bd34f64
commit 280e84be82
26 changed files with 58 additions and 246 deletions

View File

@ -1,44 +0,0 @@
---
- name: Verify and configure Docker storage driver
hosts: docker
tags:
- docker
- docker-devicemapper
tasks:
- name: Check for existing Docker configuration using devicemapper
block:
- name: Query Docker daemon for storage driver
docker_host_info:
failed_when: false
register: docker
- block:
- name: Check for a Docker configuration file
become: True
stat:
path: /etc/docker/daemon.json
register: docker_config_file
- name: Check whether devicemapper is used in configuration file
lineinfile:
path: /etc/docker/daemon.json
regexp: 'storage-driver.*devicemapper'
state: absent
become: True
changed_when: False
# `check_mode: True` ensures that we don't modify daemon.json
check_mode: True
register: devicemapper_docker
when: docker_config_file.stat.exists
when: not (docker.can_talk_to_docker | default(true))
- name: Fail if devicemapper is in use while another storage driver was requested
fail:
msg: "Docker storage driver {{ docker_storage_driver }} was requested, but devicemapper is in use"
when: (docker.can_talk_to_docker | default(true) and docker.host_info.Driver == 'devicemapper') or (devicemapper_docker.found | default(0) == 1)
when: docker_storage_driver != 'devicemapper'
- name: Ensure Docker devicemapper storage is configured
include_role:
name: docker-devicemapper
when: docker_storage_driver == 'devicemapper'

View File

@ -20,5 +20,4 @@
- import_playbook: "mdadm.yml" - import_playbook: "mdadm.yml"
- import_playbook: "luks.yml" - import_playbook: "luks.yml"
- import_playbook: "lvm.yml" - import_playbook: "lvm.yml"
- import_playbook: "docker-devicemapper.yml"
- import_playbook: "docker.yml" - import_playbook: "docker.yml"

View File

@ -83,11 +83,9 @@ compute_lvm_groups_default: "{{ [compute_lvm_group_data] if compute_lvm_group_da
compute_lvm_groups_extra: [] compute_lvm_groups_extra: []
# Whether a 'data' LVM volume group should exist on compute hosts. By default # Whether a 'data' LVM volume group should exist on compute hosts. By default
# this contains a 'docker-volumes' logical volume for Docker volume storage. It # this contains a 'docker-volumes' logical volume for Docker volume storage
# will also be used for Docker container and image storage if # Default is false.
# 'docker_storage_driver' is set to 'devicemapper'. Default is true if compute_lvm_group_data_enabled: false
# 'docker_storage_driver' is set to 'devicemapper', or false otherwise.
compute_lvm_group_data_enabled: "{{ docker_storage_driver == 'devicemapper' }}"
# Compute LVM volume group for data. See mrlesmithjr.manage_lvm role for # Compute LVM volume group for data. See mrlesmithjr.manage_lvm role for
# format. # format.

View File

@ -125,10 +125,8 @@ controller_lvm_groups_extra: []
# Whether a 'data' LVM volume group should exist on controller hosts. By # Whether a 'data' LVM volume group should exist on controller hosts. By
# default this contains a 'docker-volumes' logical volume for Docker volume # default this contains a 'docker-volumes' logical volume for Docker volume
# storage. It will also be used for Docker container and image storage if # storage. Default is false.
# 'docker_storage_driver' is set to 'devicemapper'. Default is true if controller_lvm_group_data_enabled: false
# 'docker_storage_driver' is set to 'devicemapper', or false otherwise.
controller_lvm_group_data_enabled: "{{ docker_storage_driver == 'devicemapper' }}"
# Controller LVM volume group for data. See mrlesmithjr.manage_lvm role for # Controller LVM volume group for data. See mrlesmithjr.manage_lvm role for
# format. # format.

View File

@ -127,10 +127,8 @@ infra_vm_lvm_groups_extra: []
# Whether a 'data' LVM volume group should exist on the infrastructure vm. By # Whether a 'data' LVM volume group should exist on the infrastructure vm. By
# default this contains a 'docker-volumes' logical volume for Docker volume # default this contains a 'docker-volumes' logical volume for Docker volume
# storage. It will also be used for Docker container and image storage if # storage. Default is false.
# 'docker_storage_driver' is set to 'devicemapper'. Default is true if infra_vm_lvm_group_data_enabled: false
# 'docker_storage_driver' is set to 'devicemapper', or false otherwise.
infra_vm_lvm_group_data_enabled: "{{ docker_storage_driver == 'devicemapper' }}"
# Infrastructure VM LVM volume group for data. See mrlesmithjr.manage_lvm role # Infrastructure VM LVM volume group for data. See mrlesmithjr.manage_lvm role
# for format. # for format.

View File

@ -53,11 +53,9 @@ seed_lvm_groups_default: "{{ [seed_lvm_group_data] if seed_lvm_group_data_enable
seed_lvm_groups_extra: [] seed_lvm_groups_extra: []
# Whether a 'data' LVM volume group should exist on the seed. By default this # Whether a 'data' LVM volume group should exist on the seed. By default this
# contains a 'docker-volumes' logical volume for Docker volume storage. It will # contains a 'docker-volumes' logical volume for Docker volume storage.
# also be used for Docker container and image storage if # Default is false.
# 'docker_storage_driver' is set to 'devicemapper'. Default is true if seed_lvm_group_data_enabled: false
# 'docker_storage_driver' is set to 'devicemapper', or false otherwise.
seed_lvm_group_data_enabled: "{{ docker_storage_driver == 'devicemapper' }}"
# Seed LVM volume group for data. See mrlesmithjr.manage_lvm role for format. # Seed LVM volume group for data. See mrlesmithjr.manage_lvm role for format.
seed_lvm_group_data: seed_lvm_group_data:

View File

@ -95,11 +95,9 @@ storage_lvm_groups_default: "{{ [storage_lvm_group_data] if storage_lvm_group_da
storage_lvm_groups_extra: [] storage_lvm_groups_extra: []
# Whether a 'data' LVM volume group should exist on storage hosts. By default # Whether a 'data' LVM volume group should exist on storage hosts. By default
# this contains a 'docker-volumes' logical volume for Docker volume storage. It # this contains a 'docker-volumes' logical volume for Docker volume storage.
# will also be used for Docker container and image storage if # Default is false.
# 'docker_storage_driver' is set to 'devicemapper'. Default is true if storage_lvm_group_data_enabled: false
# 'docker_storage_driver' is set to 'devicemapper', or false otherwise.
storage_lvm_group_data_enabled: "{{ docker_storage_driver == 'devicemapper' }}"
# Storage LVM volume group for data. See mrlesmithjr.manage_lvm role for # Storage LVM volume group for data. See mrlesmithjr.manage_lvm role for
# format. # format.

View File

@ -22,7 +22,6 @@
- import_playbook: "luks.yml" - import_playbook: "luks.yml"
- import_playbook: "lvm.yml" - import_playbook: "lvm.yml"
- import_playbook: "swap.yml" - import_playbook: "swap.yml"
- import_playbook: "docker-devicemapper.yml"
- import_playbook: "kolla-ansible-user.yml" - import_playbook: "kolla-ansible-user.yml"
- import_playbook: "kolla-pip.yml" - import_playbook: "kolla-pip.yml"
- import_playbook: "kolla-target-venv.yml" - import_playbook: "kolla-target-venv.yml"

View File

@ -1,25 +0,0 @@
---
# Name of the docker storage driver.
docker_storage_driver: overlay2
# Name of the docker storage LVM volume group.
docker_storage_volume_group:
# Name of the docker storage data LVM volume.
docker_storage_volume_thinpool:
# Size of the docker storage data LVM volume (see lvol module size argument).
docker_storage_volume_thinpool_size:
# Name of the docker storage metadata LVM volume.
docker_storage_volume_thinpool_meta:
# Size of the docker storage metadata LVM volume (see lvol module size
# argument).
docker_storage_volume_thinpool_meta_size:
# Threshold at which to extend thin-provisioned docker storage volumes.
docker_storage_thinpool_autoextend_threshold: 80
# Percentage by which to extend thin-provisioned docker storage volumes.
docker_storage_thinpool_autoextend_percent: 20

View File

@ -1,13 +0,0 @@
---
- name: Ensure the docker storage volume is converted to a thinpool
command: >
lvconvert -y --zero n -c 512K
--thinpool {{ docker_storage_volume_group }}/{{ docker_storage_volume_thinpool }}
--poolmetadata {{ docker_storage_volume_group }}/{{ docker_storage_volume_thinpool_meta }}
become: True
- name: Ensure the docker storage metadata profile is applied
command: >
lvchange --metadataprofile docker-thinpool
{{ docker_storage_volume_group }}/{{ docker_storage_volume_thinpool }}
become: True

View File

@ -1,58 +0,0 @@
---
- name: Query docker daemon information
command: "docker info"
register: docker_info
changed_when: False
failed_when: False
- name: Fail when non-devicemapper containers or images exist
fail:
msg: >
Not configuring docker storage in {{ docker_storage_driver }} mode as
non-devicemapper containers or images exist.
when:
- docker_info.rc == 0
- "'Data loop file' in docker_info.stdout or 'devicemapper' not in docker_info.stdout"
- "'Images: 0' not in docker_info.stdout or 'Containers: 0' not in docker_info.stdout"
- name: Ensure the docker storage metadata profile exists
template:
src: docker-thinpool.profile.j2
dest: /etc/lvm/profile/docker-thinpool.profile
become: True
- name: Query LVM thinpool volume
command: "lvs {{ docker_storage_volume_group }}/{{ docker_storage_volume_thinpool }}"
register: lvs_result
changed_when: false
failed_when: false
become: true
- block:
- name: Ensure the docker storage data and metadata volumes exist
lvol:
vg: "{{ docker_storage_volume_group }}"
lv: "{{ item.name }}"
size: "{{ item.size }}"
shrink: no
state: present
with_items:
- name: "{{ docker_storage_volume_thinpool }}"
size: "{{ docker_storage_volume_thinpool_size }}"
- name: "{{ docker_storage_volume_thinpool_meta }}"
size: "{{ docker_storage_volume_thinpool_meta_size }}"
become: True
- name: Ensure the docker storage volume is converted to a thinpool
command: >
lvconvert -y --zero n -c 512K
--thinpool {{ docker_storage_volume_group }}/{{ docker_storage_volume_thinpool }}
--poolmetadata {{ docker_storage_volume_group }}/{{ docker_storage_volume_thinpool_meta }}
become: True
- name: Ensure the docker storage metadata profile is applied
command: >
lvchange --metadataprofile docker-thinpool
{{ docker_storage_volume_group }}/{{ docker_storage_volume_thinpool }}
become: True
when: lvs_result.rc != 0

View File

@ -1,4 +0,0 @@
activation {
thin_pool_autoextend_threshold={{ docker_storage_thinpool_autoextend_threshold }}
thin_pool_autoextend_percent={{ docker_storage_thinpool_autoextend_percent }}
}

View File

@ -1,7 +1,4 @@
--- ---
docker_storage_driver: overlay2
docker_storage_volume_group:
docker_storage_volume_thinpool:
docker_registry_mirrors: [] docker_registry_mirrors: []
docker_daemon_debug: false docker_daemon_debug: false
docker_daemon_mtu: 1500 docker_daemon_mtu: 1500

View File

@ -2,4 +2,18 @@
- import_role: - import_role:
name: openstack.kolla.docker name: openstack.kolla.docker
vars: vars:
docker_custom_config: "{{ lookup('template', 'daemon.json.j2') | to_nice_json | indent(2) }}" docker_custom_config: >-
{%- set options = {} -%}
{%- if docker_daemon_debug | bool -%}
{%- set _ = options.update({"debug": docker_daemon_debug | bool}) -%}
{%- endif -%}
{%- if docker_registry_mirrors | length > 0 -%}
{%- set _ = options.update({"registry-mirrors": docker_registry_mirrors}) -%}
{%- endif -%}
{%- if docker_daemon_mtu -%}
{%- set _ = options.update({"mtu": docker_daemon_mtu}) -%}
{%- endif -%}
{%- if docker_daemon_live_restore | bool -%}
{%- set _ = options.update({"live-restore": docker_daemon_live_restore | bool}) -%}
{%- endif -%}
{{ options }}

View File

@ -1,25 +0,0 @@
{
{%- if docker_daemon_debug | bool %}
"debug": {{ docker_daemon_debug | to_json }},
{%- endif %}
{%- if docker_registry_mirrors | length > 0 %}
"registry-mirrors": [
{%- for mirror in docker_registry_mirrors %}
"{{ mirror }}"{%- if not loop.last -%},{%- endif %}
{%- endfor %}
],
{%- endif %}
{% if docker_daemon_mtu %}
"mtu": {{ docker_daemon_mtu }},
{% endif %}
{% if docker_daemon_live_restore %}
"live-restore": {{ docker_daemon_live_restore | to_json }},
{% endif %}
"storage-opts": [
{% if docker_storage_driver == 'devicemapper' %}
"dm.thinpooldev=/dev/mapper/{{ docker_storage_volume_group | replace('-', '--') }}-{{ docker_storage_volume_thinpool | replace('-', '--') }}",
"dm.use_deferred_removal=true",
"dm.use_deferred_deletion=true"
{% endif %}
]
}

View File

@ -21,7 +21,6 @@
- import_playbook: "mdadm.yml" - import_playbook: "mdadm.yml"
- import_playbook: "luks.yml" - import_playbook: "luks.yml"
- import_playbook: "lvm.yml" - import_playbook: "lvm.yml"
- import_playbook: "docker-devicemapper.yml"
- import_playbook: "kolla-ansible-user.yml" - import_playbook: "kolla-ansible-user.yml"
- import_playbook: "kolla-pip.yml" - import_playbook: "kolla-pip.yml"
- import_playbook: "kolla-target-venv.yml" - import_playbook: "kolla-target-venv.yml"

View File

@ -904,14 +904,11 @@ LVM for Docker
In Train and earlier releases of Kayobe, the ``data`` volume group was In Train and earlier releases of Kayobe, the ``data`` volume group was
always enabled by default. always enabled by default.
If the ``devicemapper`` Docker storage driver is in use, the default LVM A logical volume for storing Docker volume data, mounted at ``/var/lib/docker/volumes``
configuration is optimised for it. The ``devicemapper`` driver requires a thin can optionally be created. The logical volume is created in volume group called data.
provisioned LVM volume. A second logical volume is used for storing Docker
volume data, mounted at ``/var/lib/docker/volumes``. Both logical volumes are
created from a single ``data`` volume group.
This configuration is enabled by the following variables, which default to This configuration is enabled by the following variables, which default to
``true`` if the ``devicemapper`` driver is in use or ``false`` otherwise: ``false``:
* ``compute_lvm_group_data_enabled`` * ``compute_lvm_group_data_enabled``
* ``controller_lvm_group_data_enabled`` * ``controller_lvm_group_data_enabled``
@ -919,10 +916,6 @@ This configuration is enabled by the following variables, which default to
* ``infra_vm_lvm_group_data_enabled`` * ``infra_vm_lvm_group_data_enabled``
* ``storage_lvm_group_data_enabled`` * ``storage_lvm_group_data_enabled``
These variables can be set to ``true`` to enable the data volume group if the
``devicemapper`` driver is not in use. This may be useful where the
``docker-volumes`` logical volume is required.
To use this configuration, a list of disks must be configured via the following To use this configuration, a list of disks must be configured via the following
variables: variables:
@ -952,18 +945,17 @@ variables, with a default value of 75% (of the volume group's capacity):
* ``monitoring_lvm_group_data_lv_docker_volumes_size`` * ``monitoring_lvm_group_data_lv_docker_volumes_size``
* ``storage_lvm_group_data_lv_docker_volumes_size`` * ``storage_lvm_group_data_lv_docker_volumes_size``
If using a Docker storage driver other than ``devicemapper``, the remaining 25% You can control the amount of storage assigned to the docker volumes LV by
of the volume group can be used for Docker volume data. In this case, the LVM using the following variable.
volume's size can be increased to 100%:
.. code-block:: yaml .. code-block:: yaml
:caption: ``controllers.yml`` :caption: ``controllers.yml``
controller_lvm_group_data_lv_docker_volumes_size: 100% controller_lvm_group_data_lv_docker_volumes_size: 100%
If using a Docker storage driver other than ``devicemapper``, it is possible to It is possible to avoid using LVM entirely, thus avoiding the requirement for
avoid using LVM entirely, thus avoiding the requirement for multiple disks. In multiple disks. In this case, set the appropriate ``<host>_lvm_groups``
this case, set the appropriate ``<host>_lvm_groups`` variable to an empty list: variable to an empty list:
.. code-block:: yaml .. code-block:: yaml
:caption: ``storage.yml`` :caption: ``storage.yml``
@ -1058,12 +1050,8 @@ Docker Engine
| ``docker`` | ``docker``
The ``docker_storage_driver`` variable sets the Docker storage driver, and by The ``docker_storage_driver`` variable sets the Docker storage driver, and by
default the ``overlay2`` driver is used. If using the ``devicemapper`` driver, default the ``overlay2`` driver is used. See :ref:`configuration-hosts-lvm` for
see :ref:`configuration-hosts-lvm` for information about configuring LVM for information about configuring LVM for Docker.
Docker.
Various options are defined in ``${KAYOBE_CONFIG_PATH}/docker.yml``
for configuring the ``devicemapper`` storage.
If using an insecure (HTTP) registry, set ``docker_registry_insecure`` to If using an insecure (HTTP) registry, set ``docker_registry_insecure`` to
``true``. ``true``.

View File

@ -76,10 +76,8 @@
#compute_lvm_groups_extra: #compute_lvm_groups_extra:
# Whether a 'data' LVM volume group should exist on compute hosts. By default # Whether a 'data' LVM volume group should exist on compute hosts. By default
# this contains a 'docker-volumes' logical volume for Docker volume storage. It # this contains a 'docker-volumes' logical volume for Docker volume storage.
# will also be used for Docker container and image storage if # Default is false.
# 'docker_storage_driver' is set to 'devicemapper'. Default is true if
# 'docker_storage_driver' is set to 'devicemapper', or false otherwise.
#compute_lvm_group_data_enabled: #compute_lvm_group_data_enabled:
# Compute LVM volume group for data. See mrlesmithjr.manage_lvm role for # Compute LVM volume group for data. See mrlesmithjr.manage_lvm role for

View File

@ -105,9 +105,8 @@
# Whether a 'data' LVM volume group should exist on controller hosts. By # Whether a 'data' LVM volume group should exist on controller hosts. By
# default this contains a 'docker-volumes' logical volume for Docker volume # default this contains a 'docker-volumes' logical volume for Docker volume
# storage. It will also be used for Docker container and image storage if # storage.
# 'docker_storage_driver' is set to 'devicemapper'. Default is true if # Default is false.
# 'docker_storage_driver' is set to 'devicemapper', or false otherwise.
#controller_lvm_group_data_enabled: #controller_lvm_group_data_enabled:
# Controller LVM volume group for data. See mrlesmithjr.manage_lvm role for # Controller LVM volume group for data. See mrlesmithjr.manage_lvm role for

View File

@ -106,9 +106,7 @@
# Whether a 'data' LVM volume group should exist on the infrastructure vm. By # Whether a 'data' LVM volume group should exist on the infrastructure vm. By
# default this contains a 'docker-volumes' logical volume for Docker volume # default this contains a 'docker-volumes' logical volume for Docker volume
# storage. It will also be used for Docker container and image storage if # storage. Default is false.
# 'docker_storage_driver' is set to 'devicemapper'. Default is true if
# 'docker_storage_driver' is set to 'devicemapper', or false otherwise.
#infra_vm_lvm_group_data_enabled: #infra_vm_lvm_group_data_enabled:
# Infrastructure VM LVM volume group for data. See mrlesmithjr.manage_lvm role # Infrastructure VM LVM volume group for data. See mrlesmithjr.manage_lvm role

View File

@ -48,10 +48,8 @@
#seed_lvm_groups_extra: #seed_lvm_groups_extra:
# Whether a 'data' LVM volume group should exist on the seed. By default this # Whether a 'data' LVM volume group should exist on the seed. By default this
# contains a 'docker-volumes' logical volume for Docker volume storage. It will # contains a 'docker-volumes' logical volume for Docker volume storage.
# also be used for Docker container and image storage if # Default is false.
# 'docker_storage_driver' is set to 'devicemapper'. Default is true if
# 'docker_storage_driver' is set to 'devicemapper', or false otherwise.
#seed_lvm_group_data_enabled: #seed_lvm_group_data_enabled:
# Seed LVM volume group for data. See mrlesmithjr.manage_lvm role for format. # Seed LVM volume group for data. See mrlesmithjr.manage_lvm role for format.

View File

@ -81,10 +81,8 @@
#storage_lvm_groups_extra: #storage_lvm_groups_extra:
# Whether a 'data' LVM volume group should exist on storage hosts. By default # Whether a 'data' LVM volume group should exist on storage hosts. By default
# this contains a 'docker-volumes' logical volume for Docker volume storage. It # this contains a 'docker-volumes' logical volume for Docker volume storage.
# will also be used for Docker container and image storage if # Default is false.
# 'docker_storage_driver' is set to 'devicemapper'. Default is true if
# 'docker_storage_driver' is set to 'devicemapper', or false otherwise.
#storage_lvm_group_data_enabled: #storage_lvm_group_data_enabled:
# Storage LVM volume group for data. See mrlesmithjr.manage_lvm role for # Storage LVM volume group for data. See mrlesmithjr.manage_lvm role for

View File

@ -107,7 +107,7 @@ controller_luks_devices:
- name: loopback-crypt - name: loopback-crypt
device: /dev/md0 device: /dev/md0
# Create an LVM volume group for Docker volumes and devicemapper. # Create an LVM volume group for Docker volumes.
controller_lvm_groups: controller_lvm_groups:
- "{% raw %}{{ controller_lvm_group_data }}{% endraw %}" - "{% raw %}{{ controller_lvm_group_data }}{% endraw %}"
@ -122,9 +122,6 @@ controller_sysctl_parameters:
# Disable cloud-init. # Disable cloud-init.
disable_cloud_init: true disable_cloud_init: true
# Use devicemapper storage driver.
docker_storage_driver: devicemapper
# Set Honolulu time. # Set Honolulu time.
timezone: Pacific/Honolulu timezone: Pacific/Honolulu

View File

@ -144,10 +144,10 @@ def test_cloud_init_is_disabled(host):
assert host.file("/etc/cloud/cloud-init.disabled").exists assert host.file("/etc/cloud/cloud-init.disabled").exists
def test_docker_storage_driver_is_devicemapper(host): def test_docker_storage_driver_is_overlay2(host):
with host.sudo("stack"): with host.sudo("stack"):
info = host.check_output("docker info") info = host.check_output("docker info")
assert "devicemapper" in info assert "overlay2" in info
@pytest.mark.parametrize('user', ['kolla', 'stack']) @pytest.mark.parametrize('user', ['kolla', 'stack'])

View File

@ -0,0 +1,7 @@
---
upgrade:
- |
Support for the ``devicemapper`` Docker storage driver is removed
following its removal from Docker Engine 25.0. Operators using
``devicemapper`` should migrate to a supported storage driver before
updating Docker to 25.0 or later.

View File

@ -92,7 +92,7 @@
- ^zuul.d/.* - ^zuul.d/.*
vars: vars:
# Name of the release to upgrade from for upgrade jobs. # Name of the release to upgrade from for upgrade jobs.
previous_release: 2023.1 previous_release: 2023.2
logs_dir: "/tmp/logs" logs_dir: "/tmp/logs"
ansible_collection_kolla_src_dir: "{{ ansible_env.PWD ~ '/' ~ zuul.projects['opendev.org/openstack/ansible-collection-kolla'].src_dir }}" ansible_collection_kolla_src_dir: "{{ ansible_env.PWD ~ '/' ~ zuul.projects['opendev.org/openstack/ansible-collection-kolla'].src_dir }}"
kayobe_src_dir: "{{ ansible_env.PWD ~ '/' ~ zuul.projects['opendev.org/openstack/kayobe'].src_dir }}" kayobe_src_dir: "{{ ansible_env.PWD ~ '/' ~ zuul.projects['opendev.org/openstack/kayobe'].src_dir }}"