Replace SSL Certificate in NGINX Ingress Controller
หลังจากที่เราใช้งาน Kubernetes กันมาพักใหญ่ๆแล้ว เราก็น่าจะคุ้นกับการทำงานมากขึ้น สิ่งที่เกิดขึ้นหลังจากการรันระบบมาสักพักในเว็บยุคใหม่ๆคือ SSL Certificate หมดอายุ เนื่องจากปัจจุบัน Certificate จะมีอายุได้มากสุดประมาณ 2 ปี หรือหากเกิดความผิดพลาด private key หลุดออกไป เราก็จะต้องทำการเปลี่ยน Certificate/Key ใหม่
วิธีการสร้าง หรือ เปลี่ยน Certificate นั้นก็ง่ายๆครับ
- เราต้องมี Certificate ใหม่ก่อน
- ทำการสร้าง Secret file ให้ Kubernetes รู้จัก
- Apply file ใหม่ก็เสร็จแล้ว
เรามาดูตัวอย่างกันครับ
เรานำ Certificate ที่ได้มาแปลงเป็น Base64 ก่อน ทั้ง Cert และ Key นะครับ ถ้า Cert มี Intermediate ก็ bundle มาเป็นไฟล์เดียวเลยครับ ผมจะใช้ Cert จาก Let’s Encrypt มาเป็นตัวอย่างนะครับ
ใช้ command base64 ใน linux เลยก็ได้ง่ายดี แต่ว่ามันจะมี newline มาด้วย ให้รันคำสั่ง
$base64 privkey.pem | tr -d ‘\n’
$base64 fullchain.pem | tr -d ‘\n’
ทั้งสองไฟล์คือ Cert และ Key นะครับ ชื่ออาจจะแตกต่างกันไปแล้วแต่ตั้งครับ รันเสร็จเราจะได้ base64 string ยาวๆ ให้ copy ไปแปะในขั้นต่อไปครับ
ต่อไปคือการสร้าง secret สำหรับ kubernetes โดยจะมีหน้าตาแบบนี้
apiVersion: v1
kind: Secret
metadata:
name: testsecret-tls
namespace: default
data:
tls.crt: ## base64 encoded cert ##
tls.key: ## base64 encoded key ##
type: kubernetes.io/tls
ให้เราเอา base64 ที่ได้ในตอนแรกมาใส่ตรง tls.crt และ tls.key
ถ้าต้องการจะ Replace Cert เดิม ให้ใส่ name และ namespace ให้ตรงกันของเดิมนะครับ
จากนั้นก็ save และ apply ครับ
ส่วน Ingress เราก็ใส่ secretName ลงในส่วนของ tls ดูชื่อให้ตรงกันนะครับ
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: tls-example-ingress
spec:
tls:
- hosts:
- sslexample.foo.com
secretName: testsecret-tls
rules:
- host: sslexample.foo.com
http:
paths:
- path: /
backend:
serviceName: service1
servicePort: 80
อันนี้เป็นตัวอย่างของผมนะครับ
แค่นี้ก็เสร็จแล้วครับ ผมมีตัวอย่างการ Replace ให้ดูข้างนี้ครับ
อันนี้ Cert ใบเดิมครับ สังเกตุตรง Expires: 10:19:24
ทำการขอ Cert ใหม่ และ Apply ขึ้น Kube
ดูใน Log ของ Ingress controller จะเจอว่า secret axus-dev/letnc-tls was updated
ลองเช็ค Cert อีกที จะเห็นว่าเป็นใบใหม่แล้ว Expires: 10:24:19
โดยที่ถ้าชื่อ secret ตรงกับของเดิมที่ใช้ใน Ingress ก็จะอัพเดทให้เองครับ