14 changes: 14 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,17 @@
# Version 3.3.0

Moves env variable to init.pp

Set cgroup driver in config file

Ability to change cluster name

Restrucuture config class

New defined type for SA in new namespaces

A full list of PR's and issues closed can be found here [here](https://github.com/puppetlabs/puppetlabs-kubernetes/milestone/7?closed=1)

# Version 3.2.2

Fixes bug where nodes in v1.10/11 could not join the cluster
Expand Down
9 changes: 0 additions & 9 deletions manifests/cluster_roles.pp
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,6 @@
String $container_runtime = $kubernetes::container_runtime,
Optional[Array] $ignore_preflight_errors = []
) {
$path = ['/usr/bin','/bin','/sbin','/usr/local/bin']
$env_controller = ['HOME=/root', 'KUBECONFIG=/etc/kubernetes/admin.conf']
#Worker nodes do not have admin.conf present
$env_worker = ['HOME=/root', 'KUBECONFIG=/etc/kubernetes/kubelet.conf']

if $container_runtime == 'cri_containerd' {
$preflight_errors = flatten(['Service-Docker',$ignore_preflight_errors])
$cri_socket = '/run/containerd/containerd.sock'
Expand All @@ -23,16 +18,12 @@

if $controller {
kubernetes::kubeadm_init { $node_name:
path => $path,
env => $env_controller,
ignore_preflight_errors => $preflight_errors,
}
}

if $worker {
kubernetes::kubeadm_join { $node_name:
path => $path,
env => $env_worker,
cri_socket => $cri_socket,
ignore_preflight_errors => $preflight_errors,
}
Expand Down
17 changes: 8 additions & 9 deletions manifests/config.pp → manifests/config/kubeadm.pp
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
#Calss kubernetes config, populates config files with params to bootstrap cluster
class kubernetes::config (
# Class kubernetes config kubeadm, populates kubeadm config file with params to bootstrap cluster
class kubernetes::config::kubeadm (
String $config_file = $kubernetes::config_file,
Boolean $manage_etcd = $kubernetes::manage_etcd,
String $etcd_install_method = $kubernetes::etcd_install_method,
String $kubernetes_version = $kubernetes::kubernetes_version,
String $kubernetes_cluster_name = $kubernetes::kubernetes_cluster_name,
String $etcd_ca_key = $kubernetes::etcd_ca_key,
String $etcd_ca_crt = $kubernetes::etcd_ca_crt,
String $etcdclient_key = $kubernetes::etcdclient_key,
Expand Down Expand Up @@ -37,6 +38,7 @@
Optional[Hash] $kubeadm_extra_config = $kubernetes::kubeadm_extra_config,
Optional[Hash] $kubelet_extra_config = $kubernetes::kubelet_extra_config,
String $image_repository = $kubernetes::image_repository,
String $cgroup_driver = $kubernetes::cgroup_driver,
) {

$kube_dirs = ['/etc/kubernetes','/etc/kubernetes/manifests','/etc/kubernetes/pki','/etc/kubernetes/pki/etcd']
Expand Down Expand Up @@ -93,7 +95,6 @@
default => ["cloud-provider: ${cloud_provider}", "cloud-config: ${cloud_config}"],
}
$apiserver_merged_extra_arguments = concat($apiserver_extra_arguments, $cloud_args)
$kubelet_merged_extra_arguments = concat($kubelet_extra_arguments, $cloud_args)
$controllermanager_merged_extra_arguments = $cloud_args

# could check against Kubernetes 1.10 here, but that uses alpha1 config which doesn't have these options
Expand All @@ -119,16 +120,14 @@
$kubelet_extra_config_yaml = regsubst(to_yaml($kubelet_extra_config), '^---\n', '')
$kubelet_extra_config_alpha1_yaml = regsubst(to_yaml($kubelet_extra_config_alpha1), '^---\n', '')

if $kubernetes_version =~ /1.1(0|1)/ {
$template = 'alpha1'
} else {
$template = 'alpha3'
$config_version = $kubernetes_version ? {
/1.1(0|1)/ => 'v1alpha1',
default => 'v1alpha3',
}

file { $config_file:
ensure => present,
content => template("kubernetes/config-${template}.yaml.erb"),
content => template("kubernetes/${config_version}/config_kubeadm.yaml.erb"),
mode => '0600',
}

}
14 changes: 2 additions & 12 deletions manifests/config/worker.pp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
String $node_name = $kubernetes::node_name,
String $config_file = $kubernetes::config_file,
String $kubernetes_version = $kubernetes::kubernetes_version,
String $kubernetes_cluster_name = $kubernetes::kubernetes_cluster_name,
String $controller_address = $kubernetes::controller_address,
String $discovery_token_hash = $kubernetes::discovery_token_hash,
String $container_runtime = $kubernetes::container_runtime,
Expand All @@ -17,19 +18,8 @@
Optional[Hash] $kubelet_extra_config = $kubernetes::kubelet_extra_config,
Optional[Array] $ignore_preflight_errors = undef,
Boolean $skip_ca_verification = false,
String $cgroup_driver = $kubernetes::cgroup_driver,
) {
# Need to merge the cloud configuration parameters into extra_arguments
if !empty($cloud_provider) {
$cloud_args = empty($cloud_config) ? {
true => ["cloud-provider: ${cloud_provider}"],
default => ["cloud-provider: ${cloud_provider}", "cloud-config: ${cloud_config}"],
}
$kubelet_merged_extra_arguments = concat($kubelet_extra_arguments, $cloud_args)
}
else {
$kubelet_merged_extra_arguments = $kubelet_extra_arguments
}

# to_yaml emits a complete YAML document, so we must remove the leading '---'
$kubelet_extra_config_yaml = regsubst(to_yaml($kubelet_extra_config), '^---\n', '')

Expand Down
39 changes: 34 additions & 5 deletions manifests/init.pp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@
# ie api server,
# Defaults to 1.10.2
#
# [*kubernetes_cluster_name*]
# The name of the cluster, for use when multiple clusters are accessed from the same source
# Only used by Kubernetes 1.12+
# Defaults to "kubernetes"
#
# [*kubernetes_package_version*]
# The version of the packages the Kubernetes os packages to install
# ie kubectl and kubelet
Expand Down Expand Up @@ -234,11 +239,13 @@
# Defaults to {}
#
# [*kubelet_extra_config*]
# A hash containing extra configuration data to be serialised with `to_yaml` and appended to Kubelet configuration file for the cluster. Requires DynamicKubeletConfig.
# A hash containing extra configuration data to be serialised with `to_yaml` and appended to Kubelet configuration file for the cluster.
# Requires DynamicKubeletConfig.
# Defaults to {}
#
# [*kubelet_extra_arguments*]
# A string array to be appended to kubeletExtraArgs in the Kubelet's nodeRegistration configuration. It is applied to both masters and nodes. Use this for critical Kubelet settings such as `pod-infra-container-image` which may be problematic to configure via kubelet_extra_config and DynamicKubeletConfig.
# A string array to be appended to kubeletExtraArgs in the Kubelet's nodeRegistration configuration applied to both masters and nodes.
# Use this for critical Kubelet settings such as `pod-infra-container-image` which may be problematic to configure via kubelet_extra_config
# Defaults to []
#
# [*kubernetes_apt_location*]
Expand Down Expand Up @@ -313,6 +320,18 @@
# A flag to manage required sysctl settings.
# Defaults to true
#
# [*default_path*]
# The path to be used when running kube* commands
# Defaults to ['/usr/bin','/bin','/sbin','/usr/local/bin']
#
# [*cgroup_driver*]
# The cgroup driver to be used.
# Defaults to 'systemd' on EL and 'cgroupfs' otherwise
#
# [*environment*]
# The environment passed to kubectl commands.
# Defaults to setting HOME and KUBECONFIG variables
#
# Authors
# -------
#
Expand All @@ -322,6 +341,7 @@
#
class kubernetes (
String $kubernetes_version = '1.10.2',
String $kubernetes_cluster_name = 'kubernetes',
String $kubernetes_package_version = $facts['os']['family'] ? {
'Debian' => "${kubernetes_version}-00",
'RedHat' => $kubernetes::kubernetes_version,
Expand Down Expand Up @@ -403,6 +423,15 @@
Boolean $manage_sysctl_settings = true,
Boolean $create_repos = true,
String $image_repository = 'k8s.gcr.io',
Array[String] $default_path = ['/usr/bin','/bin','/sbin','/usr/local/bin'],
String $cgroup_driver = $facts['os']['family'] ? {
'RedHat' => 'systemd',
default => 'cgroupfs',
},
Array[String] $environment = $controller ? {
true => ['HOME=/root', 'KUBECONFIG=/etc/kubernetes/admin.conf'],
default => ['HOME=/root', 'KUBECONFIG=/etc/kubernetes/kubelet.conf'],
},
){
if ! $facts['os']['family'] in ['Debian','RedHat'] {
notify {"The OS family ${facts['os']['family']} is not supported by this module":}
Expand Down Expand Up @@ -434,20 +463,20 @@
if $controller {
include kubernetes::repos
include kubernetes::packages
include kubernetes::config
include kubernetes::config::kubeadm
include kubernetes::service
include kubernetes::cluster_roles
include kubernetes::kube_addons
contain kubernetes::repos
contain kubernetes::packages
contain kubernetes::config
contain kubernetes::config::kubeadm
contain kubernetes::service
contain kubernetes::cluster_roles
contain kubernetes::kube_addons

Class['kubernetes::repos']
-> Class['kubernetes::packages']
-> Class['kubernetes::config']
-> Class['kubernetes::config::kubeadm']
-> Class['kubernetes::service']
-> Class['kubernetes::cluster_roles']
-> Class['kubernetes::kube_addons']
Expand Down
14 changes: 9 additions & 5 deletions manifests/kube_addons.pp
Original file line number Diff line number Diff line change
@@ -1,34 +1,37 @@
# Class kubernetes kube_addons
class kubernetes::kube_addons (

Optional[String] $cni_network_provider = $kubernetes::cni_network_provider,
String $cni_network_provider = $kubernetes::cni_network_provider,
Optional[String] $cni_rbac_binding = $kubernetes::cni_rbac_binding,
Boolean $install_dashboard = $kubernetes::install_dashboard,
String $dashboard_version = $kubernetes::dashboard_version,
String $kubernetes_version = $kubernetes::kubernetes_version,
Boolean $controller = $kubernetes::controller,
Optional[Boolean] $schedule_on_controller = $kubernetes::schedule_on_controller,
String $node_name = $kubernetes::node_name,
Array $path = $kubernetes::default_path,
){

Exec {
path => ['/usr/bin', '/bin'],
path => $path,
environment => [ 'HOME=/root', 'KUBECONFIG=/etc/kubernetes/admin.conf'],
logoutput => true,
tries => 10,
try_sleep => 30,
}

if $cni_rbac_binding {
$shellsafe_binding = shell_escape($cni_rbac_binding)
exec { 'Install calico rbac bindings':
command => "kubectl apply -f ${cni_rbac_binding}",
command => "kubectl apply -f ${shellsafe_binding}",
onlyif => 'kubectl get nodes',
unless => 'kubectl get clusterrole | grep calico'
}
}

$shellsafe_provider = shell_escape($cni_network_provider)
exec { 'Install cni network provider':
command => "kubectl apply -f ${cni_network_provider}",
command => "kubectl apply -f ${shellsafe_provider}",
onlyif => 'kubectl get nodes',
unless => "kubectl -n kube-system get daemonset | egrep '(flannel|weave|calico-node)'"
}
Expand All @@ -42,8 +45,9 @@
}

if $install_dashboard {
$shellsafe_source = shell_escape("https://raw.githubusercontent.com/kubernetes/dashboard/${dashboard_version}/src/deploy/recommended/kubernetes-dashboard.yaml")
exec { 'Install Kubernetes dashboard':
command => "kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/${dashboard_version}/src/deploy/recommended/kubernetes-dashboard.yaml",
command => "kubectl apply -f ${shellsafe_source}",
onlyif => 'kubectl get nodes',
unless => 'kubectl -n kube-system get pods | grep kubernetes-dashboard',
}
Expand Down
6 changes: 4 additions & 2 deletions manifests/kubeadm_init.pp
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
String $node_name = $kubernetes::node_name,
Optional[String] $config = $kubernetes::config_file,
Boolean $dry_run = false,
Optional[Array] $env = undef,
Optional[Array] $path = undef,
Array $path = $kubernetes::default_path,
Optional[Array] $env = $kubernetes::environment,
Optional[Array] $ignore_preflight_errors = undef,
) {
$kubeadm_init_flags = kubeadm_init_flags({
Expand All @@ -25,4 +25,6 @@
unless => $unless_init,
}

# This prevents a known race condition https://github.com/kubernetes/kubernetes/issues/66689
kubernetes::wait_for_default_sa { 'default': }
}
4 changes: 2 additions & 2 deletions manifests/kubeadm_join.pp
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
Optional[String] $feature_gates = undef,
Optional[String] $cri_socket = undef,
Optional[String] $discovery_file = undef,
Optional[Array] $env = undef,
Optional[Array] $env = $kubernetes::environment,
Optional[Array] $ignore_preflight_errors = undef,
Optional[Array] $path = undef,
Array $path = $kubernetes::default_path,
Boolean $skip_ca_verification = false,
) {

Expand Down
1 change: 0 additions & 1 deletion manifests/packages.pp
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
Boolean $disable_swap = $kubernetes::disable_swap,
Boolean $manage_kernel_modules = $kubernetes::manage_kernel_modules,
Boolean $manage_sysctl_settings = $kubernetes::manage_sysctl_settings,

) {

$kube_packages = ['kubelet', 'kubectl', 'kubeadm']
Expand Down
21 changes: 21 additions & 0 deletions manifests/wait_for_default_sa.pp
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# == kubernetes::wait_for_default_sa
define kubernetes::wait_for_default_sa (
String $namespace = $title,
Array $path = $kubernetes::default_path,
Optional[Integer] $timeout = undef,
Optional[Integer] $tries = 5,
Optional[Integer] $try_sleep = 6,
Optional[Array] $env = $kubernetes::environment,
) {
$safe_namespace = shell_escape($namespace)

# This prevents a known race condition https://github.com/kubernetes/kubernetes/issues/66689
exec { "wait for default serviceaccount creation in ${safe_namespace}":
command => "kubectl -n ${safe_namespace} get serviceaccount default -o name",
path => $path,
environment => $env,
timeout => $timeout,
tries => $tries,
try_sleep => $try_sleep,
}
}
2 changes: 1 addition & 1 deletion metadata.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "puppetlabs-kubernetes",
"version": "3.2.2",
"version": "3.3.0",
"author": "Puppet",
"summary": "The module installs and configures a Kubernetes cluster",
"license": "Apache-2.0",
Expand Down
Loading