ในปัจจุบัน ระบบงานบนเว็บส่วนมากใช้โพรโทคอล HTTPS เพื่อป้องกันการดักจับข้อมูลระหว่างทาง และเพิ่มความเชื่อมั่นให้แก่ผู้ใช้งาน โดยผู้ใช้งานสามารถตรวจสอบความถูกต้องของใบรับรอง TLS ของเว็บได้ผ่านเว็บบราวเซอร์ ซึ่งใน Kubernetes มีเครื่องมือสำหรับจัดการใบรับรองเหล่านี้ คือ cert-manager
โดยในบทความนี้จะสาธิตวิธีติดตั้ง cert-manager ใน Kubernetes cluster และแสดงตัวอย่างการสร้าง Ingress พร้อมกับออกใบรับรอง TLS จาก Let’s Encrypt โดยอัตโนมัติ
สิ่งที่ต้องจัดเตรียม
- Kubernetes cluster
- kubectl ที่ตั้งค่าให้เชื่อมต่อกับ Kubernetes แล้ว
- helm
- Ingress controller ที่เชื่อมต่อกับ public ip
ติดตั้ง cert-manager
ติดตั้ง cert-manager จากคู่มือ ตัวอย่าง:
เพิ่ม Helm repository ของ cert-manager
helm repo add jetstack https://charts.jetstack.io
ปรับรุ่นแคช Helm chart ให้เป็นปัจจุบัน
helm repo update
ติดตั้ง CustomResourceDefinitions
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.11.0/cert-manager.crds.yaml
ใช้ helm ติดตั้ง cert-manager พร้อมทั้งสร้าง namespace cert-manager
helm install \
cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--version v1.11.0
สร้าง ClusterIssuer
สร้างไฟล์ letsencrypt.yaml
ให้มีเนื้อหาดังนี้:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt
spec:
acme:
email: <อีเมลของผู้ดูแลระบบ>
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-account-key
solvers:
- selector: {}
http01:
ingress:
class: public-nginx
โดย
- ระบุอีเมลของผู้ดูแลระบบใน
spec.acme.email
- ระบุชื่อของ ingress class ของที่ ingress controller ที่เข้าถึงได้จากอินเทอร์เน็ต (มี public ip) โดยดูรายการ ingress class ได้โดยใช้คำสั่ง
kubectl get ingressclass
จากนั้นใช้คำสั่ง kubectl apply -f letsencrypt.yaml
ตัวอย่างการใช้งาน
วิธีหนึ่งในการสร้างใบรับรอง TLS คือ ระบุข้อมูลเพิ่มเติมขณะสร้าง Ingress ดังนี้ (ก่อนที่จะสร้าง Ingress ให้สร้าง A/AAA record ชี้ hostname มาที่ไอพีของ ingress controller ก่อน ทั้งบน DNS Server ภายในและ DNS Server สาธารณะ)
- ใน
metadata.annotations
เพิ่มcert-manager.io/cluster-issuer: letsencrypt
- ใน
spec.tls
สร้างรายการที่มีhosts
: ['app1.example.com']
(แทนที่ด้วย hostname ที่ถูกต้อง) และsecretName: app1-tls
(ตั้งชื่อได้ตามความเหมาะสม)
ตัวอย่าง:
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app1
namespace: app1
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
cert-manager.io/cluster-issuer: letsencrypt
spec:
ingressClassName: public-nginx
rules:
- host: app1.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app1
port:
number: 80
tls:
- hosts:
- app1.example.com
secretName: app1-tls
เมื่อสร้าง Ingress แล้ว cert-manager จะสร้างใบรับรอง TLS ให้โดยอัตโนมัติ สามารถใช้คำสั่ง kubectl get -n <namespace ของระบบงาน> certificate
เพื่อดูใบรับรองได้