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

feat: add windows node exporter #181

Merged
merged 3 commits into from
Nov 5, 2024
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions monitoring/onpremise/exporters/windows-exporter/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<!-- BEGIN_TF_DOCS -->
## Requirements

| Name | Version |
|------|---------|
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 1.0 |
| <a name="requirement_kubectl"></a> [kubectl](#requirement\_kubectl) | >=1.14.0 |
| <a name="requirement_kubernetes"></a> [kubernetes](#requirement\_kubernetes) | >= 2.21.1 |

## Providers

| Name | Version |
|------|---------|
| <a name="provider_kubectl"></a> [kubectl](#provider\_kubectl) | >=1.14.0 |
| <a name="provider_kubernetes"></a> [kubernetes](#provider\_kubernetes) | >= 2.21.1 |

## Modules

No modules.

## Resources

| Name | Type |
|------|------|
| [kubectl_manifest.windows_exporter](https://registry.terraform.io/providers/gavinbunney/kubectl/latest/docs/resources/manifest) | resource |
| [kubernetes_config_map.windows_exporter_config](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/config_map) | resource |
| [kubernetes_service.windows_exporter](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/service) | resource |

## Inputs

| Name | Description | Type | Default | Required |
|------|-------------|------|---------|:--------:|
| <a name="input_docker_image"></a> [docker\_image](#input\_docker\_image) | Docker image for windows exporter | <pre>object({<br> image = string<br> tag = string<br> image_pull_secrets = string<br> })</pre> | n/a | yes |
| <a name="input_init_docker_image"></a> [init\_docker\_image](#input\_init\_docker\_image) | Docker image for windows exporter | <pre>object({<br> image = string<br> tag = string<br> image_pull_secrets = string<br> })</pre> | n/a | yes |
| <a name="input_name"></a> [name](#input\_name) | Name for the resource | `string` | `"windows-exporter"` | no |
| <a name="input_namespace"></a> [namespace](#input\_namespace) | Namespace of ArmoniK monitoring | `string` | n/a | yes |
| <a name="input_node_selector"></a> [node\_selector](#input\_node\_selector) | Node selector for windows exporter | `any` | `{}` | no |

## Outputs

No outputs.
<!-- END_TF_DOCS -->
173 changes: 173 additions & 0 deletions monitoring/onpremise/exporters/windows-exporter/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
# Define the YAML configuration as a file current version of kubernetes provider doesn't support windowsOptions; and there is a bug in the provider with the option: https://github.com/hashicorp/terraform-provider-kubernetes/issues/2575

resource "kubectl_manifest" "windows_exporter" {
yaml_body = yamlencode({
apiVersion = "apps/v1"
kind = "DaemonSet"
metadata = {
name = var.name
namespace = var.namespace
labels = {
app = "armonik"
type = "monitoring"
service = "windows-exporter"
}
}
spec = {
selector = {
matchLabels = {
app = "armonik"
type = "monitoring"
service = "windows-exporter"
}
}
template = {
metadata = {
labels = {
app = "armonik"
type = "monitoring"
service = "windows-exporter"
}
annotations = {
"prometheus.io/scrape" = "true"
"prometheus.io/scheme" = "http"
"prometheus.io/path" = "/metrics"
"prometheus.io/port" = "9182"
"prometheus.io/input" = "windows-exporter"
}
}
spec = {
securityContext = {
windowsOptions = {
hostProcess = true
runAsUserName = "NT AUTHORITY\\system"
}
}
hostNetwork = true
initContainers = [
{
name = "configure-firewall"
image = "${var.init_docker_image.image}:${var.init_docker_image.tag}"
command = ["powershell"]
args = ["New-NetFirewallRule", "-DisplayName", "'windows-exporter'", "-Direction", "inbound", "-Profile", "Any", "-Action", "Allow", "-LocalPort", "9182", "-Protocol", "TCP"]
}
]
containers = [
{
name = "windows-exporter"
image = "${var.docker_image.image}:${var.docker_image.tag}"
args = ["--config.file=%CONTAINER_SANDBOX_MOUNT_POINT%/config.yml"]
ports = [
{
containerPort = 9182
hostPort = 9182
name = "http"
}
]
volumeMounts = [
{
name = "windows-exporter-config"
mountPath = "/config.yml"
subPath = "config.yml"
}
]
}
]
nodeSelector = merge(
{
"kubernetes.io/os" = "windows"
"kubernetes.io/arch" = "amd64"
},
var.node_selector
)
tolerations = concat(
[
{
key = "kubernetes.io/arch"
operator = "Equal"
value = "amd64"
effect = "NoSchedule"
},
{
key = "kubernetes.io/os"
operator = "Equal"
value = "windows"
effect = "NoSchedule"
}
],
[
for key, value in var.node_selector : {
key = key
operator = "Equal"
value = value
effect = "NoSchedule"
}
]
)
volumes = [
{
name = "windows-exporter-config"
configMap = {
name = "windows-exporter-config"
}
}
]
}
}
}
})
}

# windows-exporter config map
resource "kubernetes_config_map" "windows_exporter_config" {
metadata {
name = "windows-exporter-config"
namespace = var.namespace
labels = {
app = "armonik"
type = "monitoring"
service = "windows-exporter"
}
}

data = {
"config.yml" = yamlencode({
collectors = {
enabled = "cpu_info,container,logical_disk,memory,net,os"
}
collector = {
service = {
services-where = "Name='containerd' or Name='kubelet'"
}
}
})
}
}

# windows-exporter service
resource "kubernetes_service" "windows_exporter" {
metadata {
name = "windows-exporter"
namespace = var.namespace
labels = {
app = "armonik"
type = "monitoring"
service = "windows-exporter"
}
}

spec {
selector = {
app = "armonik"
type = "monitoring"
service = "windows-exporter"
}

port {
name = "http"
protocol = "TCP"
port = 9182
target_port = 9182
}
}
}
1 change: 1 addition & 0 deletions monitoring/onpremise/exporters/windows-exporter/outputs.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# default outputs
39 changes: 39 additions & 0 deletions monitoring/onpremise/exporters/windows-exporter/variables.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Namespace
variable "namespace" {
description = "Namespace of ArmoniK monitoring"
type = string
}

variable "name" {
description = "Name for the resource"
type = string
default = "windows-exporter"
}

# Docker image
variable "docker_image" {
description = "Docker image for windows exporter"
type = object({
image = string
tag = string
image_pull_secrets = string
})
}

# Docker image
variable "init_docker_image" {
description = "Docker image for windows exporter"
type = object({
image = string
tag = string
image_pull_secrets = string
})
}


# Node selector
variable "node_selector" {
description = "Node selector for windows exporter"
type = any
default = {}
}
13 changes: 13 additions & 0 deletions monitoring/onpremise/exporters/windows-exporter/versions.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
terraform {
required_version = ">= 1.0"
required_providers {
kubernetes = {
source = "hashicorp/kubernetes"
version = ">= 2.21.1"
}
kubectl = {
source = "gavinbunney/kubectl"
version = ">=1.14.0"
}
}
}
Loading