Giuseppe Lavagetto has submitted this change and it was merged.

Change subject: kubernetes: introduce 1st-stage worker role
......................................................................


kubernetes: introduce 1st-stage worker role

For now, just the docker installation is provided, via a
profile::docker::engine that can be potentially reused for labs as well.

We also add a simple partman recipe that should work well with this
role.

Bug: T147181
Change-Id: I213286e00e0e2fb1c9398d734b0bbc0a55ced9f9
---
A hieradata/role/common/kubernetes/worker.yaml
A modules/docker/manifests/init.pp
A modules/install_server/files/autoinstall/partman/docker-host.cfg
A modules/profile/manifests/docker/engine.pp
A modules/role/manifests/kubernetes/worker.pp
5 files changed, 198 insertions(+), 0 deletions(-)

Approvals:
  Giuseppe Lavagetto: Looks good to me, approved
  jenkins-bot: Verified

Objections:
  Yuvipanda: There's a problem with this change, please improve



diff --git a/hieradata/role/common/kubernetes/worker.yaml 
b/hieradata/role/common/kubernetes/worker.yaml
new file mode 100644
index 0000000..bda5b48
--- /dev/null
+++ b/hieradata/role/common/kubernetes/worker.yaml
@@ -0,0 +1,3 @@
+profile::docker::engine::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/docker/manifests/init.pp b/modules/docker/manifests/init.pp
new file mode 100644
index 0000000..40a1477
--- /dev/null
+++ b/modules/docker/manifests/init.pp
@@ -0,0 +1,54 @@
+# == Class docker
+#
+# Install docker on the host, at the desired version. It allows to choose
+# whether to install a version from the official debian repositories or
+# from dockerproject.org. It also declares the service
+#
+# === Parameters
+#
+# [*version*] The package version to install
+#
+# [*use_dockerproject*] Whether to use dockerproject.org packages or not.
+#
+# [*proxy*] If given, it will allow to use a proxy to dockerproject.org
+#
+class docker($version, $use_dockerproject=true, $proxy=undef){
+    if $use_dockerproject {
+        apt::repository { 'docker':
+            uri        => 'https://apt.dockerproject.org/repo',
+            dist       => 'debian-jessie',
+            components => 'main',
+            source     => false,
+            keyfile    => 'puppet:///modules/docker/docker.gpg',
+        }
+
+        $proxy_ensure = $proxy ? {
+            undef   => 'absent',
+            default => 'present'
+        }
+
+        apt::conf { 'dockerproject-org-proxy':
+            ensure   => $proxy_ensure,
+            priority => '80',
+            key      => 'Acquire::http::Proxy::apt.dockerproject.org',
+            value    => $proxy,
+        }
+        $package = 'docker-engine'
+        $absent_package = 'docker.io'
+    }
+    else {
+        $package = 'docker.io'
+        $absent_package = 'docker-engine'
+    }
+
+    package { $absent_package:
+        ensure => absent,
+    }
+    package { $package:
+        ensure => $version,
+    }
+
+    service { 'docker':
+        ensure => running,
+    }
+}
diff --git a/modules/install_server/files/autoinstall/partman/docker-host.cfg 
b/modules/install_server/files/autoinstall/partman/docker-host.cfg
new file mode 100644
index 0000000..21c5d16
--- /dev/null
+++ b/modules/install_server/files/autoinstall/partman/docker-host.cfg
@@ -0,0 +1,47 @@
+# Partman recipe for a host running docker
+#
+# * two disks, sda & sdb
+# * layout:
+#   - /        :   ext4, RAID1, 30GB
+#   - swap: RAID1, 1GB
+#   - free space for the rest under RAID1 - the VG will be created by puppet
+
+d-i    partman-auto/method             string  raid
+d-i    partman-md/device_remove_md     boolean true
+
+# Use the first two disks
+d-i    partman-auto/disk       string  /dev/sda /dev/sdb
+
+
+# Define physical partitions
+d-i    partman-auto/expert_recipe      string  \
+               multiraid ::    \
+                       5000    8000    30000   raid            \
+                               $primary{ } method{ raid }      \
+                       .                                       \
+                       1000    2000    1000    raid            \
+                               $primary{ } method{ raid }      \
+                       .                                       \
+                       1000    1000    -1      raid    \
+                               $primary{ } method{ raid }      \        
+                       .
+
+# Parameters are:
+# <raidtype> <devcount> <sparecount> <fstype> <mountpoint> \
+#      <devices> <sparedevices>
+d-i    partman-auto-raid/recipe        string          \
+               1       2       0       ext4    /       \
+                       /dev/sda1#/dev/sdb1             \
+               .                                       \
+               1       2       0       swap    -       \
+                       /dev/sda2#/dev/sdb2             \
+               .                    \
+        1   2   0   ext4  - \
+            /dev/sda3#/dev/sdb3
+
+d-i    partman-md/confirm              boolean true
+d-i    partman-md/confirm_nooverwrite  boolean true
+d-i    partman/confirm_write_new_label boolean true
+d-i    partman/choose_partition        select  finish
+d-i    partman/confirm                 boolean true
+d-i    partman/confirm_nooverwrite     boolean true
diff --git a/modules/profile/manifests/docker/engine.pp 
b/modules/profile/manifests/docker/engine.pp
new file mode 100644
index 0000000..224d2cb
--- /dev/null
+++ b/modules/profile/manifests/docker/engine.pp
@@ -0,0 +1,90 @@
+# == Profile docker::engine
+#
+# Installs docker, along with setting up the volume group needed for the
+# 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_settings = hiera('profile::docker::engine::proxy', undef)
+    $service_ensure = hiera('profile::docker::engine::service', 'running')
+
+    # Install docker
+    class { 'docker':
+        version        => $docker_version,
+        proxy_settings => $apt_proxy_settings
+    }
+
+    # Storage
+    if $vg_to_remove {
+        volume_group { $vg_to_remove:
+            ensure           => absent,
+            physical_volumes => [],
+        }
+    }
+    $basic_lv_params = {
+        extents  => $lv_extents,
+        thinpool => true,
+    }
+
+    $lv_params = $pool_metadata_size ? {
+        undef   => $basic_lv_params,
+        default => merge($basic_lv_params, {'poolmetadatasize' => 
$pool_metadata_size}),
+    }
+
+    $logical_volumes = {
+        'thinpool'     => $lv_params,
+    }
+
+    lvm::volume_group { 'docker':
+        ensure           => present,
+        physical_volumes => $physical_volumes,
+        logical_volumes  => $logical_volumes,
+    }
+
+    file { '/etc/lvm/profile/docker-thinpool.profile':
+        ensure => present,
+        owner  => 'root',
+        group  => 'root',
+        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',
+            'dm.use_deferred_removal=true',
+            'dm.use_deferred_deletion=true'
+        ]
+    }
+
+
+    # Docker config
+    docker::config { 'thinpool':
+        settings => merge($docker_settings, $docker_storage_options),
+    }
+
+    # Service declaration
+    service { 'docker':
+        ensure => $service_ensure,
+    }
+}
diff --git a/modules/role/manifests/kubernetes/worker.pp 
b/modules/role/manifests/kubernetes/worker.pp
new file mode 100644
index 0000000..bcf2f4a
--- /dev/null
+++ b/modules/role/manifests/kubernetes/worker.pp
@@ -0,0 +1,4 @@
+class role::kubernetes::worker {
+    # Sets up docker on the machine
+    include ::profile::docker::engine
+}

-- 
To view, visit https://gerrit.wikimedia.org/r/315717
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I213286e00e0e2fb1c9398d734b0bbc0a55ced9f9
Gerrit-PatchSet: 6
Gerrit-Project: operations/puppet
Gerrit-Branch: production
Gerrit-Owner: Giuseppe Lavagetto <glavage...@wikimedia.org>
Gerrit-Reviewer: Alexandros Kosiaris <akosia...@wikimedia.org>
Gerrit-Reviewer: Giuseppe Lavagetto <glavage...@wikimedia.org>
Gerrit-Reviewer: Mark Bergsma <m...@wikimedia.org>
Gerrit-Reviewer: Yuvipanda <yuvipa...@wikimedia.org>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to