โครงสร้างระบบ:
10.10.1.86
: โหนดหลัก Kubernetes
10.10.1.87
: Kubernetes ผู้ปฏิบัติงาน 1 โหนด; รักษาชีวิต
โหนดหลัก
10.10.1.88
: โหนดผู้ปฏิบัติงาน Kubernetes 2; รักษาชีวิต
โหนดสำรอง
10.10.1.90
: VIP, จะโหลดยอดไปที่ .87
& .88
; ดำเนินการโดย รักษาชีวิต
.
คลัสเตอร์ Kubernetes นี้เป็น dev env กำลังทดสอบการรวบรวมบันทึก netflow
สิ่งที่ฉันต้องการบรรลุคือ:
- บันทึกเราเตอร์ / สวิตช์ netflow ทั้งหมดส่งออกครั้งแรกไปที่
.90
- จากนั้นใช้
รักษาชีวิต
เพื่อโหลดบาลานซ์ (lb_ชนิด
: แนท
) ถึง .87
& .88
ซึ่งเป็นพนักงาน Kubernetes สองคน
- มี
โหนดพอร์ต
บริการจับทราฟฟิกเหล่านี้ไปยังคลัสเตอร์ Kubernetes และทำงานแยกวิเคราะห์ข้อมูลที่เหลือ
| {เครือข่ายระบบปฏิบัติการ} | {เครือข่าย Kubernetes}
K8s Worker -> filebeat -> logstash (การปรับใช้)
/
<ข้อมูล> -> [VIP] โหลดบาลานซ์
\
K8s Worker -> filebeat -> logstash (การปรับใช้)
- filebeat.yml (ได้ทดสอบแล้วว่าทราฟฟิกทุกอย่างเรียบร้อยดีหลังจากใช้ filebeat ดังนั้นฉันจึงใช้
ไฟล์
ส่งออกไปยังสาเหตุหลักที่แคบลง)
# cat filebeat.yml
filebeat.inputs:
- ประเภท: tcp
max_message_size: 10MiB
โฮสต์: "0.0.0.0:5100"
- ประเภท: udp
max_message_size: 10KiB
โฮสต์: "0.0.0.0:5150"
#output.logstash:
# โฮสต์: ["10.10.1.87:30044", "10.10.1.88:30044"]
ไฟล์เอาต์พุต:
เส้นทาง: "/tmp/"
ชื่อไฟล์: tmp-filebeat.out
Kubernetes
- Master และ Workers เป็น VM 3 เครื่องใน env ส่วนตัวของฉัน ไม่ใช่ผู้ให้บริการ GCP หรือ AWS รายใดเลย
- รุ่น:
#รุ่นkubectl
เวอร์ชันไคลเอนต์: version.Info{หลัก:"1", รอง:"21", GitVersion:"v1.21.0", GitCommit:"cb303e613a121a29364f75cc67d3d580833a7479", GitTreeState:"สะอาด", BuildDate:"2021-04-08T16:31: 21Z", GoVersion:"go1.16.1", คอมไพเลอร์:"gc", แพลตฟอร์ม:"linux/amd64"}
เวอร์ชันเซิร์ฟเวอร์: version.Info{หลัก:"1", รอง:"21", GitVersion:"v1.21.0", GitCommit:"cb303e613a121a29364f75cc67d3d580833a7479", GitTreeState:"สะอาด", BuildDate:"2021-04-08T16:25: 06Z", GoVersion:"go1.16.1", คอมไพเลอร์:"gc", แพลตฟอร์ม:"linux/amd64"}
# cat logstash.service.yaml
api เวอร์ชัน: v1
ชนิด:บริการ
ข้อมูลเมตา:
ชื่อ: บริการ logstash
ข้อมูลจำเพาะ:
ประเภท: NodePort
ตัวเลือก:
แอพ: logstash
พอร์ต:
- พอร์ต: 9514
ชื่อ: tcp-พอร์ต
พอร์ตเป้าหมาย: 9514
โหนดพอร์ต: 30044
- เมื่อข้อมูลเข้าสู่ Kubernetes ทุกอย่างก็ทำงานได้ดี
- มันเป็นยอดโหลดวีไอพีที่ไม่ได้ส่งต่อ
คอนเฟิร์ม Keepalive
ไฟล์คอนฟิกูเรชันสำหรับ Keepalive
global_defs {
router_id proxy1 # `proxy 2` ที่โหนดอื่น
}
vrrp_instance VI_1 {
ระบุ MASTER # `BACKUP` ที่โหนดอื่น
อินเทอร์เฟซ ens160
virtual_router_id41
ลำดับความสำคัญ 100 # `50` ที่อีกโหนด
advert_int 1
virtual_ipaddress {
10.10.1.90/23
}
}
virtual_server 10.10.1.90 5100 {
ดีเลย์_ลูป30
lb_algo rr
lb_kind แนท
โปรโตคอล TCP
การคงอยู่_หมดเวลา 0
เซิร์ฟเวอร์จริง 10.10.1.87 5100 {
น้ำหนัก 1
}
เซิร์ฟเวอร์จริง 10.10.1.88 5100 {
น้ำหนัก 1
}
}
virtual_server 10.10.1.90 5150 {
ดีเลย์_ลูป30
lb_algo rr
lb_kind แนท
โปรโตคอล UDP
การคงอยู่_หมดเวลา 0
เซิร์ฟเวอร์จริง 10.10.1.87 5150 {
น้ำหนัก 1
}
เซิร์ฟเวอร์จริง 10.10.1.88 5150 {
น้ำหนัก 1
}
ใช้งานได้ก่อนการตั้งค่าคลัสเตอร์ Kubernetes
- ทั้งคู่
.87
& .88
ได้ติดตั้ง รักษาชีวิต
, และ ร
โหลดบาลานซ์ (RoundRobin) ทำงานได้ดี (TCP และ UDP)
- หยุด
รักษาชีวิต
บริการ (systemctl หยุด Keepalive
) เมื่อจะตั้งค่าคลัสเตอร์ kubernetes ในกรณี
ปัญหาเกิดขึ้นหลังจากการตั้งค่าคลัสเตอร์ Kubernetes
- พบว่ามีเพียงโหนด MASTER เท่านั้น
.87
สามารถส่งต่อการรับส่งข้อมูลได้ VIP ไม่สามารถส่งต่อไปยังโหนดสำรองได้ .88
.
- ข้อมูลที่ส่งต่อจาก MASTER ถูกจับสำเร็จโดย kubernetes
โหนดพอร์ต
และการปรับใช้
โจทย์ทดสอบโดย เอ็นซี
:
เอ็นซี
: เฉพาะผู้ถือ VIP (โหนด MASTER) เท่านั้นที่สามารถส่งต่อทราฟฟิกได้ เมื่อใด ร
ส่งต่อไปยัง BACKUP จะแสดงหมดเวลา
- ยังทดสอบโดย
nc -l 5100
บนเซิร์ฟเวอร์ทั้งสอง โหนด MASTER เท่านั้นที่ได้รับผลลัพธ์
# echo "ทดสอบ" | nc 10.10.1.90 5100
# echo "ทดสอบ" | nc 10.10.1.90 5100
Ncat: การเชื่อมต่อหมดเวลา
# echo "ทดสอบ" | nc 10.10.1.90 5100
# echo "ทดสอบ" | nc 10.10.1.90 5100
Ncat: การเชื่อมต่อหมดเวลา
ข้อมูลบางอย่าง
# rpm -qa |grep keepalive
keepalive-1.3.5-19.el7.x86_64
# kubectl รับ pod -n kube-system
สถานะพร้อมชื่อเริ่มอายุใหม่
ผ้าดิบ-kube-controllers-b656ddcfc-wnkcj 1/1 วิ่ง 2 78d
ผ้าดิบโหนด vnf4d 1/1 วิ่ง 8 78d
ผ้าดิบโหนด xgzd5 1/1 วิ่ง 1 78d
ผ้าดิบโหนด zt25t 1/1 วิ่ง 8 78d
coredns-558bd4d5db-n6hnn 1/1 กำลังวิ่ง 2 78d
coredns-558bd4d5db-zz2rb 1/1 วิ่ง 2 78d
etcd-a86.axv.bz 1/1 วิ่ง 2 78d
kube-apiserver-a86.axv.bz 1/1 กำลังทำงาน 2 78d
kube-controller-manager-a86.axv.bz 1/1 กำลังทำงาน 2 78d
kube-proxy-ddwsr 1/1 กำลังรัน 2 78d
kube-proxy-hs4dx 1/1 วิ่ง 3 78d
kube-proxy-qg2nq 1/1 กำลังทำงาน 1 78d
kube-scheduler-a86.axv.bz 1/1 กำลังทำงาน 2 78d
ipvsadm
(ผลลัพธ์เดียวกันบน .87
, .88
)
# ipvsadm -ln
IP Virtual Server เวอร์ชัน 1.2.1 (size=4096)
Prot LocalAddress: ธงตัวกำหนดตารางเวลาพอร์ต
-> ที่อยู่ระยะไกล: น้ำหนักพอร์ตไปข้างหน้า ActiveConn InActConn
TCP 10.10.1.90:5100 rr
-> 10.10.1.87:5100 มาสค 1 0 0
-> 10.10.1.88:5100 มาสค 1 0 0
UDP 10.10.1.90:5150 rr
-> 10.10.1.87:5150 มาสค 1 0 0
-> 10.10.1.88:5150 มาสค 1 0 0
- เซลินุกซ์อยู่เสมอ
อนุญาต
- ถ้าหยุด
ไฟร์วอลล์
ยังไม่ทำงานเช่นกัน
ระบบ
ความแตกต่าง:
# ก่อน:
net.ipv4.conf.all.accept_redirects = 1
net.ipv4.conf.all.forwarding = 0
net.ipv4.conf.all.route_localnet = 0
net.ipv4.conf.default.forwarding = 0
net.ipv4.conf.lo.forwarding = 0
net.ipv4.ip_forward = 0
# หลังจาก
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.forwarding = 1
net.ipv4.conf.all.route_localnet = 1
net.ipv4.conf.default.forwarding = 1
net.ipv4.conf.lo.forwarding = 1
net.ipv4.ip_forward = 1
ไม่แน่ใจว่าตอนนี้สามารถเช็คอะไรเพิ่มเติมได้อีกหรือไม่ โปรดแนะนำ ขอบคุณ!