ที่ให้ไว้:
- ฉันมีบริการคอนเทนเนอร์ที่ส่งแพ็กเก็ต UDP ไปยังรายการองค์ประกอบเครือข่าย (เซิร์ฟเวอร์ซิงก์ syslog ของบุคคลที่สาม)
- องค์ประกอบเครือข่ายเป้าหมายแต่ละรายการระบุโดยที่อยู่ IP หมายเลขพอร์ตเป็นค่าคงที่ เหมือนกันสำหรับแต่ละโหนด
ฉันต้องสร้างสภาพแวดล้อมการทดสอบอย่างง่าย - เหมือนในกราฟด้านล่าง บริการหลักส่งข้อความ syslog บนกราฟเป็นชื่อ คอนเทนเนอร์ผู้ผลิต
.
ภาชนะทดสอบ
สามารถวางไข่ของ docker container ได้ง่าย ดังนั้นฉันจึงเลือกวางไข่ อัลไพน์/โซกัต: ล่าสุด
.
คำถามคือ:
- ฉันต้องส่งข้อโต้แย้งอะไรบ้าง
โซแคท
เพื่อให้การติดตั้งใช้งานได้?
- ฉันต้องดูแลอะไรอีก
ฉันลองชุดค่าผสมมากมาย โซแคท
หาเรื่องจนถึงตอนนี้ แต่ไม่มีโชค
กับ socat UDP-RECV:514 UDP-SENDTO:172.25.0.2:65354,bind=:1234
ฉันได้รับข้อความในคอนเทนเนอร์พร็อกซี แต่ไม่ได้รับข้อความในคอนเทนเนอร์ทดสอบ
ดูเหมือนว่าฉันขาดความรู้โดยรวม มีใครอธิบายได้บ้างว่ามันควรจะทำอย่างไร?
รหัสที่ฉันใช้ในคอนเทนเนอร์ทดสอบนั้นมีลักษณะดังนี้:
นำเข้าระบบปฏิบัติการ
แพลตฟอร์มนำเข้า
เกลียวนำเข้า
จากซ็อกเก็ตนำเข้าซ็อกเก็ต
นำเข้านักเทียบท่า
จากนักเทียบท่านำเข้า DockerClient
จาก docker.models.containers นำเข้าคอนเทนเนอร์
จาก docker.models.networks นำเข้าเครือข่าย
def create_proxy():
นักเทียบท่า_client: นักเทียบท่าไคลเอ็นต์ = นักเทียบท่า.จาก_env()
test_network: เครือข่าย = docker_client.networks.create(f'test_network_{os.environ.get("HOSTNAME")}')
testrunner_container: คอนเทนเนอร์ = docker_client.containers.get(platform.node())
testrunner_container.reload()
test_container_ip = testrunner_container.attrs['NetworkSettings']['Networks'][test_network.name]['IPAddress']
socket_ = socket.socket (ซ็อกเก็ต AF_INET, socket.SOCK_DGRAM)
socket_.bind(('', 0)) # ผูกกับพอร์ตในเครื่องแบบสุ่ม
_, test_container_port = socket_.getsockname()
proxy_port = 1234
socat_args = [
'-d', '-d', f'UDP-RECV:514', f'UDP-SENDTO:{test_container_ip}:{test_container_port},bind=:{proxy_port}',
]
proxy_container: คอนเทนเนอร์ = docker_client.containers.run(
'อัลไพน์/โซกัต:ล่าสุด',
socat_args,
ชื่อ='udp_proxy_container'
เครือข่าย = test_network.name
detach=จริง,
ลบ=จริง
)
proxy_container.reload()
proxy_ip = proxy_container.attrs['NetworkSettings']['Networks'][test_network.name]['IPAddress']
socket_ = socket.socket (ซ็อกเก็ต AF_INET, socket.SOCK_DGRAM)
socket_.bind(('', 0)) # ผูกกับพอร์ตในเครื่องแบบสุ่ม
socket_.connect ((proxy_ip, proxy_port))
socket_.settimeout(1)
def รับ_loop (คิว):
ในขณะที่ทรู:
พยายาม:
ข้อความ = socket_.recv (1024)
ถ้า b'STOP IT' ในข้อความ:
หยุดพัก
คิวต่อท้าย (ข้อความ)
ยกเว้น socket.timeout เป็น e:
log.error(f"{type(e).__name__} ในลูปรับของ Syslog stub: {e}")
msg_queue = []
receiver_thread = threading.Thread(target=receive_loop, args=(msg_queue,))
receiver_thread.daemon = จริง
receiver_thread.start()
# ... รหัสอื่น ๆ