D10.4 Rolling Updates & Scaling 🔄

Rolling Update με Ansible

tasks:

  # ── Rolling update ─────────────────────────
  - name: "🔄 Rolling update myapp service"
    community.docker.docker_swarm_service:
      name:    myapp
      image:   "myapp:{{ new_version }}"
      state:   present
      replicas: 4
      update_config:
        parallelism:    1        # ← 1 container κάθε φορά
        delay:          15s      # ← περίμενε 15s μεταξύ
        failure_action: rollback # ← αυτόματο rollback αν fail!
        monitor:        30s      # ← παρατήρηση 30s
        max_failure_ratio: 0
        order:          start-first  # ← νέο πριν σκοτωθεί παλιό
      rollback_config:
        parallelism:    0        # ← rollback όλα ταυτόχρονα
        delay:          0s
        failure_action: pause

  # ── Verify update ─────────────────────────
  - name: Wait for update
    ansible.builtin.command:
      cmd: >
        docker service inspect myapp
        --format "{{ '{{' }}.UpdateStatus.State{{ '}}' }}"
    register:     update_status
    changed_when: false
    until:        update_status.stdout in ['completed', 'paused', '']
    retries:      30
    delay:        10
    delegate_to:  manager-01

  - name: Αποτέλεσμα update
    ansible.builtin.debug:
      msg: "Update status: {{ update_status.stdout }}"

Scaling

tasks:

  # ── Scale up ──────────────────────────────
  - name: "📈 Scale myapp to {{ replicas }}"
    community.docker.docker_swarm_service:
      name:     myapp
      state:    present
      replicas: "{{ replicas | int }}"

  # ── Scale via command (γρηγορότερο) ───────
  - name: Scale service
    ansible.builtin.command:
      cmd: "docker service scale myapp={{ replicas }}"
    delegate_to:  manager-01
    changed_when: true
    when: scale_immediate | default(false)

  # ── Service status μετά scale ─────────────
  - name: Service status
    ansible.builtin.command:
      cmd: docker service ps myapp --format "table {{ '{{' }}.Name{{ '}}' }}\t{{ '{{' }}.CurrentState{{ '}}' }}\t{{ '{{' }}.Node{{ '}}' }}"
    register:     service_status
    changed_when: false
    delegate_to:  manager-01

  - name: "📊 Service Status"
    ansible.builtin.debug:
      msg: "{{ service_status.stdout_lines }}"

Manual Rollback

tasks:

  # ── Rollback αν κάτι πήγε στραβά ──────────
  - name: " Rollback myapp service"
    ansible.builtin.command:
      cmd: docker service rollback myapp
    delegate_to:  manager-01
    changed_when: true
    when: trigger_rollback | default(false)

Σύνοψη D10.4

Rolling Updates & Scaling
│
├── update_config:
│   ├── parallelism: 1    → 1 container κάθε φορά
│   ├── delay: 15s        → αναμονή μεταξύ
│   ├── failure_action: rollback → αυτόματο rollback
│   └── order: start-first → zero-downtime
│
├── Scaling:
│   └── replicas: N → scale up/down
│
└── Rollback:
    └── docker service rollback <service>