Setup Nginx Ingress with Cert-Manager on Kubernetes
ขั้นตอนการติดตั้ง Nginx Ingress และ Cert Manager เพื่อจัดการ Certificates ใน Kubernetes
มาอีกเป็นบทความอีกแล้วครับ หลังจากเจอปัญหา cert manager ที่ใช้อยู่ version เก่าไปจะไม่สามารถต่ออายุ Cert ได้จึงต้องทำการลง version ใหม่ และติดปัญหาต่างๆจนทำให้ปวดหัว
แต่บทความนี้ผมจะอธิบายขั้นตอนการติดตั้งใหม่ทั้งหมด ส่วนปัญหานั้นผมจะสรุปไว้ด้านล่างนะครับ
Prerequisites
- Kubernetes cluster *Master version 1.13.11-gke.23 (GKE)
- Helm 3.0.0
- Domain สำหรับทดสอบ
มาเริ่มกันเลยครับ
เริ่มจากสร้าง สร้าง echoserver เพื่อมาทดสอบ
apiVersion: v1
kind: Service
metadata:
name: echoserver
spec:
ports:
- port: 80
targetPort: 8080
selector:
app: echoserver
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: echoserver
spec:
selector:
matchLabels:
app: echoserver
replicas: 2
template:
metadata:
labels:
app: echoserver
spec:
containers:
- name: echoserver
image: gcr.io/google-containers/echoserver:1.10
ports:
- containerPort: 8080
สร้าง namespace kubectl create ns ingress-nginx
จากนั้นลง ingress nginx โดยใช้ helm
helm install ingress-nginx stable/nginx-ingress -n ingress-nginx
จะได้ Loadbalancer ตามรูป
จากนั้น สร้าง Ingress เชื่อมกับ Service ของ echoserver
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: echoserver-ingress
spec:
rules:
- host: echoserver.trwkc.dev
http:
paths:
- backend:
serviceName: echoserver
servicePort: 80
ลองเข้า จะเห็นว่า certs แดง
จากนั้น สร้าง namespace kubectl create ns cert-manager
แล้วลง cert-manager ด้วย helm
# setup K8s
kubectl apply --validate=false \
-f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.13/deploy/manifests/00-crds.yaml# add repo cert-manager
helm repo add jetstack https://charts.jetstack.io# install cert-manager
helm install cert-manager --namespace cert-manager jetstack/cert-manager
จากนั้นให้ทำการ create Issuer
apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
namespace: cert-manager
spec:
acme:
# The ACME server URL
server: https://acme-v02.api.letsencrypt.org/directory
# Email address used for ACME registration
email: your_email_address_here
# Name of a secret used to store the ACME account private key
privateKeySecretRef:
name: letsencrypt-prod
# Enable the HTTP-01 challenge provider
solvers:
- http01:
ingress:
class: nginx
จากนั้น แก้ไข Ingress ดังนี้
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: echoserver-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
tls:
- hosts:
- echoserver.trwkc.dev
secretName: echo-tls
rules:
- host: echoserver.trwkc.dev
http:
paths:
- backend:
serviceName: echoserver
servicePort: 80
หลังจากอัพเดทเสร็จ มันจะทำการสร้าง secret tls ขึ้นมา และให้ลองเข้า host นั้นอีกรอบ ทาด้าาา !! เข้าได้แล้ว
จบแล้วครับสำหรับการติดตั้ง Ingress nginx และ Cert-Manager ส่วนต่อไปผมจะมาเล่าถึงปัญหาที่เจอมา
ปัญหาคือ
Cert Manager ที่ลงอยู่นั้นมันเก่าจนไม่สามารถ renew cert ให้ได้
จึงต้อง update version ซึ่ง version ที่ใช้อยู่นั้น 0.5.2 และ version ปัจจุบันคือ 0.13.0 จำเป็นต้องเปลี่ยนอะไรหลายๆอย่าง กว่าจะ migrate มาให้ใช้ 0.13.0 ได้
Helm version 3.0 ไม่สามารถ install บน K8s version 1.12.10-gke.17 ได้
ผมใช้ helm 3.0 ในการ install cert-manager v0.13.0 ใน GKE master version 1.12.10-gke.17 แต่ติดปัญหา validate บางอย่าง ไม่สามารถ install ได้ จึงต้อง downgrade helm ไปที่ version 2.14.1
ต้องไล่ลบ Services และ Resources ของ cert-manager version เก่า
เนื่องจาก cert-manager version ใหม่ นั้นมีการปรับ api-resource ใหม่ จาก certmanager.k8s.io เป็น cert-manager.io
ครับปัญหาหลักๆที่เจอก็มีเท่านี้ อาจจะเจอปัญหาที่บางคนอาจจะมีวิธีที่ง่าย แต่ต้องบอกไว้ก่อนครับ ผมค่อนข้างมือใหม่ งมหานานอยู่เหมือนกัน บทความนี้คงมีเพียงเท่านี้
ขอบคุณที่ติดตามครับ [I ❤ Bug]