Portal/Notes πŸ“
Cka

Ingress: TLS

Versi Bahasa Indonesia. Baca dalam Bahasa Inggris

Untuk mengamankan Ingress (HTTPS), kita bisa melakukannya dengan menentukan Secret yang berisi private key dan certificate TLS.

Untuk production server, kita harus menggunakan TLS certificate yang valid dari Certificate Authority seperti letsencrypt.org, Cloudflare, dan lain-lain.

Generate Self-Signed Certificate

Untuk setup lokal, kita bisa generate self-signed certificate.

openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout tls.key -out tls.crt -subj "/CN=simple-go.mine/O=simple-org"

Create kubernetes secret

Ada dua cara untuk membuat TLS secret. Pertama dengan menggunakan file yaml seperti ini.

apiVersion: v1
kind: Secret
metadata:
  name: secret-tls
type: kubernetes.io/tls
data:
  tls.crt: <base64-encoded certificate>
  tls.key: <base64-encoded key>

Atau dengan menggunakan kubectl, dan saya lebih suka yang ini karena lebih praktis. Jadi mari kita buat tls secret.

➜ kubectl create secret tls simple-tls --cert=tls.crt --key=tls.key
secret/simple-tls created

Seperti biasa, cek menggunakan perintah kubectl get.

➜ kubectl get secret
NAME              TYPE                DATA   AGE
postgres-secret   Opaque              2      42h
simple-tls        kubernetes.io/tls   2      7s

Setup Ingress TLS

Sekarang kita sudah punya tls secret. Kita bisa update definisi ingress sebelumnya untuk menggunakan TLS secret yang baru saja kita buat. Tambahkan konfigurasi tls berikut di dalam bagian spec.

tls:
- hosts:
  - simple-go.mine
  secretName: simple-tls

Ayo apply dan validasi.

➜ kubectl apply -f ingress.yaml
ingress.networking.k8s.io/simple-ingress configured
➜ kubectl describe ingress simple-ingress 
Name:             simple-ingress
Labels:           <none>
Namespace:        default
Address:          192.168.49.2
Ingress Class:    nginx
Default backend:  <default>
TLS:
  simple-tls terminates simple-go.mine
Rules:
  Host            Path  Backends
  ----            ----  --------
  simple-go.mine  
                  /   simple-go:8080 (10.244.0.88:8080,10.244.0.89:8080,10.244.0.90:8080)
Annotations:      <none>
Events:
  Type    Reason  Age                 From                      Message
  ----    ------  ----                ----                      -------
  Normal  Sync    15s (x3 over 7h1m)  nginx-ingress-controller  Scheduled for sync

Setelah ingress kita di-update, kita bisa test menggunakan curl yang sama seperti halaman sebelumnya.

➜ curl --resolve "simple-go.mine:80:127.0.0.1" -i http://simple-go.mine
HTTP/1.1 308 Permanent Redirect
Date: Fri, 31 Jan 2025 10:39:16 GMT
Content-Type: text/html
Content-Length: 164
Connection: keep-alive
Location: https://simple-go.mine

<html>
<head><title>308 Permanent Redirect</title></head>
<body>
<center><h1>308 Permanent Redirect</h1></center>
<hr><center>nginx</center>
</body>
</html>

Seperti yang bisa kita lihat di atas, request di-redirect ke https yaitu port 443.

Sekarang coba curl menggunakan https ke port 443. Kali ini kita tambahkan -k atau --insecure untuk mengizinkan koneksi yang tidak aman karena kita menggunakan self-signed certificate. Jika tidak, kita akan mendapatkan error failed to verify certificate.

➜ curl --resolve "simple-go.mine:443:127.0.0.1" -i -k https://simple-go.mine
HTTP/2 200 
date: Fri, 31 Jan 2025 10:42:35 GMT
content-type: text/plain; charset=utf-8
content-length: 65

[{"id":1,"content":"Hello!"},{"id":2,"content":"Good Morning!"}]

References


Edit on GitHub

Last updated on

Ingress: TLS | Faisal Affan