How to apply Private Service Connect (PSC) with Apache Kafka

Tanakrit Kongneing
CJ Express Tech (TILDI)
5 min readJan 4, 2024

ในฐานะผู้ให้บริการข้อมูล การปกป้องข้อมูลให้มีความปลอดภัยก็เป็นส่วนหนึ่งในหน้าที่ที่ต้องทำ หลีกเลี่ยงไม่ได้เลยว่าในยุคที่ข้อมูลไหลไวยิ่งกว่าสายน้ำ การที่เราส่งข้อมูลสำคัญผ่าน Network ที่เป็น Public อาจตกเป็นที่หมายตาของผู้ไม่หวังดีในอินเตอร์เน็ท วันนี้ผมจะมาสอนการเพิ่มเกราะป้องกันอีกชั้นให้กับ Apache Kafka ด้วยการนำ Private Service Connect (PSC) มาใช้ร่วมกัน

Table of contents

  • ปัญหาของ Cross VPC Connectivity
  • Private service connect (PSC) คืออะไร
  • การทำงานของ Apache Kafka
  • ตัวอย่างการสร้าง PSC สำหรับ Apache Kafka
  • Conclusion สรุปสาระสำคัญ

ปัญหาของ Cross VPC Connectivity

สิ่งค้นพบจากการทำงานร่วมกันกับหลายๆทีมในบริษัท พบว่า ถึงแม้จะอยู่ภายใต้ Organisation เดียวกัน แต่คนละ GCP Project กัน การที่จะใช้งาน Service ที่แต่ละทีมสร้างขึ้นมาได้นั้น ก็ยังคงมีความยุ่งยากในการทำอยู่มาก

Pain point หลักของ Cross VPC Connectivity คือ Service ที่อยู่บน Private VPC จะไปใช้ Service อื่นนอก Network ของตัวเอง ทำได้ยาก ต้องมีขั้นตอนเพิ่มเติมเยอะ แต่ถ้าถามว่าทำได้มั้ย คำตอบคือ ทำได้

ตัวอย่าง เช่น Team A ต้องการใช้ Service ของ Team B ซึ่งอยู่ใน Shared VPC ซึ่งถ้า Service ของ Team​ A อยู่ใน Shared​ VPC ก็จะสามารถเข้าถึง Service ได้ ผ่าน Routable traffic แต่ถ้า Service ของ Team​ A จำเป็นต้องอยู่ใน Private​ VPC จะทำยังไง

ปัญหาที่อาจจะเกิดขึ้น เช่น ip address อาจจะซ้ำกัน จากรูปด้านล่าง จะเห็นได้ว่า Team A มี Private VPC ที่มี ip address คือ 10.0.0.0/24 ส่วนฝั่ง Team B มี Shared VPC ไปยัง Service ที่มี ip address คือ 10.0.0.0/24 เช่นกัน

อ้าว ทำยังไงดีละ

Solution ที่เป็นไปได้ คือ Team A อาจจะต้องทำการ by pass ip address ของ Private VPC โดยการผ่าน Shared VPC อีกขั้นตอนหนึ่งก่อนไปยัง Shared VPC ของ Team B เท่านี้ปัญหาเรื่อง ip address ก็จะหมดไป แต่ว่าเราเรามี Solution ที่จะมาแนะนำในบทความนี้ซึ่งก็คือ Private Service Connect (PSC)

Private service connect (PSC) คืออะไร

Private Service Connect (PSC) คือ Service ของ Google Cloud Platform ที่ช่วยให้ผู้บริโภค (Consumer) สามารถเข้าถึง Service ที่ได้รับการจัดการแบบ Private จากภายในเครือข่าย VPC ของตน ในทำนองเดียวกัน ช่วยให้ผู้ให้บริการ (Producer) ที่มีการจัดการสามารถให้บริการเหล่านี้ในเครือข่าย VPC ที่แยกจากกันของตนเอง พูดสั้นๆคือ PSC เปรียบเสมือนตัวกลางที่ช่วยให้ Service สื่อสารกันได้ ถึงแม้จะไม่ได้อยู่ใน VPC Network เดียวกัน สามารถใช้ IP ของ Network ตัวเองได้เลย ไม่ต้อง bypass อะไรเพิ่มเติม เบื้องหลัง Google เป็นคนจัดการให้เอง

การทำงานของ Apache Kafka

Kafka หรือ Apache Kafka คือ Distributed streaming platform ที่คอยจัดการ Streaming Data เหมาะสำหรับการนำไปทำ real-time data pipeline หรือ streaming apps ต่างๆ

โดย Apache Kafka มีหลักการทำงานดังนี้

เริ่มต้นที่ Source หรือแหล่งที่มาของข้อมูล เช่น ฐานข้อมูล ทำการส่งข้อมูลไปยัง Kafka Producer จากนั้นจะถูกส่งไปยัง Broker เพื่อจัดการข้อมูลไปยัง Topic ต่างๆ จากนั้นส่งไป Kafka Consumer เพื่อไปยัง Sink หรือปลายทางของข้อมูลต่อ

Flow การทำงานคร่าวๆของ Apache​ Kafka

คำศัพท์สำคัญเกี่ยวกับ Apache Kafka

Source คือ connector ที่ใช้อ่าน/รับ message จากต้นทางหรือแหล่งที่มาของข้อมูล ไปยัง Kafka Topic

Producer คือ ผู้สร้าง message และส่งมาให้กับตัวกลาง

Broker คือ ตัวกลางในการรับ/ส่งข้อมูล ใน kafka

Topic คือ กลุ่มข้อมูลภายใน Kafka Cluster เพื่อใช้ในการแยกชุดของข้อมูล

Partition คือ การแบ่งข้อมูลใน Topic ออกเป็นกลุ่มๆอีกที

Consumer คือ ผู้รับ message มาจากตัวกลาง และ นำไปใช้ต่อ

Sink คือ connector ที่เราใช้เขียน/ส่ง message จาก Kafka topic ไปยัง ปลายทาง

ตัวอย่างการสร้าง PSC สำหรับ Apache Kafka

Disclaimer: ในบทความนี้จะเน้นฝั่งที่เป็น Endpoint และ Producer VPC เป็นหลัก โดย code จะใช้ gcloud เป็นหลักเนื่องจาก PSC อยู่บน Google Cloud Platform

สิ่งที่ต้องเตรียม

  • Kafka cluster
  • VPC Network
  • NAT Subnet for both bootstrap and broker
  • Internal Load Balancer for both bootstrap and broker
  • Service Attachment for both bootstrap and broker

มาเริ่มสร้างแต่ละชิ้นส่วนกันเลย

1. Kafka cluster

หากมี Kafka Cluster อยู่แล้วสามารถแก้ config cluster โดยเพิ่มส่วนนี้เข้าไปได้เลย

listeners:
- name: psc
port: 9095
type: loadbalancer
tls: true
authentication:
type: tls
configuration:
bootstrap:
annotations:
networking.gke.io/load-balancer-type: "Internal"
brokers:
- broker: 0
advertisedHost: kafka-brok-0.kafka-demo.io
annotations:
networking.gke.io/load-balancer-type: "Internal"

หากยังไม่มี สามารถสร้าง Kafka Cluster บน GKE ตาม GCP Document ได้คลิกที่นี่

2. VPC Network

gcloud compute networks create kafka-psc-demo \
--project=$prodproject \
--subnet-mode=custom

3. NAT Subnet for both bootstrap and broker

gcloud compute networks subnets create kafka-psc-subnet-bootstrap \
--project $prodproject\
--network kafka-psc-demo \
--region asia-southeast1 \
--range 10.16.0.0/24 \
--purpose PRIVATE_SERVICE_CONNECT
gcloud compute networks subnets create kafka-psc-subnet-broker \
--project $prodproject \
--network kafka-psc-demo \
--region asia-southeast1 \
--range 10.18.0.0/24 \
--purpose PRIVATE_SERVICE_CONNECT

3. Internal Load Balancer for both bootstrap and broker

สำหรับขั้นตอนการสร้าง Internal Load Balancer (ILB) เราจะเข้าไปใน GKE Cluster กันก่อนโดยใช้คำสั่งด้านล่าง

gcloud container clusters get-credentials $clustername \
--zone asia-southeast1-a \
--project $prodproject

จากนั้นนำ ip address load balancer ของทั้ง bootstrap และ broker ไปสร้าง Internal Load Balancer (ILB) บน GCP

ILBBOOT=$(kubectl get svc kafka-cluster-kafka-psc-bootstrap -n kafka -o jsonpath="{.status.loadBalancer.ingress[0].ip}")
ILBBROKER=$(kubectl get svc kafka-cluster-kafka-psc-0 -n kafka -o jsonpath="{.status.loadBalancer.ingress[0].ip}")

FORWARD_BOOT=$(gcloud compute forwarding-rules list --filter=IP_ADDRESS:$ILBBOOT --format="value(selfLink.basename())")
FORWARD_BROKER=$(gcloud compute forwarding-rules list --filter=IP_ADDRESS:$ILBBROKER --format="value(selfLink.basename())")

4. Service Attachment for both bootstrap and broker

gcloud compute service-attachments create bootstrap-service \
--region=asia-southeast1 \
--description="A service attachment for Kafka Bootstrap server" \
--enable-proxy-protocol=false \
--connection-preference=ACCEPT_AUTOMATIC \
--nat-subnets=kafka-psc-subnet-bootstrap \
--target-service=$FORWARD_BOOT
gcloud compute service-attachments create broker-service \
--region=asia-southeast1 \
--description="A service attachment for Kafka Broker server" \
--enable-proxy-protocol=false \
--connection-preference=ACCEPT_AUTOMATIC \
--nat-subnets=kafka-psc-subnet-broker \
--target-service=$FORWARD_BROKER

เมื่อทำทุกขั้นตอนครบแล้ว เราสามารถดู uri ของ service attachment ที่เราสร้างไว้ โดยไปที่ ค้นหา Private Service Connect ใน GCP จากนั้น ไปที่ tab Published services

ตัวอย่าง Service Attachment
ตัวอย่างรายละเอียด Service Attachment

โดยการนำไปใช้เราก็จะนำ Service Attachment ที่เป็น uri ไปใช้ต่อ โดยนำไปให้ฝั่ง Consumer VPC ใช้ในการต่อเข้ากับ PSC ของเรา

โดยสามารถเพิ่ม endpoint ได้โดยไปที่ ค้นหา Private Service Connect ใน GCP จากนั้น ไปที่ tab Connected endpoints จากนั้นกด + Connect Endpoint

การเพิ่ม endpoint (1)
การเพิ่ม endpoint (2)

นำ uri ของ service attachment ไปใส่ในช่อง target service โดยช่องที่เหลือก็ใส่ข้อมูลของ service อีกอันได้เลย เท่านี้ก็เรียบร้อยแล้วสำหรับการสร้าง PSC กับ Apache Kafka

Conclusion สรุปสาระสำคัญ

Private service connect (PSC) เป็น Service ของ Google Cloud Platform ที่ช่วยให้ทีมที่ทำงานอยู่บนคนละ GCP Project คนละ Network สามารถทำงานร่วมกันได้อย่างปลอดภัยและไม่ต้องดูแลจัดการอะไรให้ยุ่งยาก

การใช้ PSC จะแบ่งออกเป็นสองฝ่ายคือ Producer VPC และ Consumer VPC หากคุณเป็น Producer VPC คุณต้องสร้าง Service Attachment ขึ้นมา แต่หากคุณเป็น Consumer VPC คุณต้องใช้ uri ของ Service Attachment จาก Producer VPC เพื่อต่อเข้ากับ endpoint

การสร้าง Private Service Connect กับ Apache Kafka จะต้องสร้าง Service Attachment สำหรับ bootstrap และ broker รวมทั้งหมด 2 เส้นจากนั้นในฝั่ง Consumer VPC ก็ใช้ uri ของ Service Attachment ทั้ง 2 อันในการต่อเข้ากับ PSC เพื่อส่งข้อมูลมายัง Apache Kafka เท่านี้ก็เป็นอันเรียบร้อย

ถ้าคุณชอบบทความสามารถกดแชร์ ปรบมือ เพื่อเป็นกำลังใจให้ผู้เขียนด้วยนะครับ

หากสนใจอ่านบทความอื่นๆ เพิ่มเติม คลิกที่นี่

ติดตาม Facebook พวกเรา คลิกที่นี่

สนใจร่วมงานกับ CJ Express คลิกที่นี่

Reference

[1] https://github.com/GoogleCloudPlatform/kafka-private-service-connect

[2] https://docs.google.com/presentation/d/17EyWWkK-NTLPN04SWOVrvrCT1O6zmJZiP-e9UqTE-Q8/edit?usp=sharing

[3] https://codelabs.developers.google.com/cloudnet-psc-ilb#0

[4] https://cloud.google.com/vpc/docs/private-service-connect

--

--

Tanakrit Kongneing
CJ Express Tech (TILDI)

Analytics Engineer At CJ Express Group, Google Cloud Professional Data Engineer