Add storage-backend configuration option to kubernetes-master charm.

This commit is contained in:
Rye Terrell 2018-01-24 10:04:29 -06:00
parent ee14d2edf0
commit 6db03cf471
2 changed files with 35 additions and 19 deletions

View File

@ -80,3 +80,9 @@ options:
description: |
When true, master nodes will not be upgraded until the user triggers
it manually by running the upgrade action.
storage-backend:
type: string
default: "auto"
description: |
The storage backend for kube-apiserver persistence. Can be "etcd2", "etcd3", or
"auto". Auto mode will select etcd3 on new installations, or etcd2 on upgrades.

View File

@ -112,7 +112,12 @@ def check_for_upgrade_needed():
# we take no risk and forcibly upgrade the snaps.
# Forcibly means we do not prompt the user to call the upgrade action.
set_upgrade_needed(forced=True)
upgrade_for_etcd()
# Set the auto storage backend to etcd2.
auto_storage_backend = leader_get('auto_storage_backend')
is_leader = is_state('leadership.is_leader')
if not auto_storage_backend and is_leader:
leader_set(auto_storage_backend='etcd2')
def snap_resources_changed():
@ -138,14 +143,6 @@ def snap_resources_changed():
return 'unknown'
def upgrade_for_etcd():
# we are upgrading the charm.
# If this is an old deployment etcd_version is not set
# so if we are the leader we need to set it to v2
if not leader_get('etcd_version') and is_state('leadership.is_leader'):
leader_set(etcd_version='etcd2')
def add_rbac_roles():
'''Update the known_tokens file with proper groups.'''
@ -279,6 +276,11 @@ def password_changed():
set_state('client.password.initialised')
@when('config.changed.storage-backend')
def storage_backend_changed():
remove_state('kubernetes-master.components.started')
@when('cni.connected')
@when_not('cni.configured')
def configure_cni(cni):
@ -432,7 +434,7 @@ def master_services_down():
@when('etcd.available', 'tls_client.server.certificate.saved',
'authentication.setup')
@when('leadership.set.etcd_version')
@when('leadership.set.auto_storage_backend')
@when_not('kubernetes-master.components.started')
def start_master(etcd):
'''Run the Kubernetes master components.'''
@ -450,8 +452,7 @@ def start_master(etcd):
handle_etcd_relation(etcd)
# Add CLI options to all components
leader_etcd_version = leader_get('etcd_version')
configure_apiserver(etcd.get_connection_string(), leader_etcd_version)
configure_apiserver(etcd.get_connection_string(), getStorageBackend())
configure_controller_manager()
configure_scheduler()
set_state('kubernetes-master.components.started')
@ -473,13 +474,15 @@ def etcd_data_change(etcd):
if data_changed('etcd-connect', connection_string):
remove_state('kubernetes-master.components.started')
# We are the leader and the etcd_version is not set meaning
# We are the leader and the auto_storage_backend is not set meaning
# this is the first time we connect to etcd.
if is_state('leadership.is_leader') and not leader_get('etcd_version'):
auto_storage_backend = leader_get('auto_storage_backend')
is_leader = is_state('leadership.is_leader')
if is_leader and not auto_storage_backend:
if etcd.get_version().startswith('3.'):
leader_set(etcd_version='etcd3')
leader_set(auto_storage_backend='etcd3')
else:
leader_set(etcd_version='etcd2')
leader_set(auto_storage_backend='etcd2')
@when('kube-control.connected')
@ -747,7 +750,7 @@ def ceph_storage(ceph_admin):
cmd = ['kubectl', 'apply', '-f', '/tmp/ceph-secret.yaml']
check_call(cmd)
os.remove('/tmp/ceph-secret.yaml')
except: # NOQA
except: # NOQA
# the enlistment in kubernetes failed, return and prepare for re-exec
return
@ -835,11 +838,11 @@ def on_config_allow_privileged_change():
@when('config.changed.api-extra-args')
@when('kubernetes-master.components.started')
@when('leadership.set.etcd_version')
@when('leadership.set.auto_storage_backend')
@when('etcd.available')
def on_config_api_extra_args_change(etcd):
configure_apiserver(etcd.get_connection_string(),
leader_get('etcd_version'))
getStorageBackend())
@when('config.changed.controller-manager-extra-args')
@ -1280,3 +1283,10 @@ def touch(fname):
os.utime(fname, None)
except OSError:
open(fname, 'a').close()
def getStorageBackend():
storage_backend = hookenv.config('storage-backend')
if storage_backend == 'auto':
storage_backend = leader_get('auto_storage_backend')
return storage_backend