Merge "Improve floating IP allocation"

This commit is contained in:
Zuul 2019-03-20 18:12:43 +00:00 committed by Gerrit Code Review
commit d1957c71dc
19 changed files with 201 additions and 51 deletions

View File

@ -158,6 +158,6 @@ class DcosCentosTemplateDefinition(template_def.BaseTemplateDefinition):
template_def.add_priv_net_env_file(env_files, cluster_template)
template_def.add_lb_env_file(env_files, cluster_template)
template_def.add_fip_env_file(env_files, cluster_template)
template_def.add_fip_env_file(env_files, cluster_template, cluster)
return env_files

View File

@ -384,6 +384,9 @@ the table are linked to more details elsewhere in the user guide.
+---------------------------------------+--------------------+---------------+
| `tiller_namespace`_ | see below | see below |
+---------------------------------------+--------------------+---------------+
| `master_lb_floating_ip_enabled`_ | - true | see below |
| | - false | |
+---------------------------------------+--------------------+---------------+
Cluster
-------
@ -1232,6 +1235,12 @@ _`tiller_namespace`
Configure in which namespace tiller is going to be installed.
Default: magnum-tiller
_`master_lb_floating_ip_enabled`
Controls if Magnum allocates floating IP for the load balancer of master
nodes. This label only takes effect when the template property
``master_lb_enabled`` is set. If not specified, the default value is the same
as template property ``floating_ip_enabled``.
External load balancer for services
-----------------------------------

View File

@ -1,5 +1,3 @@
# Environment file to disable FloatingIP in a Kubernetes cluster by mapping
# FloatingIP-related resource types to OS::Neutron::FloatingIP
resource_registry:
"Magnum::FloatingIPAddressSwitcher": "../fragments/floating_ip_address_switcher_public.yaml"

View File

@ -2,3 +2,5 @@
resource_registry:
"Magnum::Optional::Neutron::LBaaS::FloatingIP": "OS::Neutron::FloatingIP"
"Magnum::FloatingIPAddressSwitcher": "../fragments/floating_ip_address_switcher_public.yaml"

View File

@ -0,0 +1,52 @@
# etcd service load balancer doesn't have floating IP associated.
heat_template_version: 2014-10-16
parameters:
fixed_subnet:
type: string
protocol:
type: string
default: TCP
constraints:
- allowed_values: ["TCP", "HTTP"]
port:
type: number
resources:
loadbalancer:
type: Magnum::Optional::Neutron::LBaaS::LoadBalancer
properties:
vip_subnet: {get_param: fixed_subnet}
listener:
type: Magnum::Optional::Neutron::LBaaS::Listener
properties:
loadbalancer: {get_resource: loadbalancer}
protocol: {get_param: protocol}
protocol_port: {get_param: port}
pool:
type: Magnum::Optional::Neutron::LBaaS::Pool
properties:
lb_algorithm: ROUND_ROBIN
listener: {get_resource: listener}
protocol: {get_param: protocol}
monitor:
type: Magnum::Optional::Neutron::LBaaS::HealthMonitor
properties:
type: TCP
delay: 5
max_retries: 5
timeout: 5
pool: { get_resource: pool }
outputs:
pool_id:
value: {get_resource: pool}
address:
value: {get_attr: [loadbalancer, vip_address]}

View File

@ -127,6 +127,6 @@ class CoreOSK8sTemplateDefinition(k8s_template_def.K8sTemplateDefinition):
template_def.add_etcd_volume_env_file(env_files, cluster_template)
template_def.add_volume_env_file(env_files, cluster)
template_def.add_lb_env_file(env_files, cluster_template)
template_def.add_fip_env_file(env_files, cluster_template)
template_def.add_fip_env_file(env_files, cluster_template, cluster)
return env_files

View File

@ -162,6 +162,6 @@ class K8sFedoraTemplateDefinition(k8s_template_def.K8sTemplateDefinition):
template_def.add_etcd_volume_env_file(env_files, cluster_template)
template_def.add_volume_env_file(env_files, cluster)
template_def.add_lb_env_file(env_files, cluster_template)
template_def.add_fip_env_file(env_files, cluster_template)
template_def.add_fip_env_file(env_files, cluster_template, cluster)
return env_files

View File

@ -154,6 +154,6 @@ class SwarmModeTemplateDefinition(template_def.BaseTemplateDefinition):
template_def.add_priv_net_env_file(env_files, cluster_template)
template_def.add_volume_env_file(env_files, cluster)
template_def.add_lb_env_file(env_files, cluster_template)
template_def.add_fip_env_file(env_files, cluster_template)
template_def.add_fip_env_file(env_files, cluster_template, cluster)
return env_files

View File

@ -15,6 +15,7 @@ import abc
import ast
from oslo_log import log as logging
from oslo_utils import strutils
import re
import requests
import six
@ -385,15 +386,22 @@ def add_etcd_volume_env_file(env_files, cluster_template):
env_files.append(COMMON_ENV_PATH + 'with_etcd_volume.yaml')
def add_fip_env_file(env_files, cluster_template):
def add_fip_env_file(env_files, cluster_template, cluster):
lb_fip_enabled = cluster.labels.get(
"master_lb_floating_ip_enabled",
cluster_template.floating_ip_enabled
)
master_lb_fip_enabled = strutils.bool_from_string(lb_fip_enabled)
if cluster_template.floating_ip_enabled:
env_files.append(COMMON_ENV_PATH + 'enable_floating_ip.yaml')
if cluster_template.master_lb_enabled:
env_files.append(COMMON_ENV_PATH + 'enable_lb_floating_ip.yaml')
else:
env_files.append(COMMON_ENV_PATH + 'disable_floating_ip.yaml')
if cluster_template.master_lb_enabled:
env_files.append(COMMON_ENV_PATH + 'disable_lb_floating_ip.yaml')
if cluster_template.master_lb_enabled and master_lb_fip_enabled:
env_files.append(COMMON_ENV_PATH + 'enable_lb_floating_ip.yaml')
else:
env_files.append(COMMON_ENV_PATH + 'disable_lb_floating_ip.yaml')
def add_priv_net_env_file(env_files, cluster_template):

View File

@ -515,7 +515,7 @@ resources:
private_network_name: private
api_lb:
type: ../../common/templates/lb.yaml
type: ../../common/templates/lb_api.yaml
properties:
fixed_subnet: {get_attr: [network, fixed_subnet]}
external_network: {get_param: external_network}
@ -523,10 +523,9 @@ resources:
port: {get_param: kubernetes_port}
etcd_lb:
type: ../../common/templates/lb.yaml
type: ../../common/templates/lb_etcd.yaml
properties:
fixed_subnet: {get_attr: [network, fixed_subnet]}
external_network: {get_param: external_network}
protocol: {get_param: loadbalancing_protocol}
port: 2379

View File

@ -586,7 +586,7 @@ resources:
private_network_name: private
api_lb:
type: ../../common/templates/lb.yaml
type: ../../common/templates/lb_api.yaml
properties:
fixed_subnet: {get_attr: [network, fixed_subnet]}
external_network: {get_param: external_network}
@ -594,10 +594,9 @@ resources:
port: {get_param: kubernetes_port}
etcd_lb:
type: ../../common/templates/lb.yaml
type: ../../common/templates/lb_etcd.yaml
properties:
fixed_subnet: {get_attr: [network, fixed_subnet]}
external_network: {get_param: external_network}
protocol: {get_param: loadbalancing_protocol}
port: 2379

View File

@ -11,7 +11,7 @@ parameters:
type: string
description: name of ssh key to be provisioned on our server
default: ""
external_network:
type: string
description: uuid/name of a network to use for floating ip addresses
@ -370,7 +370,7 @@ parameters:
resources:
api_lb:
type: ../../common/templates/lb.yaml
type: ../../common/templates/lb_api.yaml
properties:
fixed_subnet: {get_param: fixed_subnet}
external_network: {get_param: external_network}
@ -378,10 +378,9 @@ resources:
port: {get_param: kubernetes_port}
etcd_lb:
type: ../../common/templates/lb.yaml
type: ../../common/templates/lb_etcd.yaml
properties:
fixed_subnet: {get_param: fixed_subnet}
external_network: {get_param: external_network}
protocol: {get_param: loadbalancing_protocol}
port: 2379

View File

@ -12,7 +12,7 @@ parameters:
type: string
description: name of ssh key to be provisioned on our server
default: ""
external_network:
type: string
description: uuid/name of a network to use for floating ip addresses
@ -242,7 +242,7 @@ resources:
external_network: {get_param: external_network}
api_lb:
type: ../../common/templates/lb.yaml
type: ../../common/templates/lb_api.yaml
properties:
fixed_subnet: {get_attr: [network, fixed_subnet]}
external_network: {get_param: external_network}

View File

@ -17,7 +17,7 @@ parameters:
type: string
description: name of ssh key to be provisioned on our server
default: ""
external_network:
type: string
description: uuid/name of a network to use for floating ip addresses
@ -284,7 +284,7 @@ resources:
external_network: {get_param: external_network}
api_lb:
type: ../../common/templates/lb.yaml
type: ../../common/templates/lb_api.yaml
properties:
fixed_subnet: {get_attr: [network, fixed_subnet]}
external_network: {get_param: external_network}
@ -292,10 +292,9 @@ resources:
port: {get_param: swarm_port}
etcd_lb:
type: ../../common/templates/lb.yaml
type: ../../common/templates/lb_etcd.yaml
properties:
fixed_subnet: {get_attr: [network, fixed_subnet]}
external_network: {get_param: external_network}
protocol: {get_param: loadbalancing_protocol}
port: 2379

View File

@ -221,7 +221,7 @@ resources:
external_network: {get_param: external_network}
api_lb:
type: ../../common/templates/lb.yaml
type: ../../common/templates/lb_api.yaml
properties:
fixed_subnet: {get_attr: [network, fixed_subnet]}
external_network: {get_param: external_network}

View File

@ -304,6 +304,7 @@ class TestClusterConductorWithK8s(base.TestCase):
'../../common/templates/environments/with_volume.yaml',
'../../common/templates/environments/no_master_lb.yaml',
'../../common/templates/environments/disable_floating_ip.yaml',
'../../common/templates/environments/disable_lb_floating_ip.yaml',
],
env_files)
@ -424,6 +425,7 @@ class TestClusterConductorWithK8s(base.TestCase):
'../../common/templates/environments/with_volume.yaml',
'../../common/templates/environments/no_master_lb.yaml',
'../../common/templates/environments/disable_floating_ip.yaml',
'../../common/templates/environments/disable_lb_floating_ip.yaml'
],
env_files)
@ -532,6 +534,7 @@ class TestClusterConductorWithK8s(base.TestCase):
'../../common/templates/environments/with_volume.yaml',
'../../common/templates/environments/no_master_lb.yaml',
'../../common/templates/environments/disable_floating_ip.yaml',
'../../common/templates/environments/disable_lb_floating_ip.yaml'
],
env_files)
@ -630,7 +633,9 @@ class TestClusterConductorWithK8s(base.TestCase):
'../../common/templates/environments/no_etcd_volume.yaml',
'../../common/templates/environments/with_volume.yaml',
'../../common/templates/environments/no_master_lb.yaml',
'../../common/templates/environments/disable_floating_ip.yaml'],
'../../common/templates/environments/disable_floating_ip.yaml',
'../../common/templates/environments/disable_lb_floating_ip.yaml'
],
env_files)
@patch('requests.get')
@ -726,7 +731,9 @@ class TestClusterConductorWithK8s(base.TestCase):
'../../common/templates/environments/no_etcd_volume.yaml',
'../../common/templates/environments/with_volume.yaml',
'../../common/templates/environments/no_master_lb.yaml',
'../../common/templates/environments/disable_floating_ip.yaml'],
'../../common/templates/environments/disable_floating_ip.yaml',
'../../common/templates/environments/disable_lb_floating_ip.yaml'
],
env_files)
@patch('requests.get')
@ -970,6 +977,7 @@ class TestClusterConductorWithK8s(base.TestCase):
'../../common/templates/environments/with_volume.yaml',
'../../common/templates/environments/no_master_lb.yaml',
'../../common/templates/environments/disable_floating_ip.yaml',
'../../common/templates/environments/disable_lb_floating_ip.yaml',
],
env_files)
reqget.assert_called_once_with('http://etcd/test?size=1', proxies={

View File

@ -185,39 +185,107 @@ class TemplateDefinitionTestCase(base.TestCase):
def test_add_fip_env_lb_disabled_with_fp(self):
mock_cluster_template = mock.MagicMock(floating_ip_enabled=True,
master_lb_enabled=False)
master_lb_enabled=False,
labels={})
mock_cluster = mock.MagicMock(labels={})
env_files = []
cmn_tdef.add_fip_env_file(env_files, mock_cluster_template)
self.assertEqual([cmn_tdef.COMMON_ENV_PATH +
'enable_floating_ip.yaml'], env_files)
cmn_tdef.add_fip_env_file(env_files, mock_cluster_template,
mock_cluster)
self.assertEqual(
[
cmn_tdef.COMMON_ENV_PATH + 'enable_floating_ip.yaml',
cmn_tdef.COMMON_ENV_PATH + 'disable_lb_floating_ip.yaml'
],
env_files
)
def test_add_fip_env_lb_enabled_with_fp(self):
mock_cluster_template = mock.MagicMock(floating_ip_enabled=True,
master_lb_enabled=True)
master_lb_enabled=True,
labels={})
mock_cluster = mock.MagicMock(labels={})
env_files = []
cmn_tdef.add_fip_env_file(env_files, mock_cluster_template)
self.assertEqual([cmn_tdef.COMMON_ENV_PATH +
'enable_floating_ip.yaml',
cmn_tdef.COMMON_ENV_PATH +
'enable_lb_floating_ip.yaml'], env_files)
cmn_tdef.add_fip_env_file(env_files, mock_cluster_template,
mock_cluster)
self.assertEqual(
[
cmn_tdef.COMMON_ENV_PATH + 'enable_floating_ip.yaml',
cmn_tdef.COMMON_ENV_PATH + 'enable_lb_floating_ip.yaml'
],
env_files
)
def test_add_fip_env_lb_disabled_without_fp(self):
mock_cluster_template = mock.MagicMock(floating_ip_enabled=False,
master_lb_enabled=False)
master_lb_enabled=False,
labels={})
mock_cluster = mock.MagicMock(labels={})
env_files = []
cmn_tdef.add_fip_env_file(env_files, mock_cluster_template)
self.assertEqual([cmn_tdef.COMMON_ENV_PATH +
'disable_floating_ip.yaml'], env_files)
cmn_tdef.add_fip_env_file(env_files, mock_cluster_template,
mock_cluster)
self.assertEqual(
[
cmn_tdef.COMMON_ENV_PATH + 'disable_floating_ip.yaml',
cmn_tdef.COMMON_ENV_PATH + 'disable_lb_floating_ip.yaml'
],
env_files
)
def test_add_fip_env_lb_enabled_without_fp(self):
mock_cluster_template = mock.MagicMock(floating_ip_enabled=False,
master_lb_enabled=True)
master_lb_enabled=True,
labels={})
mock_cluster = mock.MagicMock(labels={})
env_files = []
cmn_tdef.add_fip_env_file(env_files, mock_cluster_template)
self.assertEqual([cmn_tdef.COMMON_ENV_PATH +
'disable_floating_ip.yaml',
cmn_tdef.COMMON_ENV_PATH +
'disable_lb_floating_ip.yaml'], env_files)
cmn_tdef.add_fip_env_file(env_files, mock_cluster_template,
mock_cluster)
self.assertEqual(
[
cmn_tdef.COMMON_ENV_PATH + 'disable_floating_ip.yaml',
cmn_tdef.COMMON_ENV_PATH + 'disable_lb_floating_ip.yaml'
],
env_files
)
def test_add_fip_env_lb_fip_enabled_without_fp(self):
mock_cluster_template = mock.MagicMock(
floating_ip_enabled=False,
master_lb_enabled=True,
labels={"master_lb_floating_ip_enabled": "true"}
)
mock_cluster = mock.MagicMock(
labels={"master_lb_floating_ip_enabled": "true"})
env_files = []
cmn_tdef.add_fip_env_file(env_files, mock_cluster_template,
mock_cluster)
self.assertEqual(
[
cmn_tdef.COMMON_ENV_PATH + 'disable_floating_ip.yaml',
cmn_tdef.COMMON_ENV_PATH + 'enable_lb_floating_ip.yaml'
],
env_files
)
def test_add_fip_env_lb_enable_lbfip_disable(self):
mock_cluster_template = mock.MagicMock(
floating_ip_enabled=False,
master_lb_enabled=True,
labels={"master_lb_floating_ip_enabled": "false"}
)
mock_cluster = mock.MagicMock(
labels={"master_lb_floating_ip_enabled": "false"})
env_files = []
cmn_tdef.add_fip_env_file(env_files, mock_cluster_template,
mock_cluster)
self.assertEqual(
[
cmn_tdef.COMMON_ENV_PATH + 'disable_floating_ip.yaml',
cmn_tdef.COMMON_ENV_PATH + 'disable_lb_floating_ip.yaml'
],
env_files
)
@mock.patch('magnum.drivers.common.driver.Driver.get_driver')
def test_base_get_scale_params(self, mock_driver):
@ -247,7 +315,6 @@ class BaseK8sTemplateDefinitionTestCase(base.TestCase):
private_ip_output_key='kube_masters_private',
cluster_attr='master_addresses',
):
definition = self.get_definition()
expected_address = expected_public_address = ['public']

View File

@ -0,0 +1,10 @@
upgrade:
- The etcd service for Kubernetes cluster is no longer allocated a floating
IP.
features:
- A new label named ``master_lb_floating_ip_enabled`` is introduced which
controls if Magnum allocates floating IP for the load balancer of master
nodes. This label only takes effect when the ``master_lb_enabled`` is set.
The default value is the same as ``floating_ip_enabled``. The
``floating_ip_enabled`` property now only controls if Magnum should
allocate the floating IPs for the master and worker nodes.