Configuring Nodes with multiple IP addresses to register with a hostname

Introduction

Out of the box, Nodes are configured to register themselves with the Console service registry using an IP address: this ensures that the Node can be reached at all times. However, sometimes a Node may have more than one active network interface and therefore more than one assigned IP address at any one time. In this situation, the Node will register itself with the Console gateway using one of the active IP addresses at random. This situation will usually work fine, however, if the Node has registered itself with one of its network interfaces/IP addresses that subsequently changes or is disabled, then communication between Console and the Node will fail and the Node will be marked as unavailable in the Administration Center - Nodes panel. To resolve this situation, there are two options as detailed below.

Option 1 - Force Node to register using its hostname in application-default.yml

To force the Node to register itself using its hostnamerather than its IP address, on each Node where you want to make this change, locate and edit the following properties file:

Enterprise mode: %PROGRAMDATA%\CAST\AIP-Node\application-default.yml

Add the line preferIpAddress: false into the file, under eureka: instance:as follows:

eureka:
  instance:
    # This instanceId will be used as a node name, it should be unique
    instanceId: ${spring.cloud.client.hostname}:${server.port}
	preferIpAddress: false

Save the application-default.yml file and then restart the Node. The Node will then register itself using its hostname, rather than the IP address.

Option 2 - Set advanced networking options in application-default.yml where hostname cannot be used

If you cannot use the Node’s hostname (for example the hostname does not resolve across your network) then you can alternatively use some advanced Spring.io networking configuration options to the application-default.yml file as listed below (see also https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/appendix.html):

OptionDefault settingDescription
spring.cloud.inetutils.default-hostnamelocalhostThe default hostname. Used in case of errors.
spring.cloud.inetutils.default-ip-address127.0.0.1The default IP address. Used in case of errors.
spring.cloud.inetutils.ignored-interfaces-List of Java regular expressions for network interfaces that will be ignored. For example where the Node has multiple network interface adapters, each with a different name, you can list the names of the interfaces to be ignored.
spring.cloud.inetutils.preferred-networks-List of Java regular expressions for network address subnets that will be preferred. For example where the Node has multiple network interface adapters, each using a different subnet, you can list the subnets in order, or just one to force the use of that specific subnet.
spring.cloud.inetutils.timeout-seconds1Timeout, in seconds, for calculating hostname.
spring.cloud.inetutils.use-only-site-local-interfacesfalseWhether to use only interfaces with site local addresses. See {@link InetAddress#isSiteLocalAddress()} for more details.

On each Node where you want to make these changes, locate and edit the following properties file:

Enterprise mode: %PROGRAMDATA%\CAST\AIP-Node\application-default.yml

Then add in the required changes under spring: :cloud: inetutils:as shown in the examples below. When complete, save the application-default.yml file and then restart the Node. The Node will then use the advanced Spring.io networking configuration options.

Example 1

In the following example, the preferred-networksoption has been added to force the Node to always advertise itself to the Console service registry with an IP address that matches the network address listed (in this example, only IP addresses matching the 192.168.x.x subnet will be used):

spring:
  cloud:
    inetutils:
	  preferred-networks:
		- 192.168
  config:
    import: configserver:http://192.168.200.107:8088/config

Example 2

In the following example, the default-hostname and the ignored-interfaces options have been added to force a specific hostname and to ignore network interfaces that match the ones in the list:

spring:
  cloud:
    inetutils:
      default-hostname: myaipnode.hostname.dev
      ignored-interfaces:
        - eth0
        - loopback*
  config:
    import: configserver:http://192.168.200.107:8088/config