--- # Deploy a tiny static check site and route it through Kong as svc.prole.org - name: Ensure cert-manager CRDs exist for ACME ansible.builtin.command: k3s kubectl get crd certificates.cert-manager.io register: svc_check_certmgr changed_when: false failed_when: svc_check_certmgr.rc != 0 run_once: true - name: Read prole type gif (controller) ansible.builtin.slurp: src: "{{ playbook_dir }}/../../img/prole-type.gif" register: svc_check_gif delegate_to: localhost become: false run_once: true - name: Set ACME contact email (defaults to admin@prole.org) ansible.builtin.set_fact: svc_check_acme_email: "{{ letsencrypt_email | default('admin@prole.org') }}" run_once: true - name: Deploy svc-check site, Kong config, and ingress ansible.builtin.shell: | k3s kubectl apply -f - <<'EOF' apiVersion: v1 kind: Namespace metadata: name: svc-check --- apiVersion: v1 kind: ConfigMap metadata: name: svc-check-content namespace: svc-check data: index.html: | svc.prole.org
Prole type

svc.prole.org

served by k3s → Kong on myrddin.prole.org

binaryData: prole-type.gif: {{ svc_check_gif.content | trim | quote }} --- apiVersion: apps/v1 kind: Deployment metadata: name: svc-check-web namespace: svc-check labels: app: svc-check-web spec: replicas: 1 selector: matchLabels: app: svc-check-web template: metadata: labels: app: svc-check-web spec: containers: - name: nginx image: nginx:1.27-alpine ports: - name: http containerPort: 80 volumeMounts: - name: content mountPath: /usr/share/nginx/html volumes: - name: content configMap: name: svc-check-content items: - key: index.html path: index.html - key: prole-type.gif path: prole-type.gif --- apiVersion: v1 kind: Service metadata: name: svc-check-web namespace: svc-check labels: app: svc-check-web spec: selector: app: svc-check-web ports: - name: http port: 80 targetPort: http --- apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: email: {{ svc_check_acme_email }} server: https://acme-v02.api.letsencrypt.org/directory privateKeySecretRef: name: letsencrypt-prod solvers: - http01: ingress: class: traefik --- apiVersion: v1 kind: ConfigMap metadata: name: prole-db-kong-config namespace: prole-db data: kong.yml: | _format_version: "3.0" _transform: true services: - name: db-manager url: http://prole-db-manager.prole-db.svc.cluster.local:80 routes: - name: backup-route paths: - /backup strip_path: false - name: kubeconfig url: http://prole-svc.prole-db.svc.cluster.local:8080 routes: - name: kubeconfig paths: - /k3s/kube_config.sh - name: svc-check url: http://svc-check-web.svc-check.svc.cluster.local:80 routes: - name: svc-check-root hosts: - svc.prole.org paths: - / strip_path: false --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: svc-prole-ingress namespace: prole-db annotations: kubernetes.io/ingress.class: traefik cert-manager.io/cluster-issuer: letsencrypt-prod traefik.ingress.kubernetes.io/router.priority: "10" spec: ingressClassName: traefik tls: - hosts: - svc.prole.org secretName: svc-prole-org-tls rules: - host: svc.prole.org http: paths: - path: / pathType: Prefix backend: service: name: prole-db-kong port: number: 8000 EOF args: executable: /bin/bash run_once: true - name: Restart Kong to reload declarative config ansible.builtin.shell: k3s kubectl rollout restart deployment/prole-db-kong -n prole-db changed_when: true run_once: true