mirror of
https://github.com/optim-enterprises-bv/homelab.git
synced 2025-10-30 17:37: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*
|
||||
|
||||
.idea
|
||||
certs/
|
||||
@@ -50,23 +50,16 @@ kubectl apply -f metallb/01-configuration.yml
|
||||
|
||||
https://doc.traefik.io/traefik/v2.8/user-guides/crd-acme/
|
||||
|
||||
## Create Traefik CRDs
|
||||
## Create persistent volume for certs
|
||||
|
||||
```shell
|
||||
kubectl apply -f traefik/00-crd-definition.yml
|
||||
kubectl apply -f traefik/01-crd-rbac.yml
|
||||
kubectl appy -f volumes/volumes.yml
|
||||
```
|
||||
|
||||
## Create Service
|
||||
## Install using Helm
|
||||
|
||||
```shell
|
||||
kubectl apply -f traefik/02-service.yml
|
||||
```
|
||||
|
||||
## Create Deployment
|
||||
|
||||
```shell
|
||||
kubectl apply -f traefik/03-deployment.yml
|
||||
helm install --values=helm/traefik-values.yaml traefik traefik/traefik
|
||||
```
|
||||
|
||||
## Create test application "whoami" with IngressRoutes
|
||||
|
||||
23
README.md
23
README.md
@@ -82,6 +82,10 @@ Install Cilium
|
||||
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
|
||||
|
||||
```shell
|
||||
@@ -89,15 +93,15 @@ cilium status
|
||||
```
|
||||
|
||||
### (Optional) Replace kube-proxy with Cilium [TODO]
|
||||
|
||||
https://docs.cilium.io/en/v1.12/gettingstarted/kubeproxy-free/
|
||||
|
||||
*NB* Cluster should be initialised with
|
||||
*NB* Cluster should be initialised with
|
||||
|
||||
```shell
|
||||
sudo kubeadm init --skip-phases=addon/kube-proxy
|
||||
```
|
||||
|
||||
|
||||
## MetalLB
|
||||
|
||||
For load balancing
|
||||
@@ -115,11 +119,24 @@ Configure IP-pool and advertise as Level 2
|
||||
https://metallb.universe.tf/configuration/
|
||||
|
||||
```yaml
|
||||
kubectl apply -f metallb/02-configuration
|
||||
kubectl apply -f metallb/01-configuration.yml
|
||||
```
|
||||
|
||||
# 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)
|
||||
|
||||
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"
|
||||
#}
|
||||
|
||||
## Create namespace for Traefik
|
||||
resource "kubernetes_namespace" "traefik" {
|
||||
metadata {
|
||||
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" {
|
||||
name = "traefik"
|
||||
|
||||
repository = "https://helm.traefik.io/traefik"
|
||||
chart = "traefik"
|
||||
namespace = "traefik"
|
||||
version = "10.20.0"
|
||||
namespace = kubernetes_namespace.traefik.metadata.0.name
|
||||
#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" {
|
||||
// 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:
|
||||
- protocol: TCP
|
||||
name: web
|
||||
port: 8000
|
||||
port: 80
|
||||
targetPort: 8000
|
||||
- protocol: TCP
|
||||
name: admin
|
||||
port: 8080
|
||||
- protocol: TCP
|
||||
name: websecure
|
||||
port: 4443
|
||||
port: 443
|
||||
targetPort: 8443
|
||||
selector:
|
||||
app: traefik
|
||||
@@ -28,17 +28,18 @@ spec:
|
||||
- name: traefik
|
||||
image: traefik:v2.8
|
||||
args:
|
||||
- "--log.level=DEBUG"
|
||||
- --api.insecure
|
||||
- --accesslog
|
||||
- --entrypoints.web.Address=:8000
|
||||
- --entrypoints.websecure.Address=:8443
|
||||
- --providers.kubernetescrd
|
||||
- --certificatesresolvers.myresolver.acme.tlschallenge
|
||||
- --certificatesresolvers.myresolver.acme.email=veghag@gmail.com
|
||||
- --certificatesresolvers.myresolver.acme.storage=acme.json
|
||||
- --certificatesresolvers.letsencrypt.acme.tlschallenge
|
||||
- --certificatesresolvers.letsencrypt.acme.email=veghag@gmail.com
|
||||
- --certificatesresolvers.letsencrypt.acme.storage=acme.json
|
||||
# Please note that this is the staging Let's Encrypt server.
|
||||
# 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:
|
||||
- name: web
|
||||
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
|
||||
kind: Service
|
||||
metadata:
|
||||
namespace: default
|
||||
name: whoami
|
||||
|
||||
spec:
|
||||
@@ -52,27 +53,10 @@ spec:
|
||||
entryPoints:
|
||||
- websecure
|
||||
routes:
|
||||
- match: Host(`whoami.ratatoskr.myddns.rocks`)
|
||||
- match: Host(`whoami.stonegarden.dev`)
|
||||
kind: Rule
|
||||
services:
|
||||
- name: whoami
|
||||
port: 80
|
||||
tls:
|
||||
certResolver: myresolver
|
||||
|
||||
---
|
||||
## 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
|
||||
certResolver: letsencrypt
|
||||
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