Nont Banditwong

ช่วงที่ผ่านมาถึงแม้งานของผมจำเป็นการจัดการด้าน Infrastructure เป็นส่วนใหญ่ แต่ก็ต้องไปเกี่ยวข้องกับการทำ Load test ด้วย เนื่องจากหลายๆครั้งที่ทีม Dev ทำ Load test แล้ว response time หรือ throughput ไม่เป็นไปตามที่ตั้งใจไว้ก็ต้องไปช่วยดูว่าเกิดจากอะไร Dev หรือ QA ส่วนใหญ่จะใช้ Apache JMeter ในการทำ Load test แต่ส่วนตัวผมเวลาต้องการ reproduce ปัญหาด้าน infrastructure มักจะหาเครื่องมืออะไรที่ใช้ง่ายไม่ต้องติดตั้งยาก ไม่ต้องมี GUI เนื่องจากบางครั้งต้องย้ายเครื่องมือไปในหลายๆจุดเพื่อตัด factor ที่ไม่เกี่ยวข้องทิ้ง (ความจริงแล้ว JMeter ก็สามารถทดสอบโดยไม่ต้องใช้ GUI ได้แต่ต้องติดตั้ง JVM เพื่อใช้งาน)…

แสดงผล Test ของ K6 ด้วย Grafana และ InfluxDB
แสดงผล Test ของ K6 ด้วย Grafana และ InfluxDB

ในการติดตั้ง application server เกือบทุกตัวมักมีความจำเป็นต้องเพิ่มความปลอดภัยของการส่งผ่านข้อมูลผ่านเครือข่ายด้วย secure channel ที่เรามักได้ยินบ่อยๆเช่น SSL และ TLS เบื้องหลังการทำงานของสิ่งเหล่านี้อยู่ภายใต้หลักการของ Public Key Infrastructure หรือ PKI มาตรฐาน PKI เข้าใจได้ไม่ง่าย ต้องค่อยๆศึกษา และทดสอบจากการใช้งานจริงถึงจะทำให้เข้าใจได้มากขึ้น หลักการพื้นฐานสามารถศึกษาได้จาก บทความของ ETDA หรือบทความจากเว็บต่างประเทศหลายๆที่เขียนอธิบายไว้ได้ดีเช่น What is Public Key Infrastructure (PKI) by Securemetric หรือจะอ่านจากตัวมาตรฐาน rfc5280 — Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile ก็ได้เช่นกัน แต่ส่วนตัวผมก็รู้แค่ขั้นพื้นฐานก็เพียงพอสำหรับงานที่ใช้อยู่ในปัจจุบัน…

ใน web server เราสามารถเพิ่ม HTTP response header เพื่อควบคุมพฤติกรรมของ web application หรือบางครั้งเป็นมาตรฐานของฝั่ง security ที่ต้องการให้ web server response http header ที่ต้องการออกมาด้วย

สำหรับ Ingress Controller เราสามารถปรับแต่ง HTTP response header ผ่าน annotation ของแต่ละ Ingress resource ได้เอง เช่นถ้าต้องการให้ Ingress resource นั้น เพิ่ม X-Frame-Options: SAMEORIGIN ออกมาใน HTTP response header ด้วยเราสามารถกำหนด annotation ให้กับ Ingress resource ได้ตามตัวอย่าง

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/configuration-snippet: 'more_set_headers "X-Frame-Options:
SAMEORIGIN";'

name: ing-svc01
namespace: default
spec:
rules:
- host: www.example.com
http:
paths:
- backend:
serviceName: front
servicePort: 80
path: /
pathType: ImplementationSpecific

--

--

curl เป็น command นึงที่ใช้บ่อยมากทั้ง download ไฟล์ รวมถึง verify และ debug การทำงานของ web application

หลายวันก่อนมี app มาขึ้นใน Kubernetes cluster ก็มีการคุยถึงวิธีที่จะ expose service ออกไปนอก cluster ซึ่งถ้าเป็น HTTP/HTTPS ก็แนะนำให้ใช้ Ingress นี่ล่ะง่ายดี ถ้ายังไม่ได้จด domain ก็บอกวิธี test ไปว่าลองใช้ curl ตามนี้

$ curl -H "Host: my.domain.com" http://<worker node ip or LB vip>

สมมติ app เรามีชื่อ domain คือ my.domain.com ถ้าอยากจะทดสอบแบบเร็วๆว่า Ingress ทำงานได้ก็สามารถใช้คำสั่ง curl โดยระบุ flag -H ตามด้วย string Host: <ชื่อ host> แล้วก็ชี้ไปที่ IP ของ endpoint เช่น VIP ของ Load balance หรือ Worker node IP

วันนี้ทีม dev มาถามว่า set SSL ของ workload ที่ไหนดี เราก็เสนอไปว่าทำใน Ingress ก็ได้ set เสร็จแล้วก็ test แบบเดิม แต่คราวนี้เปลี่ยน endpoint เป็น https:// ผลคือ Ingress ไม่ไปเอา Certificate ที่เราเตรียมไว้ให้ แต่ดันไปเอา default certificate ของ nginx ingress controller มาใช้แทน

หลังหาอยู่นานก็ไปเจอว่าถ้าหากจะ test https command ที่ถูกต้องคือ

$ curl https://my.domain.com --resolve 'my.domain.com:443:<worker node ip or LB vip>'

--

--

Nont Banditwong

Nont Banditwong

Cloud Engineering Specialist, Software Developer, System Engineer, Photographer and Learner