Skip to content

Commit 76233c1

Browse files
authored
Fixed memory leak and cert-manager extension switch (#10)
1 parent aaa0d0b commit 76233c1

File tree

7 files changed

+35
-28
lines changed

7 files changed

+35
-28
lines changed

ES.Kubernetes.Reflector.CertManager/CertificatesMonitor.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,17 @@ public class CertificatesMonitor : IHostedService,
1818
IRequestHandler<HealthCheckRequest<CertificatesMonitor>, bool>
1919
{
2020
private readonly BroadcastWatcher<Certificate, InternalCertificateWatcherEvent> _certificatesWatcher;
21-
private readonly IKubernetes _client;
2221
private readonly ILogger<CertificatesMonitor> _logger;
2322
private readonly BroadcastWatcher<V1Secret, InternalSecretWatcherEvent> _secretsWatcher;
2423
private string _certificateResourceDefinitionVersion;
2524

2625
public CertificatesMonitor(ILogger<CertificatesMonitor> logger,
2726
BroadcastWatcher<Certificate, InternalCertificateWatcherEvent> certificatesWatcher,
28-
BroadcastWatcher<V1Secret, InternalSecretWatcherEvent> secretsWatcher,
29-
IKubernetes client)
27+
BroadcastWatcher<V1Secret, InternalSecretWatcherEvent> secretsWatcher)
3028
{
3129
_logger = logger;
3230
_certificatesWatcher = certificatesWatcher;
3331
_secretsWatcher = secretsWatcher;
34-
_client = client;
35-
3632

3733
_secretsWatcher.OnBeforePublish = e =>
3834
e.CertificateResourceDefinitionVersion = _certificateResourceDefinitionVersion;

ES.Kubernetes.Reflector.Core/CoreModule.cs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1-
using Autofac;
1+
using System;
2+
using Autofac;
23
using ES.Kubernetes.Reflector.Core.Monitoring;
34
using ES.Kubernetes.Reflector.Core.Monitors;
5+
using k8s;
6+
using Microsoft.Extensions.Logging;
47

58
namespace ES.Kubernetes.Reflector.Core
69
{
@@ -12,6 +15,21 @@ protected override void Load(ContainerBuilder builder)
1215
builder.RegisterGeneric(typeof(BroadcastWatcher<>));
1316

1417

18+
builder.Register(s =>
19+
{
20+
var logger = s.Resolve<ILogger<CoreModule>>();
21+
var inCluster = KubernetesClientConfiguration.IsInCluster();
22+
logger.LogDebug("Building client configuration. Client is in cluster: '{inCluster}'", inCluster);
23+
24+
return inCluster
25+
? KubernetesClientConfiguration.InClusterConfig()
26+
: KubernetesClientConfiguration.BuildConfigFromConfigFile();
27+
}).As<KubernetesClientConfiguration>().SingleInstance();
28+
29+
builder.Register(s => new k8s.Kubernetes(s.Resolve<KubernetesClientConfiguration>())
30+
{HttpClient = {Timeout = TimeSpan.FromMinutes(60)}}).As<k8s.Kubernetes>().As<IKubernetes>();
31+
32+
1533
builder.RegisterType<SecretsMonitor>().AsImplementedInterfaces().SingleInstance();
1634
builder.RegisterType<ConfigMapMonitor>().AsImplementedInterfaces().SingleInstance();
1735
builder.RegisterType<CustomResourceDefinitionsMonitor>().AsImplementedInterfaces().SingleInstance();

ES.Kubernetes.Reflector.Core/ES.Kubernetes.Reflector.Core.csproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@
1111
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="2.2.0" />
1212
<PackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions" Version="2.2.0" />
1313
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="2.2.0" />
14+
<PackageReference Include="Microsoft.Extensions.Options" Version="2.2.0" />
15+
</ItemGroup>
16+
17+
<ItemGroup>
18+
<Folder Include="Client\" />
1419
</ItemGroup>
1520

1621
</Project>

ES.Kubernetes.Reflector/ES.Kubernetes.Reflector.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
<TargetFramework>netcoreapp2.2</TargetFramework>
55
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
66
<RuntimeIdentifiers>linux-x64;linux-musl-x64;linux-arm</RuntimeIdentifiers>
7+
<ServerGarbageCollection>false</ServerGarbageCollection>
78
</PropertyGroup>
89

910
<ItemGroup>

ES.Kubernetes.Reflector/Startup.cs

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
using System;
2-
using System.Reflection;
1+
using System.Reflection;
32
using Autofac;
43
using ES.Kubernetes.Reflector.CertManager;
54
using ES.Kubernetes.Reflector.ConfigMaps;
65
using ES.Kubernetes.Reflector.Core;
76
using ES.Kubernetes.Reflector.Secrets;
8-
using k8s;
97
using MediatR;
108
using Microsoft.AspNetCore.Builder;
119
using Microsoft.AspNetCore.Hosting;
@@ -19,8 +17,11 @@ namespace ES.Kubernetes.Reflector
1917
{
2018
public class Startup
2119
{
22-
public Startup(IConfiguration configuration)
20+
private readonly ILogger<Startup> _logger;
21+
22+
public Startup(IConfiguration configuration, ILogger<Startup> logger)
2323
{
24+
_logger = logger;
2425
Configuration = configuration;
2526
}
2627

@@ -36,21 +37,6 @@ public void ConfigureServices(IServiceCollection services)
3637
services.AddHealthChecks()
3738
.AddCheck<CoreHealthCheck>("Core")
3839
.AddCheck<CertManagerHealthCheck>("Extensions.CertManager");
39-
40-
services.AddSingleton(s =>
41-
{
42-
var logger = s.GetRequiredService<ILogger<Startup>>();
43-
var inCluster = KubernetesClientConfiguration.IsInCluster();
44-
logger.LogDebug("Building client configuration. Client is in cluster: '{inCluster}'", inCluster);
45-
46-
return inCluster
47-
? KubernetesClientConfiguration.InClusterConfig()
48-
: KubernetesClientConfiguration.BuildConfigFromConfigFile();
49-
});
50-
51-
services.AddTransient<IKubernetes>(s =>
52-
new k8s.Kubernetes(s.GetRequiredService<KubernetesClientConfiguration>())
53-
{HttpClient = {Timeout = TimeSpan.FromMinutes(60)}});
5440
}
5541

5642

@@ -60,7 +46,10 @@ public void ConfigureContainer(ContainerBuilder builder)
6046
builder.RegisterModule<CoreModule>();
6147
builder.RegisterModule<SecretsModule>();
6248
builder.RegisterModule<ConfigMapsModule>();
63-
builder.RegisterModule<CertManagerModule>();
49+
50+
var certManagerEnabled = bool.Parse(Configuration["Reflector:Extensions:CertManager:Enabled"]);
51+
_logger.LogInformation("CertManager extension enabled: {certManagerEnabled}", certManagerEnabled);
52+
if (certManagerEnabled) builder.RegisterModule<CertManagerModule>();
6453
}
6554

6655
public void Configure(IApplicationBuilder app, IHostingEnvironment env)

helm/reflector/templates/rbac-clusterRole.yaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@ rules:
1818
- apiGroups: ["apiextensions.k8s.io"]
1919
resources: ["customresourcedefinitions"]
2020
verbs: ["*"]
21-
{{- if .Values.extensions.certManager.enabled }}
2221
- apiGroups: ["certmanager.k8s.io"]
2322
resources: ["certificates", "certificates/finalizers"]
2423
verbs: ["*"]
25-
{{- end }}
2624
{{- end }}

0 commit comments

Comments
 (0)