Ketika mencoba mencoba untuk mengaktifkan Letsencrypt pada Traefik yang terintegrasi ke dalam Kubernetes, saya menemukan beberapa kendala. Dan ternyata, permasalahan terkait ini sudah pernah di laporkan juga pada beberapa issue di Github, seperti #4349, #4279 dan #2931.
Issue-nya adalah bagaimana menyimpan sertifikat SSL yang sudah tergenerate ke dalam sebuah file.
Setelah mencoba beberapa pendekatan, berikut ini adalah tahapan yang bisa dicoba untuk mengatasi masalah ini.
Harap diperhatikan, pendekatan yang digunakan dalam tulisan ini adalah dalam rangka untuk memudahkan pemahaman dalam melalukan konfigurasi yang bisa jadi belum tentu cocok untuk digunakan di lingkungan production.
Dalam tulisan ini, versi Traefik yang saya gunakan adalah 1.7
Pertama-tama, buat sebuah folder tempat menyimpan semua file sertifikat. Berikut adalah contohnya:
mkdir /data/volume/traefik
Enable ClusterRoleBinding for Traefik just like on this docs
Kemudian aktifkan ClusterRoleBinding untuk Traefik, seperti yang di jelaskan di halaman dokumntasi berikut ini https://docs.traefik.io/v1.7/user-guide/kubernetes/
kubectl apply -f https://raw.githubusercontent.com/containous/traefik/v1.7/examples/k8s/traefik-rbac.yaml
Kemudian buat manifest yaml serperti berikut ini:
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: traefik-ingress-controller
namespace: kube-system
--------
kind: Deployment
apiVersion: apps/v1
metadata:
name: traefik-ingress-controller
namespace: kube-system
labels:
k8s-app: traefik-ingress-lb
spec:
replicas: 1
selector:
matchLabels:
k8s-app: traefik-ingress-lb
template:
metadata:
labels:
k8s-app: traefik-ingress-lb
name: traefik-ingress-lb
spec:
tolerations:
- key: "node-role.kubernetes.io/master"
effect: "NoSchedule"
operator: "Exists"
serviceAccountName: traefik-ingress-controller
terminationGracePeriodSeconds: 60
containers:
- image: traefik:v1.7
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
name: traefik-ingress-lb
volumeMounts:
- mountPath: /etc/traefik
name: traefik-volume
args:
- --kubernetes
- --kubernetes.watch
- --logLevel=DEBUG
- --defaultentrypoints=http,https
- --entrypoints=Name:https Address::443 TLS
- --entrypoints=Name:http Address::80
- --acme
- --acme.caserver=https://acme-v02.api.letsencrypt.org/directory
# use your own email for this
- --acme.email=YOUR-EMAIL@WEBSITE.COM
- --acme.entrypoint=https
- --acme.onhostrule=true
- --acme.storage=/etc/traefik/acme.json
- --acme.ondemand=true
- --acme.tlschallenge=true
volumes:
- name: traefik-volume
hostPath:
path: /data/volumes/traefik
type: Directory
--------
kind: Service
apiVersion: v1
metadata:
name: traefik-ingress-service
namespace: kube-system
spec:
selector:
k8s-app: traefik-ingress-lb
ports:
- protocol: TCP
port: 80
name: http
- protocol: TCP
port: 443
name: https
externalIPs:
# use your internet facing IP on this
- x.x.x.x
- x.x.x.x
Dan berikut adalah contoh manifest sebuah deployment yang aplikasinaya bisa diakses dari public via Treafik yang sertifikat HTTPS-nya terbuat secara otomoatis.
apiVersion: apps/v1
kind: Deployment
metadata:
name: kandar-id-deployment
labels:
app: kandar-id
spec:
replicas: 1
selector:
matchLabels:
app: kandar-id
template:
metadata:
labels:
app: kandar-id
spec:
terminationGracePeriodSeconds: 60
containers:
- image: ikandar/gia:latest
name: kandar-id
resources:
memory: "32Mi"
cpu: "200m"
limits:
memory: "32Mi"
cpu: "200m"
ports:
- name: http
containerPort: 80
--------
apiVersion: v1
kind: Service
metadata:
name: kandar-id-service
spec:
selector:
app: kandar-id
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
--------
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: whoami-service
spec:
rules:
- host: kandar.id
http:
paths:
- path: /
backend:
serviceName: kandar-id-service
servicePort: http
Selamat mencoba!
Catatan: artikel ini adalah penyaduran dari artikel asli yang berbahasa Inggris yang ada di halaman ini https://kandar.id/23-kubernetes-traefik-letsencrypt
Discussion