Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create LoadBalancer by hand instead of via annotation #1518

Merged
merged 3 commits into from Feb 7, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -12,15 +12,20 @@
*/
package io.kubernetes.client.examples;

import io.kubernetes.client.extended.network.LoadBalancer;
import io.kubernetes.client.informer.SharedInformerFactory;
import io.kubernetes.client.spring.extended.network.annotation.KubernetesEndpointsLoadBalanced;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import io.kubernetes.client.extended.network.EndpointsLoadBalancer;
import io.kubernetes.client.extended.network.LoadBalancer;
import io.kubernetes.client.extended.network.RoundRobinLoadBalanceStrategy;
import io.kubernetes.client.informer.SharedInformerFactory;
import io.kubernetes.client.informer.cache.Lister;
import io.kubernetes.client.openapi.models.V1Endpoints;
import io.kubernetes.client.spring.extended.network.endpoints.InformerEndpointsGetter;

@SpringBootApplication
public class SpringLoadBalancerExample {

Expand All @@ -44,14 +49,23 @@ public CommandLineRunner loadBalancerCommandLineRunner(
}

@Bean
public MyService myService() {
return new MyService();
public MyService myService(Lister<V1Endpoints> lister) {
return new MyService(lister);
}
}

public static class MyService {

@KubernetesEndpointsLoadBalanced(namespace = "default", name = "kubernetes")
private LoadBalancer defaultKubernetesLoadBalancer;

public MyService(Lister<V1Endpoints> lister) {
InformerEndpointsGetter getter = new InformerEndpointsGetter(lister);
RoundRobinLoadBalanceStrategy strategy = new RoundRobinLoadBalanceStrategy();
defaultKubernetesLoadBalancer = new EndpointsLoadBalancer(
() -> getter.get("default", "kubernetes"),
strategy
);
}

}
}

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Expand Up @@ -14,11 +14,14 @@

import io.kubernetes.client.informer.cache.Lister;
import io.kubernetes.client.openapi.models.V1Endpoints;
import org.springframework.beans.factory.annotation.Autowired;

public class InformerEndpointsGetter implements EndpointsGetter {

@Autowired private Lister<V1Endpoints> endpointsLister;
private final Lister<V1Endpoints> endpointsLister;

public InformerEndpointsGetter(Lister<V1Endpoints> lister) {
this.endpointsLister = lister;
}

@Override
public V1Endpoints get(String namespace, String name) {
Expand Down
Expand Up @@ -20,14 +20,17 @@
import io.kubernetes.client.openapi.apis.CoreV1Api;
import io.kubernetes.client.openapi.models.V1Endpoints;
import java.time.Duration;
import org.springframework.beans.factory.annotation.Autowired;

public class PollingEndpointsGetter implements EndpointsGetter {

private static final Cache<NamespaceName, V1Endpoints> lastObservedEndpoints =
Caffeine.newBuilder().expireAfterWrite(Duration.ofMinutes(5)).build();

@Autowired private ApiClient apiClient;
private final ApiClient apiClient;

public PollingEndpointsGetter(ApiClient apiClient) {
this.apiClient = apiClient;
}

@Override
public V1Endpoints get(String namespace, String name) {
Expand Down
1 change: 0 additions & 1 deletion spring/src/main/resources/META-INF/spring.factories
@@ -1,5 +1,4 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
io.kubernetes.client.spring.extended.controller.config.KubernetesInformerAutoConfiguration, \
io.kubernetes.client.spring.extended.controller.config.KubernetesReconcilerAutoConfiguration, \
io.kubernetes.client.spring.extended.network.config.KubernetesLoadBalancerAutoConfiguration, \
io.kubernetes.client.spring.extended.manifests.config.KubernetesManifestsAutoConfiguration
Expand Up @@ -99,8 +99,6 @@ static class TestSharedInformerFactory extends SharedInformerFactory {}

@Autowired private Lister<V1ConfigMap> configMapLister;

@Autowired private ApiClient apiClient;

@Test
public void testInformerInjection() throws InterruptedException {
assertNotNull(podInformer);
Expand Down
Expand Up @@ -12,10 +12,14 @@
*/
package io.kubernetes.client.spring.extended.network;

import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThrows;

import io.kubernetes.client.extended.network.EndpointsLoadBalancer;
import io.kubernetes.client.extended.network.LoadBalanceStrategy;
import io.kubernetes.client.extended.network.LoadBalancer;
import io.kubernetes.client.extended.network.RoundRobinLoadBalanceStrategy;
import io.kubernetes.client.extended.network.exception.NoAvailableAddressException;
import io.kubernetes.client.informer.cache.Cache;
import io.kubernetes.client.informer.cache.Lister;
Expand All @@ -24,8 +28,8 @@
import io.kubernetes.client.openapi.models.V1EndpointSubset;
import io.kubernetes.client.openapi.models.V1Endpoints;
import io.kubernetes.client.openapi.models.V1ObjectMeta;
import io.kubernetes.client.spring.extended.network.annotation.KubernetesEndpointsLoadBalanced;
import io.kubernetes.client.spring.extended.network.endpoints.EndpointsGetter;
import io.kubernetes.client.spring.extended.network.endpoints.InformerEndpointsGetter;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
Expand Down Expand Up @@ -53,28 +57,32 @@ public Lister<V1Endpoints> endpointsLister(Cache<V1Endpoints> endpointsCache) {
}

@Bean
public MyBean myBean() {
return new MyBean();
public MyBean myBean(Lister<V1Endpoints> lister) {
return new MyBean(new MyEndpointGetter(), new MyStrategy(), lister);
}
}

static class MyBean {
@KubernetesEndpointsLoadBalanced(namespace = "default", name = "no-such")

public MyBean(
MyEndpointGetter myEndpointGetter, MyStrategy myStrategy, Lister<V1Endpoints> lister) {
InformerEndpointsGetter getter = new InformerEndpointsGetter(lister);
RoundRobinLoadBalanceStrategy strategy = new RoundRobinLoadBalanceStrategy();
noSuchLoadBalancer =
new EndpointsLoadBalancer(() -> getter.get("default", "no-such"), strategy);
fooLoadBalancer = new EndpointsLoadBalancer(() -> getter.get("default", "foo"), strategy);
customStrategyLoadBalancer =
new EndpointsLoadBalancer(() -> getter.get("default", "foo"), myStrategy);
customEndpointGetterLoadBalancer =
new EndpointsLoadBalancer(() -> myEndpointGetter.get("default", "foo"), strategy);
}

private LoadBalancer noSuchLoadBalancer;

@KubernetesEndpointsLoadBalanced(namespace = "default", name = "foo")
private LoadBalancer fooLoadBalancer;

@KubernetesEndpointsLoadBalanced(
namespace = "default",
name = "foo",
strategy = MyStrategy.class)
private LoadBalancer customStrategyLoadBalancer;

@KubernetesEndpointsLoadBalanced(
namespace = "default",
name = "foo",
endpointsGetter = MyEndpointGetter.class)
private LoadBalancer customEndpointGetterLoadBalancer;
}

Expand Down Expand Up @@ -109,6 +117,7 @@ public V1Endpoints get(String namespace, String name) {
new V1EndpointSubset()
.addAddressesItem(new V1EndpointAddress().ip("127.0.0.1"))
.addPortsItem(new V1EndpointPort().port(8080)));

@Autowired private MyBean myBean;

@Autowired private Cache<V1Endpoints> endpointsCache;
Expand Down
Expand Up @@ -12,12 +12,7 @@
*/
package io.kubernetes.client.spring.extended.network;

import io.kubernetes.client.spring.extended.network.config.KubernetesLoadBalancerAutoConfiguration;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;

@SpringBootConfiguration
@ImportAutoConfiguration({
KubernetesLoadBalancerAutoConfiguration.class,
})
public class TestApplication {}