mirror of
				https://github.com/optim-enterprises-bv/homelab.git
				synced 2025-10-31 09:57:59 +00:00 
			
		
		
		
	feat(volumes): Persistent storage for Traefik certs
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -29,3 +29,4 @@ override.tf.json | |||||||
| # example: *tfplan* | # example: *tfplan* | ||||||
|  |  | ||||||
| .idea | .idea | ||||||
|  | certs/ | ||||||
| @@ -50,23 +50,16 @@ kubectl apply -f metallb/01-configuration.yml | |||||||
|  |  | ||||||
| https://doc.traefik.io/traefik/v2.8/user-guides/crd-acme/ | https://doc.traefik.io/traefik/v2.8/user-guides/crd-acme/ | ||||||
|  |  | ||||||
| ## Create Traefik CRDs | ## Create persistent volume for certs | ||||||
|  |  | ||||||
| ```shell | ```shell | ||||||
| kubectl apply -f traefik/00-crd-definition.yml | kubectl appy -f volumes/volumes.yml | ||||||
| kubectl apply -f traefik/01-crd-rbac.yml |  | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| ## Create Service | ## Install using Helm | ||||||
|  |  | ||||||
| ```shell | ```shell | ||||||
| kubectl apply -f traefik/02-service.yml | helm install --values=helm/traefik-values.yaml traefik traefik/traefik | ||||||
| ``` |  | ||||||
|  |  | ||||||
| ## Create Deployment |  | ||||||
|  |  | ||||||
| ```shell |  | ||||||
| kubectl apply -f traefik/03-deployment.yml |  | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| ## Create test application "whoami" with IngressRoutes | ## Create test application "whoami" with IngressRoutes | ||||||
|   | |||||||
							
								
								
									
										21
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								README.md
									
									
									
									
									
								
							| @@ -82,6 +82,10 @@ Install Cilium | |||||||
| cilium install | cilium install | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
|  | ```shell | ||||||
|  | helm template --namespace kube-system cilium cilium/cilium --version 1.12.1 --set cluster.id=0,cluster.name=kubernetes,encryption.nodeEncryption=false,kubeProxyReplacement=disabled,operator.replicas=1,serviceAccounts.cilium.name=cilium,serviceAccounts.operator.name=cilium-operator,tunnel=vxlan | ||||||
|  | ``` | ||||||
|  |  | ||||||
| Validate install | Validate install | ||||||
|  |  | ||||||
| ```shell | ```shell | ||||||
| @@ -89,6 +93,7 @@ cilium status | |||||||
| ``` | ``` | ||||||
|  |  | ||||||
| ### (Optional) Replace kube-proxy with Cilium [TODO] | ### (Optional) Replace kube-proxy with Cilium [TODO] | ||||||
|  |  | ||||||
| https://docs.cilium.io/en/v1.12/gettingstarted/kubeproxy-free/ | https://docs.cilium.io/en/v1.12/gettingstarted/kubeproxy-free/ | ||||||
|  |  | ||||||
| *NB* Cluster should be initialised with | *NB* Cluster should be initialised with | ||||||
| @@ -97,7 +102,6 @@ https://docs.cilium.io/en/v1.12/gettingstarted/kubeproxy-free/ | |||||||
| sudo kubeadm init --skip-phases=addon/kube-proxy | sudo kubeadm init --skip-phases=addon/kube-proxy | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
|  |  | ||||||
| ## MetalLB | ## MetalLB | ||||||
|  |  | ||||||
| For load balancing | For load balancing | ||||||
| @@ -115,11 +119,24 @@ Configure IP-pool and advertise as Level 2 | |||||||
| https://metallb.universe.tf/configuration/ | https://metallb.universe.tf/configuration/ | ||||||
|  |  | ||||||
| ```yaml | ```yaml | ||||||
| kubectl apply -f metallb/02-configuration | kubectl apply -f metallb/01-configuration.yml | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| # Traefik | # Traefik | ||||||
|  |  | ||||||
|  | ## Install using Helm | ||||||
|  |  | ||||||
|  | ```shell | ||||||
|  | kubectl apply -f volumes/volumes.yml | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | **NB:** It appears we need the "volume-permissions" init container for Traefik if using `StorageClass` with | ||||||
|  | provisioner `kubernetes.io/no-provisioner` | ||||||
|  |  | ||||||
|  | ```shell | ||||||
|  | helm install --values=helm/traefik-values.yaml traefik traefik/traefik | ||||||
|  | ``` | ||||||
|  |  | ||||||
| ## Traefik IngressRoute Custom Resource Definition (CRD) | ## Traefik IngressRoute Custom Resource Definition (CRD) | ||||||
|  |  | ||||||
| https://doc.traefik.io/traefik/v2.8/routing/providers/kubernetes-crd/ | https://doc.traefik.io/traefik/v2.8/routing/providers/kubernetes-crd/ | ||||||
|   | |||||||
							
								
								
									
										30
									
								
								helm/traefik-values.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								helm/traefik-values.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | |||||||
|  | deployment: | ||||||
|  |   initContainers: | ||||||
|  |     # The "volume-permissions" init container is required if you run into permission issues. | ||||||
|  |     # Related issue: https://github.com/traefik/traefik/issues/6972 | ||||||
|  |     - name: volume-permissions | ||||||
|  |       image: busybox:1.31.1 | ||||||
|  |       command: [ "sh", "-c", "chmod -Rv 600 /data/*" ] | ||||||
|  |       volumeMounts: | ||||||
|  |         - name: data | ||||||
|  |           mountPath: /data | ||||||
|  |  | ||||||
|  | additionalArguments: | ||||||
|  |   - "--log.level=DEBUG" | ||||||
|  |   - "--api.insecure" | ||||||
|  |  | ||||||
|  | persistence: | ||||||
|  |   enabled: true | ||||||
|  |   name: data | ||||||
|  |   accessMode: ReadWriteOnce | ||||||
|  |   size: 128Mi | ||||||
|  |   storageClass: cert-storage | ||||||
|  |   path: /data | ||||||
|  |  | ||||||
|  | certResolvers: | ||||||
|  |   letsencrypt: | ||||||
|  |     email: veghag@gmail.com | ||||||
|  |     tlsChallenge: true | ||||||
|  |     storage: /data/acme.json | ||||||
|  |     # Remove staging server when it's working | ||||||
|  |     caServer: https://acme-staging-v02.api.letsencrypt.org/directory | ||||||
							
								
								
									
										68
									
								
								main.tf
									
									
									
									
									
								
							
							
						
						
									
										68
									
								
								main.tf
									
									
									
									
									
								
							| @@ -30,40 +30,66 @@ provider "helm" { | |||||||
| #  version    = "1.11.5" | #  version    = "1.11.5" | ||||||
| #} | #} | ||||||
|  |  | ||||||
|  | ## Create namespace for Traefik | ||||||
| resource "kubernetes_namespace" "traefik" { | resource "kubernetes_namespace" "traefik" { | ||||||
|   metadata { |   metadata { | ||||||
|     name = "traefik-system" |     name = "traefik-system" | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | ## Create StorageClass for local volumes | ||||||
|  | resource "kubernetes_storage_class" "cert-storage" { | ||||||
|  |   metadata { | ||||||
|  |     name = "cert-storage" | ||||||
|  |   } | ||||||
|  |   storage_provisioner = "kubernetes.io/no-provisioner" | ||||||
|  |   volume_binding_mode = "WaitForFirstCustomer" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ## Create PersistentVolume for Traefik certs | ||||||
|  | resource "kubernetes_persistent_volume" "traefik-cert-pv" { | ||||||
|  |   metadata { | ||||||
|  |     name = "traefik-cert-pv" | ||||||
|  |   } | ||||||
|  |   spec { | ||||||
|  |     capacity                         = { | ||||||
|  |       storage = "128Mi" | ||||||
|  |     } | ||||||
|  |     volume_mode                      = "Filesystem" | ||||||
|  |     access_modes                     = ["ReadWriteOnce"] | ||||||
|  |     persistent_volume_reclaim_policy = "Retain" | ||||||
|  |     storage_class_name               = "cert-storage" | ||||||
|  |     persistent_volume_source { | ||||||
|  |       local { | ||||||
|  |         path = "/mnt/sdb1/terrakube/certs" | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     node_affinity { | ||||||
|  |       required { | ||||||
|  |         node_selector_term { | ||||||
|  |           match_expressions { | ||||||
|  |             key      = "kubernetes.io/hostname" | ||||||
|  |             operator = "In" | ||||||
|  |             values   = ["ratatoskr"] | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ## Install Traefik | ||||||
| resource "helm_release" "traefik" { | resource "helm_release" "traefik" { | ||||||
|   name = "traefik" |   name = "traefik" | ||||||
|  |  | ||||||
|   repository = "https://helm.traefik.io/traefik" |   repository = "https://helm.traefik.io/traefik" | ||||||
|   chart      = "traefik" |   chart      = "traefik" | ||||||
|   namespace  = "traefik" |   namespace  = kubernetes_namespace.traefik.metadata.0.name | ||||||
|   version    = "10.20.0" |   #version    = "10.30.1" | ||||||
|  |  | ||||||
|  |   values = [file("traefik2/custom-values.yaml")] | ||||||
| } | } | ||||||
|  |  | ||||||
| #resource "kubernetes_service" "traefik" { |  | ||||||
| #  metadata { |  | ||||||
| #    name      = "traefik" |  | ||||||
| #    namespace = kubernetes_namespace.traefik.metadata.0.name |  | ||||||
| #  } |  | ||||||
| #  spec { |  | ||||||
| #    selector = { |  | ||||||
| #      # Standard Helm chart label to locate pods |  | ||||||
| #      "app.kubernetes.io/name" = helm_release.traefik.name |  | ||||||
| #    } |  | ||||||
| # |  | ||||||
| #    type = "LoadBalancer" |  | ||||||
| #    port { |  | ||||||
| #      protocol    = "TCP" |  | ||||||
| #      port        = 80    # External exposed port to reach container |  | ||||||
| #      target_port = 9000  # Internal exposed port of container |  | ||||||
| #    } |  | ||||||
| #  } |  | ||||||
| #} |  | ||||||
|  |  | ||||||
| //resource "kubernetes_namespace" "test" { | //resource "kubernetes_namespace" "test" { | ||||||
| //  metadata { | //  metadata { | ||||||
|   | |||||||
| @@ -1,9 +0,0 @@ | |||||||
| # File custom-values.yml |  | ||||||
| ## Install with "helm install --values=traefik/custom-values.yml traefik traefik/traefik |  | ||||||
| additionalArguments: |  | ||||||
|   - "--log.level=DEBUG" |  | ||||||
|   - "--api.insecure" |  | ||||||
|   - "--accesslog" |  | ||||||
|   - "--certificatesresolvers.myresolver.acme.tlschallenge" |  | ||||||
|   - "--certificatesresolvers.myresolver.acme.email=veghag@gmail.com" |  | ||||||
|   - "--certificatesresolvers.myresolver.acme.storage=acme.json" |  | ||||||
| @@ -8,12 +8,14 @@ spec: | |||||||
|   ports: |   ports: | ||||||
|     - protocol: TCP |     - protocol: TCP | ||||||
|       name: web |       name: web | ||||||
|       port: 8000 |       port: 80 | ||||||
|  |       targetPort: 8000 | ||||||
|     - protocol: TCP |     - protocol: TCP | ||||||
|       name: admin |       name: admin | ||||||
|       port: 8080 |       port: 8080 | ||||||
|     - protocol: TCP |     - protocol: TCP | ||||||
|       name: websecure |       name: websecure | ||||||
|       port: 4443 |       port: 443 | ||||||
|  |       targetPort: 8443 | ||||||
|   selector: |   selector: | ||||||
|     app: traefik |     app: traefik | ||||||
| @@ -28,17 +28,18 @@ spec: | |||||||
|         - name: traefik |         - name: traefik | ||||||
|           image: traefik:v2.8 |           image: traefik:v2.8 | ||||||
|           args: |           args: | ||||||
|  |             - "--log.level=DEBUG" | ||||||
|             - --api.insecure |             - --api.insecure | ||||||
|             - --accesslog |             - --accesslog | ||||||
|             - --entrypoints.web.Address=:8000 |             - --entrypoints.web.Address=:8000 | ||||||
|             - --entrypoints.websecure.Address=:8443 |             - --entrypoints.websecure.Address=:8443 | ||||||
|             - --providers.kubernetescrd |             - --providers.kubernetescrd | ||||||
|             - --certificatesresolvers.myresolver.acme.tlschallenge |             - --certificatesresolvers.letsencrypt.acme.tlschallenge | ||||||
|             - --certificatesresolvers.myresolver.acme.email=veghag@gmail.com |             - --certificatesresolvers.letsencrypt.acme.email=veghag@gmail.com | ||||||
|             - --certificatesresolvers.myresolver.acme.storage=acme.json |             - --certificatesresolvers.letsencrypt.acme.storage=acme.json | ||||||
|             # Please note that this is the staging Let's Encrypt server. |             # Please note that this is the staging Let's Encrypt server. | ||||||
|             # Once you get things working, you should remove that whole line altogether. |             # Once you get things working, you should remove that whole line altogether. | ||||||
|             #- --certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory |             #- --certificatesresolvers.letsencrypt.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory | ||||||
|           ports: |           ports: | ||||||
|             - name: web |             - name: web | ||||||
|               containerPort: 8000 |               containerPort: 8000 | ||||||
							
								
								
									
										288
									
								
								traefik2/values.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										288
									
								
								traefik2/values.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,288 @@ | |||||||
|  | # Default values for Traefik | ||||||
|  | image: | ||||||
|  |   name: traefik | ||||||
|  |   # defaults to appVersion | ||||||
|  |   tag: "" | ||||||
|  |   pullPolicy: IfNotPresent | ||||||
|  |  | ||||||
|  | # | ||||||
|  | # Configure the deployment | ||||||
|  | # | ||||||
|  | deployment: | ||||||
|  |   enabled: true | ||||||
|  |   # Can be either Deployment or DaemonSet | ||||||
|  |   kind: Deployment | ||||||
|  |   # Number of pods of the deployment (only applies when kind == Deployment) | ||||||
|  |   replicas: 1 | ||||||
|  |   # Number of old history to retain to allow rollback (If not set, default Kubernetes value is set to 10) | ||||||
|  |   # revisionHistoryLimit: 1 | ||||||
|  |   # Amount of time (in seconds) before Kubernetes will send the SIGKILL signal if Traefik does not shut down | ||||||
|  |   terminationGracePeriodSeconds: 60 | ||||||
|  |   # The minimum number of seconds Traefik needs to be up and running before the DaemonSet/Deployment controller considers it available | ||||||
|  |   minReadySeconds: 0 | ||||||
|  |   # Additional deployment annotations (e.g. for jaeger-operator sidecar injection) | ||||||
|  |   annotations: {} | ||||||
|  |   # Additional deployment labels (e.g. for filtering deployment by custom labels) | ||||||
|  |   labels: {} | ||||||
|  |   # Additional pod annotations (e.g. for mesh injection or prometheus scraping) | ||||||
|  |   podAnnotations: {} | ||||||
|  |   # Additional Pod labels (e.g. for filtering Pod by custom labels) | ||||||
|  |   podLabels: {} | ||||||
|  |   # Additional containers (e.g. for metric offloading sidecars) | ||||||
|  |   additionalContainers: [] | ||||||
|  |     # https://docs.datadoghq.com/developers/dogstatsd/unix_socket/?tab=host | ||||||
|  |     # - name: socat-proxy | ||||||
|  |     # image: alpine/socat:1.0.5 | ||||||
|  |     # args: ["-s", "-u", "udp-recv:8125", "unix-sendto:/socket/socket"] | ||||||
|  |     # volumeMounts: | ||||||
|  |     #   - name: dsdsocket | ||||||
|  |   #     mountPath: /socket | ||||||
|  |   # Additional volumes available for use with initContainers and additionalContainers | ||||||
|  |   additionalVolumes: [] | ||||||
|  |     # - name: dsdsocket | ||||||
|  |     #   hostPath: | ||||||
|  |   #     path: /var/run/statsd-exporter | ||||||
|  |   # Additional initContainers (e.g. for setting file permission as shown below) | ||||||
|  |   initContainers: [] | ||||||
|  |     # The "volume-permissions" init container is required if you run into permission issues. | ||||||
|  |     # Related issue: https://github.com/traefik/traefik/issues/6972 | ||||||
|  |     # - name: volume-permissions | ||||||
|  |     #   image: busybox:1.31.1 | ||||||
|  |     #   command: ["sh", "-c", "chmod -Rv 600 /data/*"] | ||||||
|  |     #   volumeMounts: | ||||||
|  |     #     - name: data | ||||||
|  |   #       mountPath: /data | ||||||
|  |   # Use process namespace sharing | ||||||
|  |   shareProcessNamespace: false | ||||||
|  |   # Custom pod DNS policy. Apply if `hostNetwork: true` | ||||||
|  |   # dnsPolicy: ClusterFirstWithHostNet | ||||||
|  |   # Additional imagePullSecrets | ||||||
|  |   imagePullSecrets: [] | ||||||
|  |   # - name: myRegistryKeySecretName | ||||||
|  |   # Pod lifecycle actions | ||||||
|  |   lifecycle: {} | ||||||
|  |     # preStop: | ||||||
|  |     #   exec: | ||||||
|  |     #     command: ["/bin/sh", "-c", "sleep 40"] | ||||||
|  |     # postStart: | ||||||
|  |     #   httpGet: | ||||||
|  |     #     path: /ping | ||||||
|  |     #     port: 9000 | ||||||
|  |     #     host: localhost | ||||||
|  |   #     scheme: HTTP | ||||||
|  |  | ||||||
|  | # Pod disruption budget | ||||||
|  | podDisruptionBudget: | ||||||
|  |   enabled: false | ||||||
|  |   # maxUnavailable: 1 | ||||||
|  |   # maxUnavailable: 33% | ||||||
|  |   # minAvailable: 0 | ||||||
|  |   # minAvailable: 25% | ||||||
|  |  | ||||||
|  | # Use ingressClass. Ignored if Traefik version < 2.3 / kubernetes < 1.18.x | ||||||
|  | ingressClass: | ||||||
|  |   # true is not unit-testable yet, pending https://github.com/rancher/helm-unittest/pull/12 | ||||||
|  |   enabled: false | ||||||
|  |   isDefaultClass: false | ||||||
|  |   # Use to force a networking.k8s.io API Version for certain CI/CD applications. E.g. "v1beta1" | ||||||
|  |   fallbackApiVersion: "" | ||||||
|  |  | ||||||
|  | # Activate Pilot integration | ||||||
|  | pilot: | ||||||
|  |   enabled: false | ||||||
|  |   token: "" | ||||||
|  |   # Toggle Pilot Dashboard | ||||||
|  |   # dashboard: false | ||||||
|  |  | ||||||
|  | # Enable experimental features | ||||||
|  | experimental: | ||||||
|  |   http3: | ||||||
|  |     enabled: false | ||||||
|  |   plugins: | ||||||
|  |     enabled: false | ||||||
|  |   kubernetesGateway: | ||||||
|  |     enabled: false | ||||||
|  |     gateway: | ||||||
|  |       enabled: true | ||||||
|  |     # certificate: | ||||||
|  |     #   group: "core" | ||||||
|  |     #   kind: "Secret" | ||||||
|  |     #   name: "mysecret" | ||||||
|  |     # By default, Gateway would be created to the Namespace you are deploying Traefik to. | ||||||
|  |     # You may create that Gateway in another namespace, setting its name below: | ||||||
|  |     # namespace: default | ||||||
|  |  | ||||||
|  | # Create an IngressRoute for the dashboard | ||||||
|  | ingressRoute: | ||||||
|  |   dashboard: | ||||||
|  |     enabled: true | ||||||
|  |     # Additional ingressRoute annotations (e.g. for kubernetes.io/ingress.class) | ||||||
|  |     annotations: {} | ||||||
|  |     # Additional ingressRoute labels (e.g. for filtering IngressRoute by custom labels) | ||||||
|  |     labels: {} | ||||||
|  |  | ||||||
|  | rollingUpdate: | ||||||
|  |   maxUnavailable: 1 | ||||||
|  |   maxSurge: 1 | ||||||
|  |  | ||||||
|  | # Customize liveness and readiness probe values. | ||||||
|  | readinessProbe: | ||||||
|  |   failureThreshold: 1 | ||||||
|  |   initialDelaySeconds: 10 | ||||||
|  |   periodSeconds: 10 | ||||||
|  |   successThreshold: 1 | ||||||
|  |   timeoutSeconds: 2 | ||||||
|  |  | ||||||
|  | livenessProbe: | ||||||
|  |   failureThreshold: 3 | ||||||
|  |   initialDelaySeconds: 10 | ||||||
|  |   periodSeconds: 10 | ||||||
|  |   successThreshold: 1 | ||||||
|  |   timeoutSeconds: 2 | ||||||
|  |  | ||||||
|  | # | ||||||
|  | # Configure providers | ||||||
|  | # | ||||||
|  | providers: | ||||||
|  |   kubernetesCRD: | ||||||
|  |     enabled: true | ||||||
|  |     allowCrossNamespace: false | ||||||
|  |     allowExternalNameServices: false | ||||||
|  |     allowEmptyServices: false | ||||||
|  |     # ingressClass: traefik-internal | ||||||
|  |     # labelSelector: environment=production,method=traefik | ||||||
|  |     namespaces: [] | ||||||
|  |     # - "default" | ||||||
|  |  | ||||||
|  |   kubernetesIngress: | ||||||
|  |     enabled: true | ||||||
|  |     allowExternalNameServices: false | ||||||
|  |     allowEmptyServices: false | ||||||
|  |     # ingressClass: traefik-internal | ||||||
|  |     # labelSelector: environment=production,method=traefik | ||||||
|  |     namespaces: [] | ||||||
|  |     # - "default" | ||||||
|  |     # IP used for Kubernetes Ingress endpoints | ||||||
|  |     publishedService: | ||||||
|  |       enabled: false | ||||||
|  |       # Published Kubernetes Service to copy status from. Format: namespace/servicename | ||||||
|  |       # By default this Traefik service | ||||||
|  |       # pathOverride: "" | ||||||
|  |  | ||||||
|  | # | ||||||
|  | # Add volumes to the traefik pod. The volume name will be passed to tpl. | ||||||
|  | # This can be used to mount a cert pair or a configmap that holds a config.toml file. | ||||||
|  | # After the volume has been mounted, add the configs into traefik by using the `additionalArguments` list below, eg: | ||||||
|  | # additionalArguments: | ||||||
|  | # - "--providers.file.filename=/config/dynamic.toml" | ||||||
|  | # - "--ping" | ||||||
|  | # - "--ping.entrypoint=web" | ||||||
|  | volumes: [] | ||||||
|  | # - name: public-cert | ||||||
|  | #   mountPath: "/certs" | ||||||
|  | #   type: secret | ||||||
|  | # - name: '{{ printf "%s-configs" .Release.Name }}' | ||||||
|  | #   mountPath: "/config" | ||||||
|  | #   type: configMap | ||||||
|  |  | ||||||
|  | # Additional volumeMounts to add to the Traefik container | ||||||
|  | additionalVolumeMounts: [] | ||||||
|  |   # For instance when using a logshipper for access logs | ||||||
|  |   # - name: traefik-logs | ||||||
|  | #   mountPath: /var/log/traefik | ||||||
|  |  | ||||||
|  | # Logs | ||||||
|  | # https://docs.traefik.io/observability/logs/ | ||||||
|  | logs: | ||||||
|  |   # Traefik logs concern everything that happens to Traefik itself (startup, configuration, events, shutdown, and so on). | ||||||
|  |   general: | ||||||
|  |     # By default, the logs use a text format (common), but you can | ||||||
|  |     # also ask for the json format in the format option | ||||||
|  |     # format: json | ||||||
|  |     # By default, the level is set to ERROR. Alternative logging levels are DEBUG, PANIC, FATAL, ERROR, WARN, and INFO. | ||||||
|  |     level: ERROR | ||||||
|  |   access: | ||||||
|  |     # To enable access logs | ||||||
|  |     enabled: false | ||||||
|  |     # By default, logs are written using the Common Log Format (CLF). | ||||||
|  |     # To write logs in JSON, use json in the format option. | ||||||
|  |     # If the given format is unsupported, the default (CLF) is used instead. | ||||||
|  |     # format: json | ||||||
|  |     # To write the logs in an asynchronous fashion, specify a bufferingSize option. | ||||||
|  |     # This option represents the number of log lines Traefik will keep in memory before writing | ||||||
|  |     # them to the selected output. In some cases, this option can greatly help performances. | ||||||
|  |     # bufferingSize: 100 | ||||||
|  |     # Filtering https://docs.traefik.io/observability/access-logs/#filtering | ||||||
|  |     filters: {} | ||||||
|  |       # statuscodes: "200,300-302" | ||||||
|  |       # retryattempts: true | ||||||
|  |     # minduration: 10ms | ||||||
|  |     # Fields | ||||||
|  |     # https://docs.traefik.io/observability/access-logs/#limiting-the-fieldsincluding-headers | ||||||
|  |     fields: | ||||||
|  |       general: | ||||||
|  |         defaultmode: keep | ||||||
|  |         names: {} | ||||||
|  |           # Examples: | ||||||
|  |         # ClientUsername: drop | ||||||
|  |       headers: | ||||||
|  |         defaultmode: drop | ||||||
|  |         names: {} | ||||||
|  |           # Examples: | ||||||
|  |           # User-Agent: redact | ||||||
|  |           # Authorization: drop | ||||||
|  |         # Content-Type: keep | ||||||
|  |  | ||||||
|  | metrics: | ||||||
|  |   # datadog: | ||||||
|  |   #   address: 127.0.0.1:8125 | ||||||
|  |   # influxdb: | ||||||
|  |   #   address: localhost:8089 | ||||||
|  |   #   protocol: udp | ||||||
|  |   prometheus: | ||||||
|  |     entryPoint: metrics | ||||||
|  |   #  addRoutersLabels: true | ||||||
|  |   # statsd: | ||||||
|  |   #   address: localhost:8125 | ||||||
|  |  | ||||||
|  | tracing: {} | ||||||
|  |   # instana: | ||||||
|  |   #   localAgentHost: 127.0.0.1 | ||||||
|  |   #   localAgentPort: 42699 | ||||||
|  |   #   logLevel: info | ||||||
|  |   #   enableAutoProfile: true | ||||||
|  |   # datadog: | ||||||
|  |   #   localAgentHostPort: 127.0.0.1:8126 | ||||||
|  |   #   debug: false | ||||||
|  |   #   globalTag: "" | ||||||
|  |   #   prioritySampling: false | ||||||
|  |   # jaeger: | ||||||
|  |   #   samplingServerURL: http://localhost:5778/sampling | ||||||
|  |   #   samplingType: const | ||||||
|  |   #   samplingParam: 1.0 | ||||||
|  |   #   localAgentHostPort: 127.0.0.1:6831 | ||||||
|  |   #   gen128Bit: false | ||||||
|  |   #   propagation: jaeger | ||||||
|  |   #   traceContextHeaderName: uber-trace-id | ||||||
|  |   #   disableAttemptReconnecting: true | ||||||
|  |   #   collector: | ||||||
|  |   #      endpoint: "" | ||||||
|  |   #      user: "" | ||||||
|  |   #      password: "" | ||||||
|  |   # zipkin: | ||||||
|  |   #   httpEndpoint: http://localhost:9411/api/v2/spans | ||||||
|  |   #   sameSpan: false | ||||||
|  |   #   id128Bit: true | ||||||
|  |   #   sampleRate: 1.0 | ||||||
|  |   # haystack: | ||||||
|  |   #   localAgentHost: 127.0.0.1 | ||||||
|  |   #   localAgentPort: 35000 | ||||||
|  |   #   globalTag: "" | ||||||
|  |   #   traceIDHeaderName: "" | ||||||
|  |   #   parentIDHeaderName: "" | ||||||
|  |   #   spanIDHeaderName: "" | ||||||
|  |   #   baggagePrefixHeaderName: "" | ||||||
|  |   # elastic: | ||||||
|  |   #   serverURL: http://localhost:8200 | ||||||
|  |   #   secretToken: "" | ||||||
|  | #   serviceEnvironment: "" | ||||||
							
								
								
									
										29
									
								
								volumes/volumes.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								volumes/volumes.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | |||||||
|  | apiVersion: storage.k8s.io/v1 | ||||||
|  | kind: StorageClass | ||||||
|  | metadata: | ||||||
|  |   name: cert-storage | ||||||
|  | provisioner: kubernetes.io/no-provisioner | ||||||
|  | volumeBindingMode: WaitForFirstConsumer | ||||||
|  | --- | ||||||
|  | apiVersion: v1 | ||||||
|  | kind: PersistentVolume | ||||||
|  | metadata: | ||||||
|  |   name: traefik-certs-pv | ||||||
|  | spec: | ||||||
|  |   capacity: | ||||||
|  |     storage: 128Mi | ||||||
|  |   volumeMode: Filesystem | ||||||
|  |   accessModes: | ||||||
|  |     - ReadWriteOnce | ||||||
|  |   persistentVolumeReclaimPolicy: Retain | ||||||
|  |   storageClassName: cert-storage | ||||||
|  |   local: | ||||||
|  |     path: "/mnt/sdb1/terrakube/certs" | ||||||
|  |   nodeAffinity: | ||||||
|  |     required: | ||||||
|  |       nodeSelectorTerms: | ||||||
|  |         - matchExpressions: | ||||||
|  |             - key: kubernetes.io/hostname | ||||||
|  |               operator: In | ||||||
|  |               values: | ||||||
|  |                 - ratatoskr | ||||||
| @@ -3,6 +3,7 @@ | |||||||
| apiVersion: v1 | apiVersion: v1 | ||||||
| kind: Service | kind: Service | ||||||
| metadata: | metadata: | ||||||
|  |   namespace: default | ||||||
|   name: whoami |   name: whoami | ||||||
|  |  | ||||||
| spec: | spec: | ||||||
| @@ -52,27 +53,10 @@ spec: | |||||||
|   entryPoints: |   entryPoints: | ||||||
|     - websecure |     - websecure | ||||||
|   routes: |   routes: | ||||||
|     - match: Host(`whoami.ratatoskr.myddns.rocks`) |     - match: Host(`whoami.stonegarden.dev`) | ||||||
|       kind: Rule |       kind: Rule | ||||||
|       services: |       services: | ||||||
|         - name: whoami |         - name: whoami | ||||||
|           port: 80 |           port: 80 | ||||||
|   tls: |   tls: | ||||||
|     certResolver: myresolver |     certResolver: letsencrypt | ||||||
|  |  | ||||||
| --- |  | ||||||
| ## IngressRoute for insecure whoami address |  | ||||||
| #apiVersion: traefik.containo.us/v1alpha1 |  | ||||||
| #kind: IngressRoute |  | ||||||
| #metadata: |  | ||||||
| #  name: simpleingressroute |  | ||||||
| #  namespace: default |  | ||||||
| #spec: |  | ||||||
| #  entryPoints: |  | ||||||
| #    - web |  | ||||||
| #  routes: |  | ||||||
| #    - match: Host(`test.ratatoskr.myddns.rocks`) && PathPrefix(`/notls`) |  | ||||||
| #      kind: Rule |  | ||||||
| #      services: |  | ||||||
| #        - name: whoami |  | ||||||
| #          port: 80 |  | ||||||
							
								
								
									
										68
									
								
								whoami/01-whoami2.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								whoami/01-whoami2.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | |||||||
|  | # Namespace for whoami | ||||||
|  | apiVersion: v1 | ||||||
|  | kind: Namespace | ||||||
|  | metadata: | ||||||
|  |   name: whoami | ||||||
|  |  | ||||||
|  | --- | ||||||
|  | # Service for exposing deployment of whoami | ||||||
|  | apiVersion: v1 | ||||||
|  | kind: Service | ||||||
|  | metadata: | ||||||
|  |   namespace: whoami | ||||||
|  |   name: whoami | ||||||
|  |  | ||||||
|  | spec: | ||||||
|  |   type: LoadBalancer | ||||||
|  |   ports: | ||||||
|  |     - protocol: TCP | ||||||
|  |       name: web | ||||||
|  |       port: 80 | ||||||
|  |   selector: | ||||||
|  |     app: whoami | ||||||
|  |  | ||||||
|  | --- | ||||||
|  | # Deployment of whoami | ||||||
|  | kind: Deployment | ||||||
|  | apiVersion: apps/v1 | ||||||
|  | metadata: | ||||||
|  |   namespace: whoami | ||||||
|  |   name: whoami | ||||||
|  |   labels: | ||||||
|  |     app: whoami | ||||||
|  |  | ||||||
|  | spec: | ||||||
|  |   replicas: 2 | ||||||
|  |   selector: | ||||||
|  |     matchLabels: | ||||||
|  |       app: whoami | ||||||
|  |   template: | ||||||
|  |     metadata: | ||||||
|  |       labels: | ||||||
|  |         app: whoami | ||||||
|  |     spec: | ||||||
|  |       containers: | ||||||
|  |         - name: whoami | ||||||
|  |           image: traefik/whoami | ||||||
|  |           ports: | ||||||
|  |             - name: web | ||||||
|  |               containerPort: 80 | ||||||
|  |  | ||||||
|  | --- | ||||||
|  | # IngressRoute for secure whoami address | ||||||
|  | apiVersion: traefik.containo.us/v1alpha1 | ||||||
|  | kind: IngressRoute | ||||||
|  | metadata: | ||||||
|  |   name: ingressroutetls | ||||||
|  |   namespace: whoami | ||||||
|  | spec: | ||||||
|  |   entryPoints: | ||||||
|  |     - websecure | ||||||
|  |   routes: | ||||||
|  |     - match: Host(`whoami2.stonegarden.dev`) | ||||||
|  |       kind: Rule | ||||||
|  |       services: | ||||||
|  |         - name: whoami | ||||||
|  |           port: 80 | ||||||
|  |   tls: | ||||||
|  |     certResolver: letsencrypt | ||||||
		Reference in New Issue
	
	Block a user
	 Vegard Hagen
					Vegard Hagen