From 809dc2c763fc6546df3e1b02c38f9d806aaf5260 Mon Sep 17 00:00:00 2001 From: Kevin W Monroe Date: Mon, 20 Aug 2018 05:20:59 +0000 Subject: [PATCH] add uuid bits to master/worker to make it a bit easier on operators --- .../reactive/kubernetes_master.py | 21 ++++++++++++++++--- .../reactive/kubernetes_worker.py | 9 ++++++-- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/cluster/juju/layers/kubernetes-master/reactive/kubernetes_master.py b/cluster/juju/layers/kubernetes-master/reactive/kubernetes_master.py index 4743a3a60cd..a658a3479eb 100644 --- a/cluster/juju/layers/kubernetes-master/reactive/kubernetes_master.py +++ b/cluster/juju/layers/kubernetes-master/reactive/kubernetes_master.py @@ -1799,18 +1799,33 @@ def _write_vsphere_snap_config(component): # vsphere requires additional cloud config vsphere = endpoint_from_flag('endpoint.vsphere.ready') + # NB: vsphere provider will ask kube-apiserver and -controller-manager to + # find a uuid from sysfs unless a global config value is set. Our strict + # snaps cannot read sysfs, so let's do it in the charm. An invalid uuid is + # not fatal for storage, but it will muddy the logs; try to get it right. + uuid_file = '/sys/class/dmi/id/product_uuid' + try: + with open(uuid_file, 'r') as f: + uuid = f.read().strip() + except IOError as err: + hookenv.log("Unable to read UUID from sysfs: {}".format(err)) + uuid = 'UNKNOWN' + cloud_config_path = _cloud_config_path(component) cloud_config_path.write_text('\n'.join([ '[Global]', + 'insecure-flag = true', + 'datacenters = "{}"'.format(vsphere.datacenter), + 'vm-uuid = "VMware-{}"'.format(uuid), + '[VirtualCenter "{}"]'.format(vsphere.vsphere_ip), 'user = {}'.format(vsphere.user), 'password = {}'.format(vsphere.password), - 'insecure-flag = "1"', - 'datacenters = {}'.format(vsphere.datacenter), - '[VirtualCenter "{}"]'.format(vsphere.vsphere_ip), '[Workspace]', 'server = {}'.format(vsphere.vsphere_ip), 'datacenter = "{}"'.format(vsphere.datacenter), 'default-datastore = "{}"'.format(vsphere.datastore), + 'folder = "kubernetes"', + 'resourcepool-path = ""', '[Disk]', 'scsicontrollertype = "pvscsi"', ])) diff --git a/cluster/juju/layers/kubernetes-worker/reactive/kubernetes_worker.py b/cluster/juju/layers/kubernetes-worker/reactive/kubernetes_worker.py index ed76687980c..4d285328fc9 100644 --- a/cluster/juju/layers/kubernetes-worker/reactive/kubernetes_worker.py +++ b/cluster/juju/layers/kubernetes-worker/reactive/kubernetes_worker.py @@ -714,10 +714,15 @@ def configure_kubelet(dns, ingress_ip): cloud_config_path = _cloud_config_path('kubelet') kubelet_opts['cloud-provider'] = 'openstack' kubelet_opts['cloud-config'] = str(cloud_config_path) - elif is_state('endpoint.vsphere.ready'): - # vsphere doesnt need a cloud config on the worker + elif is_state('endpoint.vsphere.joined'): + # vsphere just needs to be joined on the worker (vs 'ready') cloud_config_path = _cloud_config_path('kubelet') kubelet_opts['cloud-provider'] = 'vsphere' + # NB: vsphere maps node product-id to its uuid (no config file needed). + uuid_file = '/sys/class/dmi/id/product_uuid' + with open(uuid_file, 'r') as f: + uuid = f.read().strip() + kubelet_opts['provider-id'] = 'vsphere://{}'.format(uuid) if get_version('kubelet') >= (1, 10): # Put together the KubeletConfiguration data