diff --git a/examples/cassandra/README.md b/examples/cassandra/README.md index 19495b21908..0277e13bb8b 100644 --- a/examples/cassandra/README.md +++ b/examples/cassandra/README.md @@ -44,6 +44,10 @@ spec: value: 512M - name: HEAP_NEWSIZE value: 100M + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace volumes: - name: data emptyDir: {} @@ -51,7 +55,7 @@ spec: There are a few things to note in this description. First is that we are running the ```kubernetes/cassandra``` image. This is a standard Cassandra installation on top of Debian. However it also adds a custom [```SeedProvider```](https://svn.apache.org/repos/asf/cassandra/trunk/src/java/org/apache/cassandra/locator/SeedProvider.java) to Cassandra. In Cassandra, a ```SeedProvider``` bootstraps the gossip protocol that Cassandra uses to find other nodes. The ```KubernetesSeedProvider``` discovers the Kubernetes API Server using the built in Kubernetes discovery service, and then uses the Kubernetes API to find new nodes (more on this later) -You may also note that we are setting some Cassandra parameters (```MAX_HEAP_SIZE``` and ```HEAP_NEWSIZE```). We also tell Kubernetes that the container exposes both the ```CQL``` and ```Thrift``` API ports. Finally, we tell the cluster manager that we need 0.5 cpu (0.5 core). +You may also note that we are setting some Cassandra parameters (```MAX_HEAP_SIZE``` and ```HEAP_NEWSIZE```) and adding information about the [namespace](https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/namespaces.md). We also tell Kubernetes that the container exposes both the ```CQL``` and ```Thrift``` API ports. Finally, we tell the cluster manager that we need 0.5 cpu (0.5 core). Given this configuration, we can create the pod from a file specification as follows @@ -157,6 +161,10 @@ spec: value: 512M - name: HEAP_NEWSIZE value: 100M + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace image: gcr.io/google_containers/cassandra:v4 name: cassandra ports: diff --git a/examples/cassandra/cassandra-controller.yaml b/examples/cassandra/cassandra-controller.yaml index 1fcfa65dbc8..6b11a7604ca 100644 --- a/examples/cassandra/cassandra-controller.yaml +++ b/examples/cassandra/cassandra-controller.yaml @@ -24,6 +24,10 @@ spec: value: 512M - name: HEAP_NEWSIZE value: 100M + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace image: gcr.io/google_containers/cassandra:v4 name: cassandra ports: diff --git a/examples/cassandra/cassandra.yaml b/examples/cassandra/cassandra.yaml index 6358a19bae1..52d0e9ff796 100644 --- a/examples/cassandra/cassandra.yaml +++ b/examples/cassandra/cassandra.yaml @@ -26,6 +26,10 @@ spec: value: 512M - name: HEAP_NEWSIZE value: 100M + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace volumes: - name: data emptyDir: {} diff --git a/examples/cassandra/image/kubernetes-cassandra.jar b/examples/cassandra/image/kubernetes-cassandra.jar index ba63d544fb2..09e1aa203cf 100644 Binary files a/examples/cassandra/image/kubernetes-cassandra.jar and b/examples/cassandra/image/kubernetes-cassandra.jar differ diff --git a/examples/cassandra/java/src/io/k8s/cassandra/KubernetesSeedProvider.java b/examples/cassandra/java/src/io/k8s/cassandra/KubernetesSeedProvider.java index 209b3f64888..0d1dd924d88 100644 --- a/examples/cassandra/java/src/io/k8s/cassandra/KubernetesSeedProvider.java +++ b/examples/cassandra/java/src/io/k8s/cassandra/KubernetesSeedProvider.java @@ -35,7 +35,7 @@ public class KubernetesSeedProvider implements SeedProvider { @JsonIgnoreProperties(ignoreUnknown = true) static class Address { - public String IP; + public String ip; } @JsonIgnoreProperties(ignoreUnknown = true) @@ -102,7 +102,8 @@ public class KubernetesSeedProvider implements SeedProvider { List list = new ArrayList(); String host = "https://kubernetes.default.cluster.local"; String serviceName = getEnvOrDefault("CASSANDRA_SERVICE", "cassandra"); - String path = "/api/v1/namespaces/default/endpoints/"; + String podNamespace = getEnvOrDefault("POD_NAMESPACE", "default"); + String path = String.format("/api/v1/namespaces/%s/endpoints/", podNamespace); try { String token = getServiceAccountToken(); @@ -110,6 +111,7 @@ public class KubernetesSeedProvider implements SeedProvider { ctx.init(null, trustAll, new SecureRandom()); URL url = new URL(host + path + serviceName); + logger.info("Getting endpoints from " + url); HttpsURLConnection conn = (HttpsURLConnection)url.openConnection(); // TODO: Remove this once the CA cert is propogated everywhere, and replace @@ -125,11 +127,14 @@ public class KubernetesSeedProvider implements SeedProvider { if (endpoints.subsets != null && !endpoints.subsets.isEmpty()){ for (Subset subset : endpoints.subsets) { for (Address address : subset.addresses) { - list.add(InetAddress.getByName(address.IP)); + list.add(InetAddress.getByName(address.ip)); } } } - } + logger.info("Available endpoints: " + list); + } else { + logger.warn("Endpoints are not available"); + } } catch (IOException | NoSuchAlgorithmException | KeyManagementException ex) { logger.warn("Request to kubernetes apiserver failed", ex); }