Add minimal PetSets support
We need to run multiple memcached instances for scale and performance and the best approach for doing it is to support PetSets. Change-Id: I42c9f82508ed7f42df01b467f45531b67b52b054
This commit is contained in:
parent
dbe589144e
commit
6145a0078d
@ -85,7 +85,8 @@ service
|
|||||||
+---------------+-----------------------------------------------+----------+------------------+------------+
|
+---------------+-----------------------------------------------+----------+------------------+------------+
|
||||||
| kind | Kind of k8s object to use for containers | false | one of: | Deployment |
|
| kind | Kind of k8s object to use for containers | false | one of: | Deployment |
|
||||||
| | deployment | | ["Deployment", | |
|
| | deployment | | ["Deployment", | |
|
||||||
| | | | "Daemonset"] | |
|
| | | | "Daemonset", | |
|
||||||
|
| | | | "PetSet"] | |
|
||||||
+---------------+-----------------------------------------------+----------+------------------+------------+
|
+---------------+-----------------------------------------------+----------+------------------+------------+
|
||||||
| containers | List of containers under multi-container pod | true | container_ array | |
|
| containers | List of containers under multi-container pod | true | container_ array | |
|
||||||
+---------------+-----------------------------------------------+----------+------------------+------------+
|
+---------------+-----------------------------------------------+----------+------------------+------------+
|
||||||
|
@ -95,6 +95,9 @@ def get_deployed_components():
|
|||||||
"""Returns set of deployed components."""
|
"""Returns set of deployed components."""
|
||||||
deployed_daemonsets = kubernetes.list_cluster_daemonsets()
|
deployed_daemonsets = kubernetes.list_cluster_daemonsets()
|
||||||
deployed_deployments = kubernetes.list_cluster_deployments()
|
deployed_deployments = kubernetes.list_cluster_deployments()
|
||||||
|
deployed_petsets = kubernetes.list_cluster_petsets()
|
||||||
deployed_components = set(kubernetes.get_object_names(
|
deployed_components = set(kubernetes.get_object_names(
|
||||||
itertools.chain(deployed_daemonsets, deployed_deployments)))
|
itertools.chain(deployed_daemonsets, deployed_deployments,
|
||||||
|
deployed_petsets))
|
||||||
|
)
|
||||||
return deployed_components
|
return deployed_components
|
||||||
|
@ -109,6 +109,10 @@ def parse_role(component, topology, configmaps):
|
|||||||
|
|
||||||
obj = templates.serialize_daemonset(service_name, cont_spec,
|
obj = templates.serialize_daemonset(service_name, cont_spec,
|
||||||
affinity, component_name)
|
affinity, component_name)
|
||||||
|
elif service.get("kind") == "PetSet":
|
||||||
|
replicas = replicas or 1
|
||||||
|
obj = templates.serialize_petset(service_name, cont_spec,
|
||||||
|
affinity, replicas, component_name)
|
||||||
else:
|
else:
|
||||||
replicas = replicas or 1
|
replicas = replicas or 1
|
||||||
obj = templates.serialize_deployment(service_name, cont_spec,
|
obj = templates.serialize_deployment(service_name, cont_spec,
|
||||||
@ -179,7 +183,8 @@ def _process_ports(service):
|
|||||||
if ingress_host:
|
if ingress_host:
|
||||||
ingress_rules.append(templates.serialize_ingress_rule(
|
ingress_rules.append(templates.serialize_ingress_rule(
|
||||||
service["name"], ingress_host, source_port))
|
service["name"], ingress_host, source_port))
|
||||||
service_template = templates.serialize_service(service["name"], ports)
|
service_template = templates.serialize_service(
|
||||||
|
service["name"], ports, service.get("kind") == "PetSet")
|
||||||
kubernetes.process_object(service_template)
|
kubernetes.process_object(service_template)
|
||||||
|
|
||||||
if ingress_rules:
|
if ingress_rules:
|
||||||
|
@ -161,6 +161,13 @@ def list_cluster_services():
|
|||||||
selector="ccp=true")
|
selector="ccp=true")
|
||||||
|
|
||||||
|
|
||||||
|
def list_cluster_petsets():
|
||||||
|
client = get_client()
|
||||||
|
return pykube.PetSet.objects(client).filter(
|
||||||
|
namespace=CONF.kubernetes.namespace,
|
||||||
|
selector="ccp=true")
|
||||||
|
|
||||||
|
|
||||||
def get_object_names(items):
|
def get_object_names(items):
|
||||||
names = []
|
names = []
|
||||||
for item in items:
|
for item in items:
|
||||||
|
@ -340,6 +340,36 @@ def serialize_daemonset(name, spec, affinity, component_name):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def serialize_petset(name, spec, affinity, replicas, component_name):
|
||||||
|
annotations = {
|
||||||
|
"pod.alpha.kubernetes.io/initialized": "true"
|
||||||
|
}
|
||||||
|
annotations.update(affinity)
|
||||||
|
|
||||||
|
return {
|
||||||
|
"apiVersion": "apps/v1alpha1",
|
||||||
|
"kind": "PetSet",
|
||||||
|
"metadata": {
|
||||||
|
"name": name
|
||||||
|
},
|
||||||
|
"spec": {
|
||||||
|
"serviceName": name,
|
||||||
|
"replicas": replicas,
|
||||||
|
"template": {
|
||||||
|
"metadata": {
|
||||||
|
"annotations": annotations,
|
||||||
|
"labels": {
|
||||||
|
"ccp": "true",
|
||||||
|
"app": name,
|
||||||
|
"ccp-component": component_name
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"spec": spec
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def serialize_affinity(service, topology):
|
def serialize_affinity(service, topology):
|
||||||
policy = {
|
policy = {
|
||||||
"nodeAffinity": {
|
"nodeAffinity": {
|
||||||
@ -370,17 +400,19 @@ def serialize_affinity(service, topology):
|
|||||||
policy, sort_keys=True)}
|
policy, sort_keys=True)}
|
||||||
|
|
||||||
|
|
||||||
def serialize_service(name, ports):
|
def serialize_service(name, ports, headless=False):
|
||||||
ports_spec = []
|
ports_spec = []
|
||||||
for port in ports:
|
for port in ports:
|
||||||
spec_entry = {"protocol": "TCP",
|
spec_entry = {"port": port["port"],
|
||||||
"port": port["port"],
|
|
||||||
"targetPort": port["port"],
|
|
||||||
"name": port["name"]}
|
"name": port["name"]}
|
||||||
|
if not headless:
|
||||||
|
spec_entry.update({"protocol": "TCP",
|
||||||
|
"targetPort": port["port"]})
|
||||||
if port.get("node-port"):
|
if port.get("node-port"):
|
||||||
spec_entry.update({"nodePort": port["node-port"]})
|
spec_entry.update({"nodePort": port["node-port"]})
|
||||||
ports_spec.append(spec_entry)
|
ports_spec.append(spec_entry)
|
||||||
return {
|
|
||||||
|
obj = {
|
||||||
"apiVersion": "v1",
|
"apiVersion": "v1",
|
||||||
"kind": "Service",
|
"kind": "Service",
|
||||||
"metadata": {
|
"metadata": {
|
||||||
@ -390,7 +422,6 @@ def serialize_service(name, ports):
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"spec": {
|
"spec": {
|
||||||
"type": "NodePort",
|
|
||||||
"selector": {
|
"selector": {
|
||||||
"app": name
|
"app": name
|
||||||
},
|
},
|
||||||
@ -398,6 +429,13 @@ def serialize_service(name, ports):
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if not headless:
|
||||||
|
obj["spec"]["type"] = "NodePort"
|
||||||
|
else:
|
||||||
|
obj["spec"]["clusterIP"] = "None"
|
||||||
|
|
||||||
|
return obj
|
||||||
|
|
||||||
|
|
||||||
def serialize_ingress_rule(service, host, port):
|
def serialize_ingress_rule(service, host, port):
|
||||||
return {
|
return {
|
||||||
|
@ -183,7 +183,7 @@ SERVICE_SCHEMA = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"kind": {
|
"kind": {
|
||||||
"enum": ["Deployment", "DaemonSet"]
|
"enum": ["Deployment", "DaemonSet", "PetSet"]
|
||||||
},
|
},
|
||||||
"hostNetwork": {
|
"hostNetwork": {
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
|
Loading…
Reference in New Issue
Block a user