119 lines
5.0 KiB
Plaintext
119 lines
5.0 KiB
Plaintext
local k = import 'ksonnet/ksonnet.beta.4/k.libsonnet';
|
|
|
|
{
|
|
_config+:: {
|
|
versions+:: {
|
|
clusterVerticalAutoscaler: "v0.8.1"
|
|
},
|
|
|
|
imageRepos+:: {
|
|
clusterVerticalAutoscaler: 'gcr.io/google_containers/cpvpa-amd64'
|
|
},
|
|
|
|
kubeStateMetrics+:: {
|
|
stepCPU: '1m',
|
|
stepMemory: '2Mi',
|
|
},
|
|
},
|
|
ksmAutoscaler+:: {
|
|
clusterRole:
|
|
local clusterRole = k.rbac.v1.clusterRole;
|
|
local rulesType = clusterRole.rulesType;
|
|
|
|
local rules = [
|
|
rulesType.new() +
|
|
rulesType.withApiGroups(['']) +
|
|
rulesType.withResources([
|
|
'nodes',
|
|
]) +
|
|
rulesType.withVerbs(['list', 'watch']),
|
|
];
|
|
|
|
clusterRole.new() +
|
|
clusterRole.mixin.metadata.withName('ksm-autoscaler') +
|
|
clusterRole.withRules(rules),
|
|
|
|
clusterRoleBinding:
|
|
local clusterRoleBinding = k.rbac.v1.clusterRoleBinding;
|
|
|
|
clusterRoleBinding.new() +
|
|
clusterRoleBinding.mixin.metadata.withName('ksm-autoscaler') +
|
|
clusterRoleBinding.mixin.roleRef.withApiGroup('rbac.authorization.k8s.io') +
|
|
clusterRoleBinding.mixin.roleRef.withName('ksm-autoscaler') +
|
|
clusterRoleBinding.mixin.roleRef.mixinInstance({ kind: 'ClusterRole' }) +
|
|
clusterRoleBinding.withSubjects([{ kind: 'ServiceAccount', name: 'ksm-autoscaler', namespace: $._config.namespace }]),
|
|
|
|
roleBinding:
|
|
local roleBinding = k.rbac.v1.roleBinding;
|
|
|
|
roleBinding.new() +
|
|
roleBinding.mixin.metadata.withName('ksm-autoscaler') +
|
|
roleBinding.mixin.metadata.withNamespace($._config.namespace) +
|
|
roleBinding.mixin.roleRef.withApiGroup('rbac.authorization.k8s.io') +
|
|
roleBinding.mixin.roleRef.withName('ksm-autoscaler') +
|
|
roleBinding.mixin.roleRef.mixinInstance({ kind: 'Role' }) +
|
|
roleBinding.withSubjects([{ kind: 'ServiceAccount', name: 'ksm-autoscaler' }]),
|
|
|
|
role:
|
|
local role = k.rbac.v1.role;
|
|
local rulesType = role.rulesType;
|
|
|
|
local extensionsRule = rulesType.new() +
|
|
rulesType.withApiGroups(['extensions']) +
|
|
rulesType.withResources([
|
|
'deployments',
|
|
]) +
|
|
rulesType.withVerbs(['patch']) +
|
|
rulesType.withResourceNames(['kube-state-metrics']);
|
|
|
|
local appsRule = rulesType.new() +
|
|
rulesType.withApiGroups(['apps']) +
|
|
rulesType.withResources([
|
|
'deployments',
|
|
]) +
|
|
rulesType.withVerbs(['patch']) +
|
|
rulesType.withResourceNames(['kube-state-metrics']);
|
|
|
|
local rules = [extensionsRule, appsRule];
|
|
|
|
role.new() +
|
|
role.mixin.metadata.withName('ksm-autoscaler') +
|
|
role.mixin.metadata.withNamespace($._config.namespace) +
|
|
role.withRules(rules),
|
|
|
|
serviceAccount:
|
|
local serviceAccount = k.core.v1.serviceAccount;
|
|
|
|
serviceAccount.new('ksm-autoscaler') +
|
|
serviceAccount.mixin.metadata.withNamespace($._config.namespace),
|
|
deployment:
|
|
local deployment = k.apps.v1.deployment;
|
|
local container = deployment.mixin.spec.template.spec.containersType;
|
|
local podSelector = deployment.mixin.spec.template.spec.selectorType;
|
|
local podLabels = { app: 'ksm-autoscaler' };
|
|
|
|
local kubeStateMetricsAutoscaler =
|
|
container.new('ksm-autoscaler', $._config.imageRepos.clusterVerticalAutoscaler + ':' + $._config.versions.clusterVerticalAutoscaler) +
|
|
container.withArgs([
|
|
'/cpvpa',
|
|
'--target=deployment/kube-state-metrics',
|
|
'--namespace=' + $._config.namespace,
|
|
'--logtostderr=true',
|
|
'--poll-period-seconds=10',
|
|
'--default-config={"kube-state-metrics":{"requests":{"cpu":{"base":"' + $._config.kubeStateMetrics.baseCPU + '","step":"' + $._config.kubeStateMetrics.stepCPU + '","nodesPerStep":1},"memory":{"base":"' + $._config.kubeStateMetrics.baseMemory + '","step":"' + $._config.kubeStateMetrics.stepMemory + '","nodesPerStep":1}},"limits":{"cpu":{"base":"' + $._config.kubeStateMetrics.baseCPU + '","step":"' + $._config.kubeStateMetrics.stepCPU + '","nodesPerStep":1},"memory":{"base":"' + $._config.kubeStateMetrics.baseMemory + '","step":"' + $._config.kubeStateMetrics.stepMemory + '","nodesPerStep":1}}}}'
|
|
]) +
|
|
container.mixin.resources.withRequests({cpu: '20m', memory: '10Mi'});
|
|
|
|
local c = [kubeStateMetricsAutoscaler];
|
|
|
|
deployment.new('ksm-autoscaler', 1, c, podLabels) +
|
|
deployment.mixin.metadata.withNamespace($._config.namespace) +
|
|
deployment.mixin.metadata.withLabels(podLabels) +
|
|
deployment.mixin.spec.selector.withMatchLabels(podLabels) +
|
|
deployment.mixin.spec.template.spec.withNodeSelector({ 'kubernetes.io/os': 'linux' }) +
|
|
deployment.mixin.spec.template.spec.securityContext.withRunAsNonRoot(true) +
|
|
deployment.mixin.spec.template.spec.securityContext.withRunAsUser(65534) +
|
|
deployment.mixin.spec.template.spec.withServiceAccountName('ksm-autoscaler'),
|
|
},
|
|
}
|