Skip to main content

Setup wildcard certificate SSL di K3S

·2 mins

Melakukan installasi K3S dan mengizinkan akses dari luar dengan menambahkan --tls-san <IP PUBLIC>

curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--tls-san <IP PUBLIC>" sh -

Setelah cluster yang kita buat sudah siap, selanjutnya adalah melakukan instalasi cert-manager dengan menggunakan command dibawah

helm install \                              
  cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --set installCRDs=true

targets

Setelah seluruh pod cert-manager ready selanjutnya kita akan menambahkan secret untuk cloudflare api

apiVersion: v1
kind: Secret
metadata:
  name: cloudflare-api-token-secret
  namespace: cert-manager
type: Opaque
stringData:
  api-token: <API_TOKEN>

kemudian melakukan pembuatan cluster issuer dengan letsencrypt.

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-production
  namespace: cert-manager
spec:
  acme:
    email: <EMAIL>
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: issuer-letsencrypt-production
    solvers:
    - dns01:
        cloudflare:
          apiTokenSecretRef:
            key: api-token
            name: cloudflare-api-token-secret
          email: <EMAIL>

selanjutnya adalah membuat certificate dan TLSStore untuk SSL yang akan digunakan

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: wildcard-cert
  namespace: kube-system
spec:
  secretName: wildcard-secret
  dnsNames:
  - "*.krobot.my.id"
  issuerRef:
    kind: ClusterIssuer
    name: letsencrypt-production
apiVersion: traefik.containo.us/v1alpha1
kind: TLSStore
metadata:
  name: default
  namespace: kube-system
spec:
  defaultCertificate:
    secretName: wildcard-secret

Untuk sample app kita bisa menggunakan echo server

apiVersion: apps/v1
kind: Deployment
metadata:
  name: echoserver
spec:
  replicas: 3
  selector:
    matchLabels:
      app: echoserver
  template:
    metadata:
      labels:
        app: echoserver
    spec:
      containers:
      - image: gcr.io/google_containers/echoserver:1.0
        imagePullPolicy: Always
        name: echoserver
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: echoserver
spec:
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
  selector:
    app: echoserver

Next kita tinggal membuat ingress dengan template seperti dibawah ini

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: echoserver
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: websecure
    traefik.ingress.kubernetes.io/router.tls: "true"
spec:
  ingressClassName: traefik
  rules:
    - host: echo.krobot.my.id
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: echoserver
                port:
                  number: 80