-
Notifications
You must be signed in to change notification settings - Fork 1.3k
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
Cruise Control deployment #2773
Changes from 19 commits
940f6c8
f4efd00
3fecbc8
d7653b1
7717398
488cc11
a5cb50f
0f9c7e9
d9cb6da
89390d1
3a90c65
42ee716
955b9a0
3dde8bf
c0150bf
857ccbd
309aeec
5345da7
91ac7f2
ee9b1a2
2bc4a05
38fb0cf
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
/* | ||
* Copyright Strimzi authors. | ||
* License: Apache License 2.0 (see the file LICENSE or http://apache.org/licenses/LICENSE-2.0.html). | ||
*/ | ||
package io.strimzi.api.kafka.model; | ||
|
||
/** | ||
* Encapsulates the naming scheme used for the resources which the Cluster Operator manages for a | ||
* {@code CruiseControl} cluster. | ||
*/ | ||
public class CruiseControlResources { | ||
|
||
/** | ||
* Returns the name of the Cruise Control {@code Deployment} for a {@code Kafka} cluster of the given name. | ||
* @param clusterName The {@code metadata.name} of the {@code Kafka} resource. | ||
* @return The name of the corresponding Cruise Control {@code Deployment}. | ||
*/ | ||
public static String deploymentName(String clusterName) { | ||
return clusterName + "-cruise-control"; | ||
} | ||
|
||
/** | ||
* Returns the name of the Cruise Control {@code ServiceAccount} for a {@code Kafka} cluster of the given name. | ||
* @param clusterName The {@code metadata.name} of the {@code Kafka} resource. | ||
* @return The name of the corresponding Cruise Control {@code ServiceAccount}. | ||
*/ | ||
public static String serviceAccountName(String clusterName) { | ||
return deploymentName(clusterName); | ||
} | ||
|
||
/** | ||
* Returns the name of the Cruise Control {@code Service} for a {@code Kafka} cluster of the given name. | ||
* @param clusterName The {@code metadata.name} of the {@code Kafka} resource. | ||
* @return The name of the corresponding Cruise Control {@code Service}. | ||
*/ | ||
public static String serviceName(String clusterName) { | ||
return deploymentName(clusterName); | ||
} | ||
|
||
/** | ||
* Returns the name of the Cruise Control {@code Secret} for a {@code Kafka} cluster of the given name. | ||
* This {@code Secret} will only exist if {@code Kafka.spec.cruiseControl} is configured in the | ||
* {@code Kafka} resource with the given name. | ||
* | ||
* @param clusterName The {@code metadata.name} of the {@code Kafka} resource. | ||
* @return The name of the corresponding Cruise Control {@code Secret}. | ||
*/ | ||
public static String secretName(String clusterName) { | ||
return deploymentName(clusterName) + "-certs"; | ||
} | ||
|
||
/** | ||
* Returns the name of the Cruise Control log {@code ConfigMap} for a {@code Kafka} cluster of the given name. | ||
* @param clusterName The {@code metadata.name} of the {@code Kafka} resource. | ||
* @return The name of the corresponding Cruise Control log {@code ConfigMap}. | ||
*/ | ||
public static String logAndMetricsConfigMapName(String clusterName) { | ||
return clusterName + "-cruise-control-config"; | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,164 @@ | ||
/* | ||
* Copyright Strimzi authors. | ||
* License: Apache License 2.0 (see the file LICENSE or http://apache.org/licenses/LICENSE-2.0.html). | ||
*/ | ||
package io.strimzi.api.kafka.model; | ||
|
||
import com.fasterxml.jackson.annotation.JsonInclude; | ||
import com.fasterxml.jackson.annotation.JsonPropertyOrder; | ||
import io.fabric8.kubernetes.api.model.ResourceRequirements; | ||
import io.strimzi.api.kafka.model.balancing.BrokerCapacity; | ||
import io.strimzi.api.kafka.model.template.CruiseControlTemplate; | ||
import io.strimzi.crdgenerator.annotations.Description; | ||
import io.sundr.builder.annotations.Buildable; | ||
import java.io.Serializable; | ||
import java.util.HashMap; | ||
import java.util.Map; | ||
import lombok.EqualsAndHashCode; | ||
|
||
@Buildable( | ||
editableEnabled = false, | ||
generateBuilderPackage = false, | ||
builderPackage = "io.fabric8.kubernetes.api.builder" | ||
) | ||
@JsonInclude(JsonInclude.Include.NON_NULL) | ||
@JsonPropertyOrder({ | ||
"replicas", "image", "config", | ||
"livenessProbe", "readinessProbe", | ||
"jvmOptions", "resources", | ||
"logging", "tlsSidecar", "template", "brokerCapacity"}) | ||
@EqualsAndHashCode | ||
public class CruiseControlSpec implements UnknownPropertyPreserving, Serializable { | ||
private static final long serialVersionUID = 1L; | ||
|
||
// For the full configuration list refer to https://github.com/linkedin/cruise-control/wiki/Configurations | ||
public static final String FORBIDDEN_PREFIXES = "bootstrap.servers, client.id, zookeeper., network., security., failed.brokers.zk.path," | ||
+ "webserver.http., webserver.api.urlprefix, webserver.session.path, webserver.accesslog., two.step., request.reason.required," | ||
+ "metric.reporter.sampler.bootstrap.servers, metric.reporter.topic, partition.metric.sample.store.topic, broker.metric.sample.store.topic," | ||
+ "capacity.config.file, self.healing., ssl."; | ||
public static final String FORBIDDEN_PREFIX_EXCEPTIONS = "ssl.cipher.suites, ssl.protocol, ssl.enabled.protocols"; | ||
|
||
private String image; | ||
private TlsSidecar tlsSidecar; | ||
private ResourceRequirements resources; | ||
private Probe livenessProbe; | ||
private Probe readinessProbe; | ||
private JvmOptions jvmOptions; | ||
private Logging logging; | ||
private CruiseControlTemplate template; | ||
private BrokerCapacity brokerCapacity; | ||
private Map<String, Object> config = new HashMap<>(0); | ||
private Map<String, Object> additionalProperties = new HashMap<>(0); | ||
|
||
@Description("The docker image for the pods.") | ||
@JsonInclude(JsonInclude.Include.NON_DEFAULT) | ||
public String getImage() { | ||
return image; | ||
} | ||
|
||
public void setImage(String image) { | ||
this.image = image; | ||
} | ||
|
||
@Description("TLS sidecar configuration") | ||
@JsonInclude(JsonInclude.Include.NON_NULL) | ||
public TlsSidecar getTlsSidecar() { | ||
return tlsSidecar; | ||
} | ||
|
||
public void setTlsSidecar(TlsSidecar tlsSidecar) { | ||
this.tlsSidecar = tlsSidecar; | ||
} | ||
|
||
@Description("The Cruise Control `brokerCapacity` configuration.") | ||
@JsonInclude(JsonInclude.Include.NON_NULL) | ||
public BrokerCapacity getBrokerCapacity() { | ||
return brokerCapacity; | ||
} | ||
|
||
public void setBrokerCapacity(BrokerCapacity brokerCapacity) { | ||
this.brokerCapacity = brokerCapacity; | ||
} | ||
|
||
@Description("The Cruise Control configuration. For a full list of configuration options refer to" + | ||
" https://github.com/linkedin/cruise-control/wiki/Configurations. Note that properties " + | ||
"with the following prefixes cannot be set: " + FORBIDDEN_PREFIXES) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You'll need to add the exception if they're non-empty. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Not sure I understand, like add an exception if a user tries to use a configuration property that is forbidden? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I meant that if you accept that the cipher suites and protocols are exceptions to the forbidden prefixes (as I mentioned elsewhere) you need to mention that here. |
||
@JsonInclude(JsonInclude.Include.NON_EMPTY) | ||
public Map<String, Object> getConfig() { | ||
return config; | ||
} | ||
|
||
public void setConfig(Map<String, Object> config) { | ||
this.config = config; | ||
} | ||
|
||
@Description("Logging configuration (log4j1) for Cruise Control.") | ||
@JsonInclude(value = JsonInclude.Include.NON_NULL) | ||
public Logging getLogging() { | ||
return logging; | ||
} | ||
|
||
public void setLogging(Logging logging) { | ||
this.logging = logging; | ||
} | ||
|
||
@JsonInclude(JsonInclude.Include.NON_EMPTY) | ||
@Description("JVM Options for the Cruise Control container") | ||
public JvmOptions getJvmOptions() { | ||
return jvmOptions; | ||
} | ||
|
||
public void setJvmOptions(JvmOptions jvmOptions) { | ||
this.jvmOptions = jvmOptions; | ||
} | ||
|
||
@JsonInclude(JsonInclude.Include.NON_NULL) | ||
@Description("CPU and memory resources to reserve for the Cruise Control container") | ||
public ResourceRequirements getResources() { | ||
return resources; | ||
} | ||
|
||
public void setResources(ResourceRequirements resources) { | ||
this.resources = resources; | ||
} | ||
|
||
@JsonInclude(JsonInclude.Include.NON_EMPTY) | ||
@Description("Pod liveness checking for the Cruise Control container") | ||
public Probe getLivenessProbe() { | ||
return livenessProbe; | ||
} | ||
|
||
public void setLivenessProbe(Probe livenessProbe) { | ||
this.livenessProbe = livenessProbe; | ||
} | ||
|
||
@JsonInclude(JsonInclude.Include.NON_DEFAULT) | ||
@Description("Pod readiness checking for the Cruise Control container.") | ||
public Probe getReadinessProbe() { | ||
return readinessProbe; | ||
} | ||
|
||
public void setReadinessProbe(Probe readinessProbe) { | ||
this.readinessProbe = readinessProbe; | ||
} | ||
|
||
@Description("Template to specify how Cruise Control resources, `Deployments` and `Pods`, are generated.") | ||
@JsonInclude(JsonInclude.Include.NON_EMPTY) | ||
public CruiseControlTemplate getTemplate() { | ||
return template; | ||
} | ||
|
||
public void setTemplate(CruiseControlTemplate template) { | ||
this.template = template; | ||
} | ||
|
||
@Override | ||
public Map<String, Object> getAdditionalProperties() { | ||
return this.additionalProperties; | ||
} | ||
|
||
@Override | ||
public void setAdditionalProperty(String name, Object value) { | ||
this.additionalProperties.put(name, value); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
/* | ||
* Copyright Strimzi authors. | ||
* License: Apache License 2.0 (see the file LICENSE or http://apache.org/licenses/LICENSE-2.0.html). | ||
*/ | ||
package io.strimzi.api.kafka.model.balancing; | ||
|
||
import com.fasterxml.jackson.annotation.JsonInclude; | ||
import com.fasterxml.jackson.annotation.JsonPropertyOrder; | ||
import io.strimzi.api.kafka.model.UnknownPropertyPreserving; | ||
import io.strimzi.crdgenerator.annotations.Description; | ||
import io.strimzi.crdgenerator.annotations.Maximum; | ||
import io.strimzi.crdgenerator.annotations.Minimum; | ||
import io.strimzi.crdgenerator.annotations.Pattern; | ||
import io.sundr.builder.annotations.Buildable; | ||
import lombok.EqualsAndHashCode; | ||
|
||
import java.io.Serializable; | ||
import java.util.HashMap; | ||
import java.util.Map; | ||
|
||
/** | ||
* Representation of the Cruise Control broker capacity settings. Since the Kafka brokers | ||
* in Strimzi are homogeneous, the capacity values for each resource will be | ||
* used for every broker. | ||
*/ | ||
@Buildable( | ||
editableEnabled = false, | ||
generateBuilderPackage = false, | ||
builderPackage = "io.fabric8.kubernetes.api.builder" | ||
) | ||
@JsonInclude(JsonInclude.Include.NON_NULL) | ||
@JsonPropertyOrder({"disk", "cpuUtilization", "inboundNetwork", "outboundNetwork"}) | ||
@EqualsAndHashCode | ||
public class BrokerCapacity implements UnknownPropertyPreserving, Serializable { | ||
|
||
private static final long serialVersionUID = 1L; | ||
|
||
private String disk; | ||
private Integer cpuUtilization; | ||
private String inboundNetwork; | ||
private String outboundNetwork; | ||
private Map<String, Object> additionalProperties = new HashMap<>(0); | ||
|
||
@JsonInclude(JsonInclude.Include.NON_DEFAULT) | ||
@Pattern("^[0-9]+([.][0-9]*)?([KMGTPE]i?|e[0-9]+)?$") | ||
@Description("Broker capacity for disk in bytes, for example, 100Gi.") | ||
public String getDisk() { | ||
return disk; | ||
} | ||
|
||
public void setDisk(String disk) { | ||
this.disk = disk; | ||
} | ||
|
||
@Minimum(0) | ||
@Maximum(100) | ||
@JsonInclude(JsonInclude.Include.NON_NULL) | ||
@Description("Broker capacity for CPU resource utilization as a percentage (0 - 100).") | ||
public Integer getCpuUtilization() { | ||
return cpuUtilization; | ||
} | ||
|
||
public void setCpuUtilization(Integer cpuUtilization) { | ||
this.cpuUtilization = cpuUtilization; | ||
} | ||
|
||
@JsonInclude(JsonInclude.Include.NON_NULL) | ||
@Pattern("[0-9]+([KMG]i?)?B/s") | ||
@Description("Broker capacity for inbound network throughput in bytes per second, for example, 10000KB/s") | ||
public String getInboundNetwork() { | ||
return inboundNetwork; | ||
} | ||
|
||
public void setInboundNetwork(String inboundNetwork) { | ||
this.inboundNetwork = inboundNetwork; | ||
} | ||
|
||
@JsonInclude(JsonInclude.Include.NON_NULL) | ||
@Pattern("[0-9]+([KMG]i?)?B/s") | ||
@Description("Broker capacity for outbound network throughput in bytes per second, for example 10000KB/s") | ||
public String getOutboundNetwork() { | ||
return outboundNetwork; | ||
} | ||
|
||
public void setOutboundNetwork(String outboundNetwork) { | ||
this.outboundNetwork = outboundNetwork; | ||
} | ||
|
||
@Override | ||
public Map<String, Object> getAdditionalProperties() { | ||
return this.additionalProperties; | ||
} | ||
|
||
@Override | ||
public void setAdditionalProperty(String name, Object value) { | ||
this.additionalProperties.put(name, value); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think you could remove the
replicas
from here.