diskusi.tech (beta) Community

loading...
Cover image for Kubernetes Traefik dan Letsencrypt

Kubernetes Traefik dan Letsencrypt

ikandars profile image Iskandar Soesman ・3 min read

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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  
Enter fullscreen mode Exit fullscreen mode

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

pic
Editor guide