deimosfr.coreos-container-linux

Ansible CoreOS Container Linux Rolle

Diese Rolle bootet ein komplettes CoreOS-Cluster mit Cloudinit und/oder Ignition. Sie unterstützt auch das Upgrade der Cloudinit-Konfiguration.

Anforderungen

Diese Rolle benötigt Python, da es standardmäßig nicht in CoreOS vorhanden ist. Du kannst deimosfr.coreos-ansible verwenden, um es zu installieren.

Rollenvariablen

## CoreOS

# Wähle den CoreOS-Kanal zwischen stabil, beta oder alpha
coreos_channel: "stable"
# Generiere ein Token: https://discovery.etcd.io/new?size=3
coreos_token: "füge hier dein Token ein"
# Wähle die Neustartstrategie: etcd-lock, reboot und off
coreos_reboot_strategy: "off"

# Nur Konfigurationsdateien lokal generieren, nicht bereitstellen (nützlich, wenn du keine Verbindung herstellen kannst)
coreos_generate_only: false

# Lade das Bild lokal herunter, um es nicht für jeden Knoten herunterzuladen
coreos_image_offline: false
# Setze die offline Version von CoreOS (nicht "current" im Offline-Modus verwenden)
coreos_image_version: '1409.7.0'
# Setze den zu ladenden Bildnamen
coreos_image_name: 'coreos_production_ami_image.bin.bz2'
# Definiere die URL der Quelle für den lokalen Download des Bildes
coreos_image_src_url: "https://{{coreos_channel}}.release.core-os.net/amd64-usr/{{coreos_image_version}}"
# Verwende diese URL, um CoreOS zu installieren
coreos_image_base_url: "https://{{coreos_channel}}.release.core-os.net/amd64-usr"

# Setze den Rollenpfad für den lokalen Speicher
coreos_role_path: "{{playbook_dir}}/../../deimosfr.coreos-ansible"

# Definiere dein öffentliches Interface und IP
coreos_public_ip: "{{ansible_default_ipv4.address}}"
coreos_public_if: "{{ansible_default_ipv4.interface}}"
# Definiere dein privates Interface und IP
coreos_private_ip: "{{priv_ip}}"
coreos_private_if: "{{priv_if}}"

# Definiere ein dediziertes Subnetz für die Kommunikation von Containern
coreos_flanneld_subnet: "10.1.0.0/16"

# Füge Metadaten für den Dienstet hinzu
coreos_fleet_metadata: "cluster=dev"

# Wenn wahr, wird der Server gestartet (Daten können verloren gehen),
# andernfalls werden Konfigurationsdateien generiert
coreos_launch_bootstrap: true
coreos_cloudinit_check_syntax: true
coreos_device_install: "/dev/sda"
coreos_install_additional_options: ""
coreos_eject_cd_before_reboot: true
coreos_reboot_after_bootstrap: true

# Generierte Ignition- und Cloudinit-Konfigurationen ausgeben
coreos_dump_ignition_cloudinit_config: true
coreos_dump_ignition_cloudinit_dest: "{{coreos_role_path}}/files/generated_configs"

# Wähle die Zeitzone
coreos_timezone: "UTC"

# CoreOS Toolbox-Image-Typ
coreos_toolbox_docker_image: "debian"
coreos_toolbox_docker_tag: "stable"

# Ignition
coreos_bootstrap_ignition: false
coreos_ignition:
  ignition:
    version: "2.0.0"
  storage:
    disks:
      - device: "/dev/sdb"
        wipeTable: true
        partitions:
          - label: "data.0"
            number: 1
            size: 0
            start: 0
      - device: "/dev/sdc"
        wipeTable: true
        partitions:
          - label: "data.1"
            number: 1
            size: 0
            start: 0

# Cloudinit
coreos_bootstrap_cloudinit: true
coreos_cloudinit:
  hostname: "{{inventory_hostname}}"
  coreos:
    update:
      group: "{{coreos_channel}}"
      reboot-strategy: "{{coreos_reboot_strategy}}"
    flannel:
      interface: "{{coreos_public_ip}}"
    units:
    - name: [email protected]
      command: start
      enable: true
    - name: etcd-member.service
      command: start
      enable: true
      drop-ins:
        - name: 40-etcd-cluster.conf
          content: |
            [Service]
            Environment="ETCD_IMAGE_TAG=v3.2.4"
            Environment="ETCD_ADVERTISE_CLIENT_URLS=http://{{priv_ip}}:2379"
            Environment="ETCD_DISCOVERY=https://discovery.etcd.io/{{coreos_token}}"
            Environment="ETCD_INITIAL_ADVERTISE_PEER_URLS=http://{{priv_ip}}:2380"
            Environment="ETCD_LISTEN_CLIENT_URLS=http://127.0.0.1:2379,http://{{priv_ip}}:2379"
            Environment="ETCD_LISTEN_PEER_URLS=http://{{priv_ip}}:2380"
    - name: flanneld.service
      enable: true
      command: start
      drop-ins:
      - name: 50-network-config.conf
        content: |
          [Service]
          ExecStartPre=/usr/bin/etcdctl set /coreos.com/network/config '{ "Network": "{{coreos_flanneld_subnet}}" }'
    - name: prepare-data-drive.service
      command: start
      enable: true
      content: |
        [Unit]
        Description=Vorbereiten des Datenträgers
        After=dev-sdb.device
        After=dev-sdc.device
        Requires=dev-sdb.device
        Requires=dev-sdc.device
        ConditionPathExists=!/dev/md0
        [Service]
        Type=oneshot
        RemainAfterExit=yes
        ExecStart=/usr/sbin/wipefs -f /dev/sdb
        ExecStart=/usr/sbin/parted -s -a opt /dev/sdb mklabel gpt -- mkpart primary ext4 2048s -1
        ExecStart=/usr/sbin/parted -s /dev/sdb align-check optimal 1
        ExecStart=/usr/sbin/parted -s /dev/sdb set 1 raid on
        ExecStart=/usr/sbin/wipefs -f /dev/sdc
        ExecStart=/usr/sbin/parted -s -a opt /dev/sdc mklabel gpt -- mkpart primary ext4 2048s -1
        ExecStart=/usr/sbin/parted -s /dev/sdc align-check optimal 1
        ExecStart=/usr/sbin/parted -s /dev/sdc set 1 raid on
        ExecStart=/usr/sbin/mdadm --create --assume-clean --metadata=1.2 --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
        ExecStart=/usr/sbin/pvcreate -y /dev/md0
        ExecStart=/usr/sbin/vgcreate raid-vg /dev/md0
        ExecStart=/usr/sbin/lvcreate -l 100%FREE -n data raid-vg
        ExecStart=/usr/sbin/mkfs.ext4 -m 1 -F /dev/raid-vg/data
    - name: mnt-data.mount
      command: start
      enable: true
      content: |
        [Unit]
        After=prepare-data-drive.service
        Requires=prepare-data-drive.service
        [Mount]
        What=/dev/raid-vg/data
        Where=/mnt/data
        Type=ext4
        Options=rw,noatime,nodiratime,discard,data=ordered
    - name: "00-{{coreos_public_if}}.network"
      runtime: true
      content: |
        [Match]
        Name={{coreos_public_if}}
        [Network]
        DHCP=true
    - name: "00-{{coreos_private_if}}.network"
      runtime: true
      content: |
        [Match]
        Name={{coreos_private_if}}
        [Network]
        Address={{coreos_private_ip}}/24
    - name: iptables-restore.service
      command: start
      enable: true
    - name: settimezone.service
      command: start
      enable: true
      content: |
        [Unit]
        Description=Zeitzone setzen
        [Service]
        ExecStart=/usr/bin/timedatectl set-timezone {{coreos_timezone}}
        RemainAfterExit=yes
        Type=oneshot
    - name: systemd-modules-load.service
      command: restart
    - name: systemd-sysctl.service
      command: restart
    - name: systemd-timesyncd.service
      command: start
      enable: true
    - name: mdmonitor.service
      command: stop
      enable: false
    - name: docker.service
      command: start
      drop-ins:
        - name: 40-flannel.conf
          content: |
            [Unit]
            Requires=flanneld.service
            After=flanneld.service
            [Service]
            EnvironmentFile=/etc/kubernetes/cni/docker_opts_cni.env
    - name: docker-tcp.socket
      command: start
      enable: true
      content: |
        [Unit]
        Description=Docker Socket für die API
        After=mnt-data.mount
        Requires=mnt-data.mount
        [Socket]
        ListenStream=2375
        Service=docker.service
        BindIPv6Only=both
        [Install]
        WantedBy=sockets.target
  write_files:
  - path: "/home/core/.toolboxrc"
    owner: core
    content: |
      TOOLBOX_DOCKER_IMAGE={{coreos_toolbox_docker_image}}
      TOOLBOX_DOCKER_TAG={{coreos_toolbox_docker_tag}}
  - path: /etc/kubernetes/cni/docker_opts_cni.env
    content: |
      DOCKER_OPT_BIP=""
      DOCKER_OPT_IPMASQ=""
  - path: /etc/modules-load.d/nf.conf
    content: nf_conntrack
  - path: /etc/sysctl.d/ipv4_forward.conf
    content: net.ipv4.ip_forward=1
  - path: /etc/sysctl.d/swapiness.conf
    content: vm.swappiness=1
  - path: /etc/sysctl.d/overcommit_memory.conf
    content: vm.overcommit_memory=1
  - path: /etc/sysctl.d/max_map_count.conf
    content: vm.max_map_count=65535
  - path: /var/lib/iptables/rules-save
    permissions: 0644
    owner: root:root
    content: |
      *filter
      :INPUT ACCEPT [0:0]
      :FORWARD ACCEPT [0:0]
      :OUTPUT ACCEPT [0:0]
      -A INPUT -i lo -j ACCEPT
      -A INPUT -i {{coreos_private_if}} -j ACCEPT
      -A INPUT -i tap0 -p all -j ACCEPT
      -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
      -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
      -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
      -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
      -A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT
      -A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT
      -A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT
      -A INPUT -j DROP
      COMMIT
  users:
    - name: 'core'
      ssh-authorized-keys:
      - "dein rsa Schlüssel"

Beispiel-Playbook

Zuerst musst du ein Inventar ausfüllen. Um es einfach zu halten, benutze eine Hosts-Datei wie diese:

[local]
localhost

[coreos-masters]
core01.myfqdn.com pub_ip=222.2.1.199 priv_ip=172.17.8.101
core02.myfqdn.com pub_ip=222.2.1.198 priv_ip=172.17.8.102
core03.myfqdn.com pub_ip=222.2.1.197 priv_ip=172.17.8.103

[coreos-workers]
core04.myfqdn.com pub_ip=222.2.1.196 priv_ip=172.17.8.104
core05.myfqdn.com pub_ip=222.2.1.195 priv_ip=172.17.8.105
core06.myfqdn.com pub_ip=222.2.1.194 priv_ip=172.17.8.106

[coreos-nodes:children]
coreos-masters
coreos-workers

[coreos-nodes:vars]
ansible_ssh_user=core
ansible_python_interpreter="/opt/python/bin/python"
priv_if=enp0s8

Benutze dann ein Playbook wie dieses (vergiss nicht, die Variablen mit deinen aus dem Standardordner zu bearbeiten):

---

- name: coreos-ansible pypy
  hosts: localhost
  gather_facts: False
  tasks:
    - include: ../../deimosfr.coreos-ansible/tasks/ansible_prerequisites.yml
  vars:
    ansible_python_interpreter: "/usr/bin/python"
    coreos_role_path: "{{playbook_dir}}/../../deimosfr.coreos-ansible"

- name: CoreOS-Image im Offline-Modus
  hosts: localhost
  gather_facts: False
  tasks:
    - include: ../tasks/coreos_offline_image.yml
      when: coreos_image_offline
  vars:
    ansible_python_interpreter: "/usr/bin/python"
    coreos_role_path: "{{playbook_dir}}/.."
    coreos_image_offline: true
    coreos_image_version: '1185.5.0'
    coreos_image_name: 'coreos_production_image.bin.bz2'
    coreos_image_src_url: "https://stable.release.core-os.net/amd64-usr/{{coreos_image_version}}"

- name: coreos-ansible
  hosts: coreos-nodes
  user: core
  become: yes
  gather_facts: False
  roles:
    - deimosfr.coreos-ansible

# Zuerst die Master bereitstellen, um sicherzustellen, dass der Cluster bereit ist, bevor die Worker bereitgestellt werden
- name: coreos-bootstrap
  hosts: coreos-masters
  user: core
  become: yes
  roles:
    - deimosfr.coreos-container-linux
  vars:
    coreos_image_base_url: "http://222.2.1.152:8000/coreos_images"

- name: coreos-bootstrap
  hosts: coreos-workers
  user: core
  become: yes
  roles:
    - deimosfr.coreos-container-linux
  vars:
    coreos_image_base_url: "http://222.2.1.152:8000/coreos_images"

Bekannte Probleme

Wenn du die folgende Meldung erhältst: "Eine Startaufgabe läuft für Ignition (Festplatten)", liegt das daran, dass der aktuelle Server, auf dem du versuchst, Ignition auszuführen, bereits einen aktiven RAID enthält. Du musst es zuerst löschen, bevor du Ignition startest. Beispiel:

mdadm --stop /dev/md/<raidname>
mdadm --zero-superblock /dev/<deviceX>
mdadm --zero-superblock /dev/<deviceY>

Lizenz

GPLv3

Autor Informationen

Pierre Mavro / deimosfr

Über das Projekt

Ansible role to deploy CoreOS Container Linux

Installieren
ansible-galaxy install deimosfr.coreos-container-linux
Lizenz
gpl-3.0
Downloads
376
Besitzer
https://www.linkedin.com/in/pmavro/