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

jsonnet/telemeter: monitor memcached #280

Merged
merged 1 commit into from Dec 13, 2019
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
70 changes: 46 additions & 24 deletions jsonnet/telemeter/lib/list.libsonnet
Expand Up @@ -15,20 +15,20 @@
if object.kind == 'StatefulSet' then {
spec+: {
template+: {
spec+: {
spec+: {
containers: [
if c.name == containerName then
c {
resources: {
requests: {
cpu: "${" + std.asciiUpper(varContainerName) + "_CPU_REQUEST}",
memory: "${" + std.asciiUpper(varContainerName) + "_MEMORY_REQUEST}",
},
limits: {
cpu: "${" + std.asciiUpper(varContainerName) + "_CPU_LIMIT}",
memory: "${" + std.asciiUpper(varContainerName) + "_MEMORY_LIMIT}",
},
}
resources: {
requests: {
cpu: '${' + std.asciiUpper(varContainerName) + '_CPU_REQUEST}',
memory: '${' + std.asciiUpper(varContainerName) + '_MEMORY_REQUEST}',
},
limits: {
cpu: '${' + std.asciiUpper(varContainerName) + '_CPU_LIMIT}',
memory: '${' + std.asciiUpper(varContainerName) + '_MEMORY_LIMIT}',
},
},
}
else c
for c in super.containers
Expand All @@ -43,10 +43,10 @@
for o in super.objects
],
parameters+: [
{ name: std.asciiUpper(varContainerName)+'_CPU_REQUEST', value: if std.objectHas(requests, 'cpu') then requests.cpu else "100m" },
{ name: std.asciiUpper(varContainerName)+'_CPU_LIMIT', value: if std.objectHas(limits, 'cpu') then limits.cpu else "1" },
{ name: std.asciiUpper(varContainerName)+'_MEMORY_REQUEST', value: if std.objectHas(requests, 'memory') then requests.memory else "500Mi" },
{ name: std.asciiUpper(varContainerName)+'_MEMORY_LIMIT', value: if std.objectHas(limits, 'memory') then limits.memory else "1Gi" },
{ name: std.asciiUpper(varContainerName) + '_CPU_REQUEST', value: if std.objectHas(requests, 'cpu') then requests.cpu else '100m' },
{ name: std.asciiUpper(varContainerName) + '_CPU_LIMIT', value: if std.objectHas(limits, 'cpu') then limits.cpu else '1' },
{ name: std.asciiUpper(varContainerName) + '_MEMORY_REQUEST', value: if std.objectHas(requests, 'memory') then requests.memory else '500Mi' },
{ name: std.asciiUpper(varContainerName) + '_MEMORY_LIMIT', value: if std.objectHas(limits, 'memory') then limits.memory else '1Gi' },
],
},

Expand Down Expand Up @@ -112,12 +112,12 @@
spec+: {
resources: {
requests: {
cpu: "${PROMETHEUS_CPU_REQUEST}",
memory: "${PROMETHEUS_MEMORY_REQUEST}"
cpu: '${PROMETHEUS_CPU_REQUEST}',
memory: '${PROMETHEUS_MEMORY_REQUEST}',
},
limits: {
cpu: "${PROMETHEUS_CPU_LIMIT}",
memory: "${PROMETHEUS_MEMORY_LIMIT}"
cpu: '${PROMETHEUS_CPU_LIMIT}',
memory: '${PROMETHEUS_MEMORY_LIMIT}',
},
},
},
Expand All @@ -128,10 +128,10 @@
for o in super.objects
],
parameters+: [
{ name: 'PROMETHEUS_CPU_REQUEST', value: if std.objectHas(requests, 'cpu') then requests.cpu else "0" },
{ name: 'PROMETHEUS_CPU_LIMIT', value: if std.objectHas(limits, 'cpu') then limits.cpu else "0" },
{ name: 'PROMETHEUS_MEMORY_REQUEST', value: if std.objectHas(requests, 'memory') then requests.memory else "0" },
{ name: 'PROMETHEUS_MEMORY_LIMIT', value: if std.objectHas(limits, 'memory') then limits.memory else "0" },
{ name: 'PROMETHEUS_CPU_REQUEST', value: if std.objectHas(requests, 'cpu') then requests.cpu else '0' },
{ name: 'PROMETHEUS_CPU_LIMIT', value: if std.objectHas(limits, 'cpu') then limits.cpu else '0' },
{ name: 'PROMETHEUS_MEMORY_REQUEST', value: if std.objectHas(requests, 'memory') then requests.memory else '0' },
{ name: 'PROMETHEUS_MEMORY_LIMIT', value: if std.objectHas(limits, 'memory') then limits.memory else '0' },
],
},

Expand Down Expand Up @@ -234,8 +234,30 @@
},
}
else {}),

local setMemcachedNamespace(object) =
if object.kind == 'StatefulSet' then {
spec+: {
template+: {
spec+: {
containers: [
c {
command: [
if std.startsWith(c, '--memcached=') then std.join('.', std.splitLimit(c, '.', 2)[:2] + ['${NAMESPACE}'] + [std.splitLimit(c, '.', 3)[3]]) else c
for c in super.command
],
}
for c in super.containers
if std.objectHas(c, 'command')
],
},
},
},
}
else {},

objects: [
o + setNamespace(o) + setSubjectNamespace(o) + setPermissions(o) + setServiceMonitorServerNameNamespace(o) + setClusterRoleRuleNamespace(o) + namespaceNonNamespacedObjects(o)
o + setNamespace(o) + setSubjectNamespace(o) + setPermissions(o) + setServiceMonitorServerNameNamespace(o) + setClusterRoleRuleNamespace(o) + namespaceNonNamespacedObjects(o) + setMemcachedNamespace(o)
for o in super.objects
],
parameters+: [
Expand Down
52 changes: 34 additions & 18 deletions jsonnet/telemeter/server.libsonnet
Expand Up @@ -3,26 +3,42 @@ local list = import 'lib/list.libsonnet';
(import 'server/kubernetes.libsonnet') + {
local ts = super.telemeterServer,
local m = super.memcached,
local tsList = list.asList('telemeter', ts, [])
+ list.withAuthorizeURL($._config)
+ list.withNamespace($._config)
+ list.withServerImage($._config)
+ list.withResourceRequestsAndLimits('telemeter-server', $._config.telemeterServer.resourceRequests, $._config.telemeterServer.resourceLimits),
local mList = list.asList('memcached', m, [
{
name: 'MEMCACHED_IMAGE',
value: m.images.memcached,
},
{
name: 'MEMCACHED_IMAGE_TAG',
value: m.tags.memcached,
},
{
name: 'MEMCACHED_EXPORTER_IMAGE',
value: m.images.exporter,
},
{
name: 'MEMCACHED_EXPORTER_IMAGE_TAG',
value: m.tags.exporter,
},
])
+ list.withResourceRequestsAndLimits('memcached', $.memcached.resourceRequests, $.memcached.resourceLimits)
+ list.withNamespace($._config),

telemeterServer+:: {
list: list.asList('telemeter', ts, [])
+ list.withAuthorizeURL($._config)
+ list.withNamespace($._config)
+ list.withServerImage($._config)
+ list.withResourceRequestsAndLimits('telemeter-server', $._config.telemeterServer.resourceRequests, $._config.telemeterServer.resourceLimits),
},
memcached+:: {
service+: {
metadata+: {
namespace: '${NAMESPACE}',
},
list: list.asList('telemeter', {}, []) + {
objects:
tsList.objects +
mList.objects,

parameters:
tsList.parameters +
mList.parameters,
},
list: list.asList('memcached', m, [
{
name: 'MEMCACHED_IMAGE',
value: m.image,
},
])
+ list.withNamespace($._config),
},
} + {
_config+:: {
Expand Down
81 changes: 69 additions & 12 deletions jsonnet/telemeter/server/kubernetes.libsonnet
Expand Up @@ -239,8 +239,27 @@ local clusterPort = 8082;
},

memcached+:: {
image:: 'docker.io/memcached:1.5.20-alpine',
images:: {
memcached: 'docker.io/memcached',
exporter: 'docker.io/prom/memcached-exporter',
},
tags:: {
memcached: '1.5.20-alpine',
exporter: 'v0.6.0',
},
replicas:: 3,
maxItemSize:: '1m',
memoryLimitMB:: 1024,
overprovisionFactor:: 1.2,
connectionLimit:: 1024,
resourceLimits:: {
cpu: '3',
memory: std.ceil($.memcached.memoryLimitMB * $.memcached.overprovisionFactor * 1.5) + 'Mi',
},
resourceRequests:: {
cpu: '500m',
memory: std.ceil(($.memcached.memoryLimitMB * $.memcached.overprovisionFactor) + 100) + 'Mi',
},

service:
local service = k.core.v1.service;
Expand All @@ -250,7 +269,8 @@ local clusterPort = 8082;
'memcached',
$.memcached.statefulSet.metadata.labels,
[
ports.newNamed('memcached', 11211, 11211),
ports.newNamed('client', 11211, 11211),
ports.newNamed('metrics', 9150, 9150),
]
) +
service.mixin.metadata.withNamespace($._config.namespace) +
Expand All @@ -259,20 +279,30 @@ local clusterPort = 8082;

statefulSet:
local sts = k.apps.v1beta2.statefulSet;
local volume = sts.mixin.spec.template.spec.volumesType;
local container = sts.mixin.spec.template.spec.containersType;
local containerEnv = container.envType;
local containerVolumeMount = container.volumeMountsType;
local container = k.apps.v1beta2.statefulSet.mixin.spec.template.spec.containersType;
local containerPort = container.portsType;

local c =
container.new($.memcached.statefulSet.metadata.name, $.memcached.image) +
container.withPorts([
{ name: 'memcached', containerPort: $.memcached.service.spec.ports[0].port },
container.new('memcached', $.memcached.images.memcached) +
container.withPorts([containerPort.newNamed($.memcached.service.spec.ports[0].name, $.memcached.service.spec.ports[0].port)]) +
container.withArgs([
'-m %(memoryLimitMB)s' % self,
'-I %(maxItemSize)s' % self,
'-c %(connectionLimit)s' % self,
'-v',
]) +
container.mixin.resources.withRequests({ cpu: '100m', memory: '512Mi' }) +
container.mixin.resources.withLimits({ cpu: '1', memory: '1Gi' });
container.mixin.resources.withLimitsMixin($.memcached.resourceLimits) +
container.mixin.resources.withRequestsMixin($.memcached.resourceRequests);

local exporter =
container.new('exporter', $.memcached.images.exporter) +
container.withPorts([containerPort.newNamed($.memcached.service.spec.ports[1].name, $.memcached.service.spec.ports[1].port)]) +
container.withArgs([
'--memcached.address=localhost:%d' % $.memcached.service.spec.ports[0].port,
'--web.listen-address=0.0.0.0:%d' % $.memcached.service.spec.ports[1].port,
]);

sts.new('memcached', $.memcached.replicas, c, [], $.memcached.statefulSet.metadata.labels) +
sts.new('memcached', $.memcached.replicas, [c, exporter], [], $.memcached.statefulSet.metadata.labels) +
sts.mixin.metadata.withNamespace($._config.namespace) +
sts.mixin.metadata.withLabels({ 'app.kubernetes.io/name': $.memcached.statefulSet.metadata.name }) +
sts.mixin.spec.withServiceName($.memcached.service.metadata.name) +
Expand All @@ -282,5 +312,32 @@ local clusterPort = 8082;
volumeClaimTemplates:: null,
},
},

serviceMonitor:
{
apiVersion: 'monitoring.coreos.com/v1',
kind: 'ServiceMonitor',
metadata: {
name: 'memcached',
namespace: $._config.namespace,
labels: {
'app.kubernetes.io/name': $.memcached.statefulSet.metadata.name,
},
},
spec: {
jobLabel: 'app.kubernetes.io/name',
selector: {
matchLabels: {
'app.kubernetes.io/name': $.memcached.statefulSet.metadata.name,
},
},
endpoints: [
{
interval: '30s',
port: $.memcached.service.spec.ports[1].name,
},
],
},
},
},
}