From 039f83d7285daacb70eb573100f0c65da1967cec Mon Sep 17 00:00:00 2001 From: Jiffin Tony Thottan Date: Wed, 2 Aug 2023 13:23:12 +0530 Subject: [PATCH] cephadm: adjust the ingress ha proxy health check interval Currently health checker uses default value of 2s, it is send list bucket request for every 2s. This seems to be frequent and need to adjust properly. Hence introducing new setting health_check_interval in the ingress spec for haproxy. Signed-off-by: Jiffin Tony Thottan Apply suggestions from code review Co-authored-by: Adam King <47704447+adk3798@users.noreply.github.com> Signed-off-by: Jiffin Tony Thottan (cherry picked from commit 75327c5b56591c6a29ad47745df24d16320f5a99) --- doc/cephadm/services/rgw.rst | 5 +++++ src/pybind/mgr/cephadm/services/ingress.py | 1 + .../cephadm/templates/services/ingress/haproxy.cfg.j2 | 2 +- src/pybind/mgr/cephadm/tests/test_services.py | 6 +++--- src/python-common/ceph/deployment/service_spec.py | 10 ++++++++++ 5 files changed, 20 insertions(+), 4 deletions(-) diff --git a/doc/cephadm/services/rgw.rst b/doc/cephadm/services/rgw.rst index 20ec39a88dd..ed0b149365a 100644 --- a/doc/cephadm/services/rgw.rst +++ b/doc/cephadm/services/rgw.rst @@ -246,6 +246,7 @@ It is a yaml format file with the following properties: virtual_interface_networks: [ ... ] # optional: list of CIDR networks use_keepalived_multicast: # optional: Default is False. vrrp_interface_network: / # optional: ex: 192.168.20.0/24 + health_check_interval: # optional: Default is 2s. ssl_cert: | # optional: SSL certificate and key -----BEGIN CERTIFICATE----- ... @@ -273,6 +274,7 @@ It is a yaml format file with the following properties: monitor_port: # ex: 1967, used by haproxy for load balancer status virtual_interface_networks: [ ... ] # optional: list of CIDR networks first_virtual_router_id: # optional: default 50 + health_check_interval: # optional: Default is 2s. ssl_cert: | # optional: SSL certificate and key -----BEGIN CERTIFICATE----- ... @@ -321,6 +323,9 @@ where the properties of this service specification are: keepalived will have different virtual_router_id. In the case of using ``virtual_ips_list``, each IP will create its own virtual router. So the first one will have ``first_virtual_router_id``, second one will have ``first_virtual_router_id`` + 1, etc. Valid values go from 1 to 255. +* ``health_check_interval`` + Default is 2 seconds. This parameter can be used to set the interval between health checks + for the haproxy with the backend servers. .. _ingress-virtual-ip: diff --git a/src/pybind/mgr/cephadm/services/ingress.py b/src/pybind/mgr/cephadm/services/ingress.py index 55be3045466..5edd2517dc0 100644 --- a/src/pybind/mgr/cephadm/services/ingress.py +++ b/src/pybind/mgr/cephadm/services/ingress.py @@ -187,6 +187,7 @@ class IngressService(CephService): 'monitor_port': daemon_spec.ports[1] if daemon_spec.ports else spec.monitor_port, 'local_host_ip': host_ip, 'default_server_opts': server_opts, + 'health_check_interval': spec.health_check_interval or '2s', } ) config_files = { diff --git a/src/pybind/mgr/cephadm/templates/services/ingress/haproxy.cfg.j2 b/src/pybind/mgr/cephadm/templates/services/ingress/haproxy.cfg.j2 index c114a8cba11..9a0309ab409 100644 --- a/src/pybind/mgr/cephadm/templates/services/ingress/haproxy.cfg.j2 +++ b/src/pybind/mgr/cephadm/templates/services/ingress/haproxy.cfg.j2 @@ -74,7 +74,7 @@ backend backend balance static-rr option httpchk HEAD / HTTP/1.0 {% for server in servers %} - server {{ server.name }} {{ server.ip }}:{{ server.port }} check weight 100 + server {{ server.name }} {{ server.ip }}:{{ server.port }} check weight 100 inter {{ health_check_interval }} {% endfor %} {% endif %} {% if mode == 'tcp' %} diff --git a/src/pybind/mgr/cephadm/tests/test_services.py b/src/pybind/mgr/cephadm/tests/test_services.py index ec0af260cca..500b7bf99ff 100644 --- a/src/pybind/mgr/cephadm/tests/test_services.py +++ b/src/pybind/mgr/cephadm/tests/test_services.py @@ -1803,7 +1803,7 @@ class TestIngressService: 'balance static-rr\n ' 'option httpchk HEAD / HTTP/1.0\n ' 'server ' - + haproxy_generated_conf[1][0] + ' 1.2.3.7:80 check weight 100\n' + + haproxy_generated_conf[1][0] + ' 1.2.3.7:80 check weight 100 inter 2s\n' } } @@ -1928,7 +1928,7 @@ class TestIngressService: 'balance static-rr\n ' 'option httpchk HEAD / HTTP/1.0\n ' 'server ' - + haproxy_generated_conf[1][0] + ' 1::4:443 check weight 100\n' + + haproxy_generated_conf[1][0] + ' 1::4:443 check weight 100 inter 2s\n' } } @@ -2052,7 +2052,7 @@ class TestIngressService: 'balance static-rr\n ' 'option httpchk HEAD / HTTP/1.0\n ' 'server ' - + haproxy_generated_conf[1][0] + ' 1.2.3.7:80 check weight 100\n' + + haproxy_generated_conf[1][0] + ' 1.2.3.7:80 check weight 100 inter 2s\n' } } diff --git a/src/python-common/ceph/deployment/service_spec.py b/src/python-common/ceph/deployment/service_spec.py index dd07d4f9923..12263ca0d82 100644 --- a/src/python-common/ceph/deployment/service_spec.py +++ b/src/python-common/ceph/deployment/service_spec.py @@ -1298,6 +1298,7 @@ class IngressSpec(ServiceSpec): extra_entrypoint_args: Optional[GeneralArgList] = None, enable_haproxy_protocol: bool = False, custom_configs: Optional[List[CustomConfig]] = None, + health_check_interval: Optional[str] = None, ): assert service_type == 'ingress' @@ -1330,6 +1331,8 @@ class IngressSpec(ServiceSpec): self.ssl = ssl self.keepalive_only = keepalive_only self.enable_haproxy_protocol = enable_haproxy_protocol + self.health_check_interval = health_check_interval.strip( + ) if health_check_interval else None def get_port_start(self) -> List[int]: ports = [] @@ -1360,6 +1363,13 @@ class IngressSpec(ServiceSpec): if self.virtual_ip is not None and self.virtual_ips_list is not None: raise SpecValidationError( 'Cannot add ingress: Single and multiple virtual IPs specified') + if self.health_check_interval: + valid_units = ['s', 'm', 'h'] + m = re.search(rf"^(\d+)({'|'.join(valid_units)})$", self.health_check_interval) + if not m: + raise SpecValidationError( + f'Cannot add ingress: Invalid health_check_interval specified. ' + f'Valid units are: {valid_units}') yaml.add_representer(IngressSpec, ServiceSpec.yaml_representer) -- 2.39.5