18 декабря 2025 Linux


Для тестирования докер-сварн-клустера создадим небольшой микросервис и разместим его в клустере

sysinfo/Dockerfile 

# Dockerfile
FROM python:3.12-slim

WORKDIR /app
COPY app.py .

# Устанавливаем flask
RUN pip install flask psutil

EXPOSE 5000
CMD ["python", "app.py"]

sysinfo/app.py

from flask import Flask, jsonify
import socket
import os
import psutil  # для более удобного uptime и нагрузки

app = Flask(__name__)

@app.route('/info')
def info():
    uptime_seconds = psutil.boot_time()
    # Или просто через /proc/uptime
    with open('/proc/uptime', 'r') as f:
        uptime_sec = float(f.readline().split()[0])

    return jsonify({
        "hostname": socket.gethostname(),
        "ip_addresses": [
            addr[4][0] for addr in socket.getaddrinfo(socket.gethostname(), None)
            if addr[0] == socket.AF_INET
        ],
        "uptime_seconds": uptime_sec,
        "uptime_human": str(__import__('datetime').timedelta(seconds=int(uptime_sec))),
        "cpu_load": psutil.getloadavg(),
        "memory_percent": psutil.virtual_memory().percent
    })

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Это обычный сервис, отдающий свои имена, адрес и время работы. Затем его нужно разметить в докер-регистре так чтобы он был доступен всем нодам клустера

docker build -t  registry.breys.com:443/ffsdmad/node-info:latest .
docker push  registry.breys.com:443/ffsdmad/node-info:latest

Теперь нужно заставить сварн создать новый сервис (опция --with-registry-auth позволит испольвать авторизацию в частном регистре)

docker service create   --name node-info   --mode global   --publish \
mode=host,target=5000,published=5000   --with-registry-auth \
registry.breys.com:443/ffsdmad/node-info:latest