YARN-9130. Add Bind_HOST configuration for Yarn Web Proxy. Contributed by Rong Tang.

This commit is contained in:
Inigo Goiri 2018-12-19 18:58:00 -08:00
parent 499c70eda5
commit 5df9fb16b9
5 changed files with 57 additions and 13 deletions

View File

@ -2302,13 +2302,17 @@ public static boolean isAclEnabled(Configuration conf) {
/** Keytab for Proxy.*/
public static final String PROXY_KEYTAB = PROXY_PREFIX + "keytab";
/** The address for the web proxy.*/
public static final String PROXY_ADDRESS =
PROXY_PREFIX + "address";
public static final int DEFAULT_PROXY_PORT = 9099;
public static final String DEFAULT_PROXY_ADDRESS =
"0.0.0.0:" + DEFAULT_PROXY_PORT;
/** Binding address for the web proxy. */
public static final String PROXY_BIND_HOST =
PROXY_PREFIX + "bind-host";
/**
* YARN Service Level Authorization

View File

@ -2157,6 +2157,15 @@
<value/>
</property>
<property>
<description>The actual address the web proxy will bind to. If this optional
address is set, it overrides only the hostname portion of yarn.web-proxy.address.
This is useful for making the web proxy server listen on all interfaces by setting
it to 0.0.0.0 </description>
<name>yarn.web-proxy.bind-host</name>
<value/>
</property>
<!-- Applications' Configuration -->
<property>

View File

@ -74,16 +74,26 @@ protected void serviceInit(Configuration conf) throws Exception {
fetcher = new AppReportFetcher(conf);
bindAddress = conf.get(YarnConfiguration.PROXY_ADDRESS);
if(bindAddress == null || bindAddress.isEmpty()) {
throw new YarnRuntimeException(YarnConfiguration.PROXY_ADDRESS +
throw new YarnRuntimeException(YarnConfiguration.PROXY_ADDRESS +
" is not set so the proxy will not run.");
}
LOG.info("Instantiating Proxy at " + bindAddress);
String[] parts = StringUtils.split(bindAddress, ':');
port = 0;
if (parts.length == 2) {
bindAddress = parts[0];
port = Integer.parseInt(parts[1]);
}
String bindHost = conf.getTrimmed(YarnConfiguration.PROXY_BIND_HOST, null);
if (bindHost != null) {
LOG.debug("{} is set, will be used to run proxy.",
YarnConfiguration.PROXY_BIND_HOST);
bindAddress = bindHost;
}
LOG.info("Instantiating Proxy at {}:{}", bindAddress, port);
acl = new AccessControlList(conf.get(YarnConfiguration.YARN_ADMIN_ACL,
YarnConfiguration.DEFAULT_YARN_ADMIN_ACL));
super.serviceInit(conf);

View File

@ -38,7 +38,7 @@
/**
* ProxyServer will sit in between the end user and AppMaster
* web interfaces.
* web interfaces.
*/
public class WebAppProxyServer extends CompositeService {
@ -103,9 +103,11 @@ protected void doSecureLogin(Configuration conf) throws IOException {
* @return InetSocketAddress
*/
public static InetSocketAddress getBindAddress(Configuration conf) {
return conf.getSocketAddr(YarnConfiguration.PROXY_ADDRESS,
YarnConfiguration.DEFAULT_PROXY_ADDRESS,
YarnConfiguration.DEFAULT_PROXY_PORT);
return conf.getSocketAddr(
YarnConfiguration.PROXY_BIND_HOST,
YarnConfiguration.PROXY_ADDRESS,
YarnConfiguration.DEFAULT_PROXY_ADDRESS,
YarnConfiguration.DEFAULT_PROXY_PORT);
}
public static void main(String[] args) {

View File

@ -23,7 +23,6 @@
import org.apache.hadoop.service.Service;
import org.apache.hadoop.service.Service.STATE;
import org.apache.hadoop.yarn.conf.YarnConfiguration;
import org.apache.hadoop.yarn.server.webproxy.WebAppProxyServer;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
@ -33,14 +32,15 @@
public class TestWebAppProxyServer {
private WebAppProxyServer webAppProxy = null;
private final String proxyAddress = "0.0.0.0:8888";
private final String port = "8888";
private final String proxyAddress = "localhost:" + port;
private YarnConfiguration conf = null;
@Before
public void setUp() throws Exception {
YarnConfiguration conf = new YarnConfiguration();
conf = new YarnConfiguration();
conf.set(YarnConfiguration.PROXY_ADDRESS, proxyAddress);
webAppProxy = new WebAppProxyServer();
webAppProxy.init(conf);
}
@After
@ -50,19 +50,38 @@ public void tearDown() throws Exception {
@Test
public void testStart() {
webAppProxy.init(conf);
assertEquals(STATE.INITED, webAppProxy.getServiceState());
webAppProxy.start();
for (Service service : webAppProxy.getServices()) {
if (service instanceof WebAppProxy) {
assertEquals(((WebAppProxy) service).getBindAddress(), proxyAddress);
assertEquals(proxyAddress, ((WebAppProxy) service).getBindAddress());
}
}
assertEquals(STATE.STARTED, webAppProxy.getServiceState());
}
@Test
public void testStartWithBindHost() {
String bindHost = "0.0.0.0";
conf.set(YarnConfiguration.PROXY_BIND_HOST, bindHost);
webAppProxy.init(conf);
assertEquals(STATE.INITED, webAppProxy.getServiceState());
webAppProxy.start();
for (Service service : webAppProxy.getServices()) {
if (service instanceof WebAppProxy) {
assertEquals(bindHost + ":" + port,
((WebAppProxy) service).getBindAddress());
}
}
assertEquals(STATE.STARTED, webAppProxy.getServiceState());
}
@Test
public void testBindAddress() {
YarnConfiguration conf = new YarnConfiguration();
conf = new YarnConfiguration();
InetSocketAddress defaultBindAddress = WebAppProxyServer.getBindAddress(conf);
Assert.assertEquals("Web Proxy default bind address port is incorrect",