Access services running in Kubernetes cluster

จากตอนที่แล้วที่เราสร้าง Kubernetes cluster ไว้ใช้งานเรียบร้อยแล้ว ตอนนี้จะมาถึงการรับ traffic เข้าสู่ service ที่รันอยู่ภายใน cluster หรือที่เรียกกันว่า ingress

จากรูปจะเป็น Diagram คร่าวๆของ cluster ที่ผม deploy นะครับ Public network เข้ามาจะผ่าน Firewall และเข้าสู่ Load Balancer จาก Load Balancer ก็จะเข้าสู่ Kubernetes Ingress Node ซึงก็คือ Worker Node นั่นแหละครับ แต่เรากำหนดให้เป็นเครื่องที่คอยรับ traffic จากข้างนอกเข้ามา นอกจากนี้จะเห็นว่ามี Internal Ingress ด้วย Internal Ingress จะเหมือนกับ ingress ปกติ แต่จะอยู่ใน Private Network สำหรับรัน Application ภายใน ไม่ต้องการให้เข้าถึงได้จากข้างนอก อย่างเช่น API, Monitoring, Staging version ของ app ก่อนจะ release ขึ้น Production

เริ่มต้นกันที่ Ingress สำหรับ traffic จากข้างนอก เราจะ deploy ingress-nginx ซึ่งถือว่าเป็น ingress controller มาตรฐาน วิธีการติดตั้งสามารถ curl yaml จาก github เข้า kubectl ได้เลย

curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/namespace.yaml \
    | kubectl apply -f -

curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/default-backend.yaml \
    | kubectl apply -f -

curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/configmap.yaml \
    | kubectl apply -f -

curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/tcp-services-configmap.yaml \
    | kubectl apply -f -

curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/udp-services-configmap.yaml \
    | kubectl apply -f -
curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/rbac.yaml \
    | kubectl apply -f -

curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/with-rbac.yaml \
    | kubectl apply -f -

พอเสร็จแล้ว เราก็ edit service ingress-nginx ให้ไป listen บนเครื่องที่เรากำหนดให้เป็น Ingress Node โดยใส่ externalIPs เหมือนกับตอนที่เราแก้ dashboard ในตอนที่แล้ว โดยจะแก้ผ่าน kubectl edit หรือ dashboard ก็ได้ครับ

เสร็จแล้ว port 80, 443 ก็จะไป listen อยู่ที่เครื่อง Ingress Node รองรับการเชื่อมต่อจาก Load Balancer อีกที

เมื่อเราจะ deploy service ที่เข้าได้จากภายนอก ก็สามารถ deploy ingress เข้าสู่ service ได้เลย โดยใน ingress yaml ให้ใส่ annotations: kubernetes.io/ingress.class: “nginx”

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: echoserver
  namespace: echoserver
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: echo.example.com
    http:
      paths:
      - path: /
        backend:
          serviceName: echoserver
          servicePort: 80

จากตัวอย่างข้างบน เราจะสามารถเข้าสู่ service echoserver จากภายนอกด้วย domain echo.example.com ได้แล้ว

จริงๆเราสามารถ deploy nginx-ingress-controller ได้มากกว่า 1 โดยการเติม args — ingress-class=<class-name> เช่น — ingress-class=nginx-internal สำหรับใช้ภายใน เวลาเราจะ deploy ingress ก็ใส่ค่า kubernetes.io/ingress.class: “nginx-internal” เข้าไปแทน

แต่ใน cluster ที่ผมใช้จะ deploy traefik เข้าไปเป็น internal ingress แทน nginx-ingress เนื่องจากใช้ทรัพยากรน้อยกว่า และทำงานได้เหมือนกัน แม้ว่าประสิทธิภาพจะด้อยกว่าเล็กน้อย

การติดตั้งก็ง่ายๆคล้ายกับ nginx-ingress สามารถดูเพิ่มเติมได้ที่ https://docs.traefik.io/user-guide/kubernetes/

kubectl apply -f https://raw.githubusercontent.com/containous/traefik/master/examples/k8s/traefik-rbac.yaml
kubectl apply -f https://raw.githubusercontent.com/containous/traefik/master/examples/k8s/traefik-deployment.yaml

จากนั้นก็เหมือนเดิมครับ แก้ service traefik-ingress-service ให้ไป listen เครื่องที่เป็น internal ingress โดยต้องเป็นเครื่องที่ไม่ได้อยู่หลัง load balancer

วิธีการใช้งานก็คล้ายๆเดิมครับ เปลี่ยน kubernetes.io/ingress.class: ให้เป็น traefik

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: echoserver
  namespace: echoserver
  annotations:
    kubernetes.io/ingress.class: "traefik"
spec:
  rules:
  - host: echo.example.com
    http:
      paths:
      - path: /
        backend:
          serviceName: echoserver
          servicePort: 80

จากนั้น map domain เข้ากับ IP ของ internal ingress ก็จะสามารถเข้าถึง service จากภายในได้แล้วครับ และไม่ต้องกลัวว่า service เหล่านี้จะถูกโจมตีจากข้างนอก

เราสามารถเข้า IP_IntIngress:8080 เพื่อดู Dashboard ได้ ใน Dashboard จะมีข้อมูล status ให้ครับ รวมถึง rules ต่างๆ

เบื้องต้นก็ประมาณนี้ครับ สำหรับการ deploy ingress controller ในการรับ traffic จากภายนอกเข้าสู่ service ที่อยู่ใน cluster