Note
By default, the provider ignores any annotations whose key names end with kubernetes.io. This is necessary because such annotations can be mutated by server-side components and consequently cause a perpetual diff in the Terraform plan output. If you explicitly specify any such annotations in the configuration template then Terraform will consider these as normal resource attributes and manage them as expected (while still avoiding the perpetual diff problem). For more info see Kubernetes reference
Note
By default, the provider ignores any labels whose key names end with kubernetes.io. This is necessary because such labels can be mutated by server-side components and consequently cause a perpetual diff in the Terraform plan output. If you explicitly specify any such labels in the configuration template then Terraform will consider these as normal resource attributes and manage them as expected (while still avoiding the perpetual diff problem). For more info see Kubernetes reference
These arguments are the same as the for the spec block of a Pod.
Please see the Pod resource for reference.
One or more volume_claim_template blocks can be specified.
Each takes the same attributes as a kubernetes_persistent_volume_claim resource.
Please see its documentation for reference.
The following Timeout configuration options are available for the kubernetes_stateful_set resource:
resource "kubernetes_stateful_set" "prometheus" {
metadata {
annotations = {
SomeAnnotation = "foobar"
}
labels = {
k8s-app = "prometheus"
"kubernetes.io/cluster-service" = "true"
"addonmanager.kubernetes.io/mode" = "Reconcile"
version = "v2.2.1"
}
name = "prometheus"
}
spec {
pod_management_policy = "Parallel"
replicas = 1
revision_history_limit = 5
selector {
match_labels = {
k8s-app = "prometheus"
}
}
service_name = "prometheus"
template {
metadata {
labels = {
k8s-app = "prometheus"
}
annotations = {}
}
spec {
service_account_name = "prometheus"
init_container {
name = "init-chown-data"
image = "busybox:latest"
image_pull_policy = "IfNotPresent"
command = ["chown", "-R", "65534:65534", "/data"]
volume_mount {
name = "prometheus-data"
mount_path = "/data"
sub_path = ""
}
}
container {
name = "prometheus-server-configmap-reload"
image = "jimmidyson/configmap-reload:v0.1"
image_pull_policy = "IfNotPresent"
args = [
"--volume-dir=/etc/config",
"--webhook-url=http://localhost:9090/-/reload",
]
volume_mount {
name = "config-volume"
mount_path = "/etc/config"
read_only = true
}
resources {
limits = {
cpu = "10m"
memory = "10Mi"
}
requests = {
cpu = "10m"
memory = "10Mi"
}
}
}
container {
name = "prometheus-server"
image = "prom/prometheus:v2.2.1"
image_pull_policy = "IfNotPresent"
args = [
"--config.file=/etc/config/prometheus.yml",
"--storage.tsdb.path=/data",
"--web.console.libraries=/etc/prometheus/console_libraries",
"--web.console.templates=/etc/prometheus/consoles",
"--web.enable-lifecycle",
]
port {
container_port = 9090
}
resources {
limits = {
cpu = "200m"
memory = "1000Mi"
}
requests = {
cpu = "200m"
memory = "1000Mi"
}
}
volume_mount {
name = "config-volume"
mount_path = "/etc/config"
}
volume_mount {
name = "prometheus-data"
mount_path = "/data"
sub_path = ""
}
readiness_probe {
http_get {
path = "/-/ready"
port = 9090
}
initial_delay_seconds = 30
timeout_seconds = 30
}
liveness_probe {
http_get {
path = "/-/healthy"
port = 9090
scheme = "HTTPS"
}
initial_delay_seconds = 30
timeout_seconds = 30
}
}
termination_grace_period_seconds = 300
volume {
name = "config-volume"
config_map {
name = "prometheus-config"
}
}
}
}
update_strategy {
type = "RollingUpdate"
rolling_update {
partition = 1
}
}
volume_claim_template {
metadata {
name = "prometheus-data"
}
spec {
access_modes = ["ReadWriteOnce"]
storage_class_name = "standard"
resources {
requests = {
storage = "16Gi"
}
}
}
}
}
}
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx # has to match .spec.template.metadata.labels
serviceName: "nginx"
replicas: 3 # by default is 1
minReadySeconds: 10 # by default is 0
template:
metadata:
labels:
app: nginx # has to match .spec.selector.matchLabels
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: registry.k8s.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "my-storage-class"
resources:
requests:
storage: 1Gi
kubectl apply -f statefulset.yaml
Categorized by Availability, Security & Compliance and Cost