Setup Nginx Ingress with Cert-Manager on Kubernetes

3 min readJan 28, 2020

ขั้นตอนการติดตั้ง 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]

--

--

Theerawat Kaewchote
Theerawat Kaewchote

No responses yet