การติดตั้งและตั้งค่า cert-manager ให้ออกใบรับรองสำหรับโพรโทคอล HTTPS โดยอัตโนมัติ


ในปัจจุบัน ระบบงานบนเว็บส่วนมากใช้โพรโทคอล HTTPS เพื่อป้องกันการดักจับข้อมูลระหว่างทาง และเพิ่มความเชื่อมั่นให้แก่ผู้ใช้งาน โดยผู้ใช้งานสามารถตรวจสอบความถูกต้องของใบรับรอง TLS ของเว็บได้ผ่านเว็บบราวเซอร์ ซึ่งใน Kubernetes มีเครื่องมือสำหรับจัดการใบรับรองเหล่านี้ คือ cert-manager

โดยในบทความนี้จะสาธิตวิธีติดตั้ง cert-manager ใน Kubernetes cluster และแสดงตัวอย่างการสร้าง Ingress พร้อมกับออกใบรับรอง TLS จาก Let’s Encrypt โดยอัตโนมัติ

สิ่งที่ต้องจัดเตรียม

  1. Kubernetes cluster
  2. kubectl ที่ตั้งค่าให้เชื่อมต่อกับ Kubernetes แล้ว
  3. helm
  4. 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 เพื่อดูใบรับรองได้

แสดงความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *