Giuseppe Lavagetto has uploaded a new change for review. https://gerrit.wikimedia.org/r/317475
Change subject: docker: refactor the storage setup, allow thick pools ...................................................................... docker: refactor the storage setup, allow thick pools Since the lvm2 version on debian jessie does not support thin pools, refactor our docker storage configuration into separate profiles, which I intended to do anyways. Bug: T147181 Change-Id: Ic5c1075ff7448dd9751cf596c93bdd1b99b5ef80 --- M hieradata/role/common/kubernetes/worker.yaml M modules/profile/manifests/docker/engine.pp A modules/profile/manifests/docker/storage.pp A modules/profile/manifests/docker/storage/thinpool.pp M modules/role/manifests/kubernetes/worker.pp 5 files changed, 173 insertions(+), 78 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/operations/puppet refs/changes/75/317475/1 diff --git a/hieradata/role/common/kubernetes/worker.yaml b/hieradata/role/common/kubernetes/worker.yaml index bda5b48..90f7fb7 100644 --- a/hieradata/role/common/kubernetes/worker.yaml +++ b/hieradata/role/common/kubernetes/worker.yaml @@ -1,3 +1,3 @@ -profile::docker::engine::physical_volumes: "/dev/md2" +profile::docker::storage::physical_volumes: "/dev/md2" profile::docker::engine::version: "1.12.2-0~jessie" profile::docker::engine::proxy: "http://webproxy.%{::site}.wmnet:8080" diff --git a/modules/profile/manifests/docker/engine.pp b/modules/profile/manifests/docker/engine.pp index af05650..5c8417e 100644 --- a/modules/profile/manifests/docker/engine.pp +++ b/modules/profile/manifests/docker/engine.pp @@ -4,16 +4,9 @@ # devicemapper storage driver to work. # to work class profile::docker::engine { - # Parameters that need to be defined in hiera - $physical_volumes = hiera('profile::docker::engine::physical_volumes') # Optional parameters - # Volume group to substitute - $vg_to_remove = hiera('profile::docker::engine::vg_to_remove', undef) $docker_settings = hiera('profile::docker::engine::settings', {}) - # Size of the thin pool and the metadata pool. - $lv_extents = hiera('profile::docker::engine::lv_extents', '95%VG') - $pool_metadata_size = hiera('profile::docker::engine::lvm_metadata_size', undef) # Version to install; the default is not to pick one. $docker_version = hiera('profile::docker::engine::version', 'present') $apt_proxy = hiera('profile::docker::engine::proxy', undef) @@ -25,77 +18,15 @@ proxy => $apt_proxy, } - # Storage - if $vg_to_remove { - volume_group { $vg_to_remove: - ensure => absent, - physical_volumes => [], - } - } - $basic_lv_params = { - extents => $lv_extents, - thinpool => true, - mounted => false, - createfs => false, - } - - $lv_params = $pool_metadata_size ? { - undef => $basic_lv_params, - default => merge($basic_lv_params, {'poolmetadatasize' => $pool_metadata_size}), - } - - $logical_volumes = { - 'thinpool' => $lv_params, - } - - $volume_group = { - docker => { - ensure => present, - physical_volumes => $physical_volumes, - logical_volumes => $logical_volumes, - } - } - - class { 'lvm': - manage_pkg => true, - volume_groups => $volume_group, - } - - file { '/etc/lvm/profile/': - ensure => directory, - owner => 'root', - group => 'root', - mode => '0555', - } - - file { '/etc/lvm/profile/docker-thinpool.profile': - ensure => present, - owner => 'root', - group => 'root', - mode => '0444', - source => 'puppet:///modules/profile/docker/lvm.profile', - } - - exec { 'Attach profile to docker thinpool': - command => '/sbin/lvchange --metadataprofile docker-thinpool docker/thinpool', - unless => '/sbin/lvs -o lv_profile docker/thinpool | grep -q docker', - require => [ - File['/etc/lvm/profile/docker-thinpool.profile'], - Logical_volume['thinpool'] - ], - } - - $docker_storage_options = { - 'storage-driver' => 'devicemapper', - 'storage-opts' => [ - 'dm.thinpooldev=/dev/mapper/docker-thinpool-tpool', - 'dm.use_deferred_removal=true', - 'dm.use_deferred_deletion=true' - ] - } - - # Docker config + # Fetch the storage config from the related driver + if defined(Class['::profile::docker::storage::thinpool']) { + $docker_storage_options = $::profile::docker::storage::thinpool::options + } else { + $docker_storage_options = $::profile::docker::storage::options + } + + # We need to import one storage config class { 'docker::configuration': settings => merge($docker_settings, $docker_storage_options), } diff --git a/modules/profile/manifests/docker/storage.pp b/modules/profile/manifests/docker/storage.pp new file mode 100644 index 0000000..7969acd --- /dev/null +++ b/modules/profile/manifests/docker/storage.pp @@ -0,0 +1,66 @@ +# == Class profile::docker::storage +# +# Sets up the storage for the devicemanager docker storage driver +# with thick pools +# +# This should be used on jessie, see: +# +# https://github.com/docker/docker/issues/15629 +# +class profile::docker::storage { + # Parameters that need to be defined in hiera + # list of physical volumes to use. + $physical_volumes = hiera('profile::docker::storage::physical_volumes') + # Optional parameters + # Volume group to substitute. + $vg_to_remove = hiera('profile::docker::storage::vg_to_remove', undef) + # Size of the thin pool and the metadata pool. + $extents = hiera('profile::docker::storage::extents', '95%VG') + $metadata_size = hiera('profile::docker::storage::metadata_size', '5%VG') + + if $vg_to_remove { + volume_group { $vg_to_remove: + ensure => absent, + physical_volumes => [], + } + } + + $main_lv_params = { + extents => $extents, + mounted => false, + createfs => false, + } + + $metadata_lv_params = { + extents => $metadata_size, + mounted => false, + createfs => false, + } + + $logical_volumes = { + 'data' => $main_lv_params, + 'metadata' => $metadata_lv_params, + } + + $volume_group = { + docker => { + ensure => present, + physical_volumes => $physical_volumes, + logical_volumes => $logical_volumes, + } + } + + class { 'lvm': + manage_pkg => true, + volume_groups => $volume_group, + } + + # This will be used in profile::docker::engine + $options = { + 'storage-driver' => 'devicemapper', + 'storage-opts' => [ + 'dm.datadev=/dev/mapper/docker-data', + 'dm.metadatadev=/dev/mapper/docker-metadata' + ] + } +} diff --git a/modules/profile/manifests/docker/storage/thinpool.pp b/modules/profile/manifests/docker/storage/thinpool.pp new file mode 100644 index 0000000..a47a434 --- /dev/null +++ b/modules/profile/manifests/docker/storage/thinpool.pp @@ -0,0 +1,97 @@ +# == Class profile::docker::storage::thinpool +# +# Sets up the storage for the devicemanager docker storage driver +# when thinpools can be used. +# +# Do NOT use on debian jessie, see +# +# https://github.com/docker/docker/issues/15629 +# +class profile::docker::storage::thinpool { + # Parameters that need to be defined in hiera + # list of physical volumes to use. Common to all the storage profiles + $physical_volumes = hiera('profile::docker::storage::physical_volumes') + + # Optional parameters + # Volume group to substitute. Common to all the storage profiles + $vg_to_remove = hiera('profile::docker::storage::vg_to_remove', undef) + # Size of the thin pool and the metadata pool. + $extents = hiera('profile::docker::storage::extents', '95%VG') + $metadata_size = hiera('profile::docker::storage::metadata_size', undef) + + if os_version('debian == jessie') { + fail('Thin pools cannot be used on Debian jessie.') + } + + + if $vg_to_remove { + volume_group { $vg_to_remove: + ensure => absent, + physical_volumes => [], + } + } + + $basic_lv_params = { + extents => $extents, + thinpool => true, + mounted => false, + createfs => false, + } + + $lv_params = $metadata_size ? { + undef => $basic_lv_params, + default => merge($basic_lv_params, {'poolmetadatasize' => $metadata_size}), + } + + $logical_volumes = { + 'thinpool' => $lv_params, + } + + $volume_group = { + docker => { + ensure => present, + physical_volumes => $physical_volumes, + logical_volumes => $logical_volumes, + } + } + + class { 'lvm': + manage_pkg => true, + volume_groups => $volume_group, + } + + + file { '/etc/lvm/profile/': + ensure => directory, + owner => 'root', + group => 'root', + mode => '0555', + } + + file { '/etc/lvm/profile/docker-thinpool.profile': + ensure => present, + owner => 'root', + group => 'root', + mode => '0444', + source => 'puppet:///modules/profile/docker/lvm.profile', + } + + exec { 'Attach profile to docker thinpool': + command => '/sbin/lvchange --metadataprofile docker-thinpool docker/thinpool', + unless => '/sbin/lvs -o lv_profile docker/thinpool | grep -q docker', + require => [ + File['/etc/lvm/profile/docker-thinpool.profile'], + Logical_volume['thinpool'] + ], + } + + # This will be used in profile::docker::engine + $options = { + 'storage-driver' => 'devicemapper', + 'storage-opts' => [ + 'dm.thinpooldev=/dev/mapper/docker-thinpool-tpool', + 'dm.use_deferred_removal=true', + 'dm.use_deferred_deletion=true' + ] + } +} diff --git a/modules/role/manifests/kubernetes/worker.pp b/modules/role/manifests/kubernetes/worker.pp index efd7d8e..0c66e23 100644 --- a/modules/role/manifests/kubernetes/worker.pp +++ b/modules/role/manifests/kubernetes/worker.pp @@ -3,5 +3,6 @@ include base::firewall # Sets up docker on the machine + include ::profile::docker::storage include ::profile::docker::engine } -- To view, visit https://gerrit.wikimedia.org/r/317475 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ic5c1075ff7448dd9751cf596c93bdd1b99b5ef80 Gerrit-PatchSet: 1 Gerrit-Project: operations/puppet Gerrit-Branch: production Gerrit-Owner: Giuseppe Lavagetto <glavage...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits