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
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