sumarsono.com
Take it with a grain of salt


Menambahkan Cloudflare Origin CA certificate Ke Traefik Kubernetes Ingress

Posted on

Ceritanya, aku pengen nyobain End-to-end HTTPS pakai Cloudflare dengan mode Full (strict). Alasannya, karena aku pakai Traefik v1.7.24 sebagai ingress controller, dan aku ingin pakai SSL certificate dari cloudflare. Nah si traefik ini sudah dikonfigurasi untuk pakai SSL certificate dari Let's Encrypt pakai OnHostRule. Masalahnya adalah ketika aku aktifkan HTTP cloudflare maka traefik akan gagal ketika validasi ke server let's encrypt.

Salah satu cara agar traefik tidak request sertifikat ke let's encrypt adalah dengan cara mendefinisikan tls.secreteName di spec Ingress-nya:

  tls:
   - secretName: sertifikatku-tls-cert

Kenapa sih kok ribet bener? Yah namanya juga lagi belajar, explorasi.

Pertama, generate Origin Certificates dari cloudflare:

Menu SSL/TLS > Origin Server > Origin Certificates > Create Certficate

Copas dan simpan certificate:

-----BEGIN CERTIFICATE-----
sampai
-----END CERTIFICATE-----

Simpan aja dengan nama domainku.crt

Selanjutnya copas dan simpan private key:

-----BEGIN PRIVATE KEY-----
sampai
-----END PRIVATE KEY-----

Simpan aja dengan nama domainku.key

Kedua, bikin secret tls pakai kubectl:

kubectl -n development create secret tls domainku-tls-cert --key=domainku.key --cert=domainku.crt

Note:

Secret API objects reside in a namespace. They can only be referenced by pods in that same namespace. Basically,

https://kubernetes.io/docs/concepts/configuration/secret/#details

Terakhir bikin ingress manifest domainku.com.ingress.yaml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  namespace: development
  name: domainku.com
  annotations:
    kubernetes.io/ingress.class: traefik
    ingress.kubernetes.io/browser-xss-filter: 'true'
    ingress.kubernetes.io/content-type-nosniff: 'true'
    traefik.ingress.kubernetes.io/redirect-permanent: "true"
    traefik.ingress.kubernetes.io/redirect-regex: ^https?://(www\.)?(.*)
    traefik.ingress.kubernetes.io/redirect-replacement: https://${2}
    ingress.kubernetes.io/force-hsts: "true"
    ingress.kubernetes.io/hsts-max-age: "2592000"
    ingress.kubernetes.io/hsts-include-subdomains: "true"
    ingress.kubernetes.io/hsts-preload: "false"
    ingress.kubernetes.io/frame-deny: "true"
    ingress.kubernetes.io/custom-frame-options-value: "SAMEORIGIN"
    ingress.kubernetes.io/content-security-policy: upgrade-insecure-requests
    traefik.ingress.kubernetes.io/buffering: |-
      maxrequestbodybytes: 10485760
      memrequestbodybytes: 2097153
      maxresponsebodybytes: 10485761
      memresponsebodybytes: 2097152
      retryexpression: IsNetworkError() && Attempts() <= 2
    traefik.ingress.kubernetes.io/rate-limit: |
      extractorfunc: client.ip
      rateset:
        myratelimit:
          period: 1s
          average: 50
          burst: 100
spec:
  rules:
  - host: domainku.com
    http:
      paths:
      - path: /
        backend:
          serviceName: myservice007
          servicePort: 80
  tls:
   - secretName: domainku-tls-cert
kubectl apply -f domainku.com.ingress.yaml

Selesai, dengan begini si traefik tidak akan request sertifikat ke let's encrypt dan aku bisa aktifkan awan kuning cloudflare dengan mode Full (strict)

~